Page 2 sur 4

Publié : mer. 20/juin/2007 9:28
par Kwai chang caine
Ce qui porterais à dire qu'une DLL ne classe pas un tableau dans la mémoire comme un exe :roll:

Parce que si j'avais bien compris normalement dans un tableau les variables sont à la suite les unes des autres

Publié : mer. 20/juin/2007 9:44
par Backup
Kwai chang caine a écrit :Ce qui porterais à dire qu'une DLL ne classe pas un tableau dans la mémoire comme un exe :roll:

Parce que si j'avais bien compris normalement dans un tableau les variables sont à la suite les unes des autres
il suffit de prendre le debugger pour voir qu'il sagit d'un seul espace memoire
dont les valeurs sont contigues (a la suite les unes des autres :D)
donc en ayant le l'adresse du premier element, on devrai etre a meme de lire la suite ! :?

Publié : mer. 20/juin/2007 9:55
par Kwai chang caine
Alors la, si toi tu sais pas, c'est pas moi qui peut t'expliquer :lol:

Est ce que tout le tableau est bien dans cet espace mémoire, il faudrait pouvoir le lire.
Ou peut etre il y a un caractere style "de fin" et qui arrette la lecture du tableau par PEEKS

J'ai tenté de poser la question sur le forum US
Si j'ai une réponse, je la donnerais ici.

En attendant si quelqu'un d'autre à une idée, elle est la bienvenue

Publié : mer. 20/juin/2007 10:15
par Kwai chang caine
Apparement c'est impossible de retourner un tableau d'apres TROND.

On peut juste le passer en argument mais pas le récupérer, c'est dingue cette histoire, il est bien ecrit quelque part ce tableau :?

Publié : mer. 20/juin/2007 10:52
par Backup
Kwai chang caine a écrit :Apparement c'est impossible de retourner un tableau d'apres TROND.

On peut juste le passer en argument mais pas le récupérer, c'est dingue cette histoire, il est bien ecrit quelque part ce tableau :?
tant que comme je te l'ai deja ecris, on ne pourra pas retourner plusieurs valeurs d'une procedure, on n'y arrivera pas ..

et j'attends ça depuis plusieurs années !! :?

Publié : mer. 20/juin/2007 11:00
par Kwai chang caine
C'est vrai que parfois ça fait rager que des demandes de cette importance ne soit pas prise en compte.

J'admire au plus haut point dieu, mais parfois il exagere :?

Peut etre que comme mylene farmer sa technique est de faire attendre pour etre sur que l'on se bouscule sur la derniere version :lol:

Publié : mer. 20/juin/2007 11:39
par Kwai chang caine
Et dis donc si on concatenais dans une variable du coté de la DLL les adresses mémoires de chaque ligne du tableau.
Puis on envois la variable au prg.
On deconcatene récupere chaque adresse mémoire et on lit la mémoire a chaque adresse.

J'essaye de faire ça depuis tout à l'heure et ça marche pas :?

La Dll

Code : Tout sélectionner

ProcedureDLL.s RempliTablo() 
 
 Dim Tablo.s(4) 
 AdresseTablo.s 

 For i = 0 To 4 
  
  Tablo(i) = "Phrase " + Str(i) 
  
  If Trim(AdresseTablo) = ""
   AdresseTablo = Str(@Tablo(i))
  Else 
   AdresseTablo + "/" + Str(@Tablo(i))
  EndIf
   
 Next 
 
 ProcedureReturn AdresseTablo 

EndProcedure 
L'exe :

Code : Tout sélectionner

Global Dim Tablo.s(5) 
Global Dim AdresseElement.l(4) 
Global AdresseLigne.l

If OpenLibrary(0, "dll_test.dll") 
 
 AdresseTablo.s = PeekS(CallFunction(0, "RempliTablo")) 
 
 For i = 1 To 10
 
  AdresseLigne = Val(StringField(AdresseTablo, i, "/"))
 
  If AdresseLigne <> 0
   
   Debug PeekS(AdresseLigne) 
   
  EndIf 
 
 Next
 
 CloseLibrary(0) 

EndIf 
J'obtiens que les phrases 3 et 4 8O
J'ai bien peur qu'a la fermeture de la DLL les variables en mémoire soit libérée :roll:

Publié : mer. 20/juin/2007 14:11
par Kwai chang caine
Je viens de modifier et y'a rien a faire les trois premieres lignes n'apparaissent pas, quelqu'un sait pourquoi ??

Dll :

Code : Tout sélectionner

ProcedureDLL.s RempliTablo() 
 
 Dim Tablo.s(100)  
 AdresseTablo.s 

 For i = 0 To 10 
  
  Tablo(i) = "Phrase " + Str(i) 
  
  If Trim(AdresseTablo) = ""
   AdresseTablo = Str(@Tablo(i))
  Else 
   AdresseTablo + "/" + Str(@Tablo(i))
  EndIf
    
 Next 
 
 MessageRequester("", AdresseTablo,0)  
 ProcedureReturn AdresseTablo 
 
EndProcedure 
Exe :

Code : Tout sélectionner

Global AdresseLigne.l

If OpenLibrary(0, "dll_test.dll") 

 RetourDll.l = CallFunction(0, "RempliTablo")
 AdresseTablo.s = PeekS(RetourDll) 
 
 For i = 1 To 10
 
  AdresseLigne = Val(StringField(AdresseTablo, i, "/"))
 
  If AdresseLigne <> 0
   
   Debug PeekS(AdresseLigne) 
   
  EndIf 
 
 Next
 
 CloseLibrary(0) 

EndIf 
Merci de votre aide

Publié : mer. 20/juin/2007 14:38
par Anonyme
salut Tchang, je ne comprend pas trop se que tu veut faire, j'ai lu en diagonale le post :oops:

si j'ai bien compris , tu as un tableau dans une dll
tu voudrais avoir accès au élément du tableau dans l'exe
pour ma part , je fait comme cela :


DLL :

Code : Tout sélectionner

Global Dim Tab$(10)


Tab$(0)  = "Bonjour"
Tab$(1)  = "je suis"
Tab$(2)  = "un tableau"
Tab$(3)  = "qui sert"
Tab$(4)  = "scritement"
Tab$(5)  = "a rien...."
Tab$(6)  = "bref,"
Tab$(7)  = "je ne sais pas "
Tab$(8)  = "quoi mettre"
Tab$(9)  = "dedans, alors"
Tab$(10) = "j'écrit des conneries"


ProcedureCDLL.l ReturnPtr()
ProcedureReturn Tab$()
EndProcedure

EXE :

Code : Tout sélectionner

Dim tablo.s(5)

If OpenLibrary(0, "dll.dll")
AdresseTablo.l = CallFunction(0, "ReturnPtr")


For element = 0 To 10
 *Ptr = PeekL(AdresseTablo+(element*4))
 Ligne$  = PeekS(*Ptr)
 Debug Ligne$
Next 

 CloseLibrary(0)

EndIf 

Publié : mer. 20/juin/2007 14:49
par Flype
@kcc

tout est normal, dans le comportement que tu décris.


dans ta proc RempliTablo() de ta dll,

tu déclare un tableau en local - dans la procedure !!!

ca implique quoi ?

ca implique que dès que ta procédure a fini son travail (quitte/return) le tableau est effacé de la mémoire.

dès lors l'accès est impossible.

ET C'EST NORMAL - PAS DE BUG PUREBASIC LA DEDANS !

il faut comprendre comment marche les dll, la mémoire, et tout et tout...

kcc, programme en C, mon pauvre tu pleurerais.




concernant une méthode de programmation pour pouvoir faire ce que tu demandes - UNE méthode comme une autre - on peux aussi allouer un bloc de mémoire etc... :

CODE DE LA DLL

Code : Tout sélectionner

ProcedureDLL.l MesPhrases()
  
  Protected i.l
  
  Static Dim phrase.s(100) ; Static garde en mémoire le tableau, même après que la procédure a fini son travail !
  
  For i = 0 To 99
    
    phrase(i) = "Phrase " + Str(i)
    
  Next
  
  ProcedureReturn @phrase()
  
EndProcedure
CODE DE TEST :

Code : Tout sélectionner

Import "test.lib"
  MesPhrases.l()
EndImport

Structure TABLEAU
  s.s[0]
EndStructure

*a.TABLEAU = MesPhrases()

i = 0

While *a\s[i]
  
  Debug *a\s[i]
  
  i + 1
  
Wend
dans cette méthode tout est dans le 'Static'
voilou, en espérant que ce te soit utile kcc :wink:

Publié : mer. 20/juin/2007 14:54
par Flype
J'ai bien peur qu'a la fermeture de la DLL les variables en mémoire soit libérée
bah oui, encore heureux.

mais pas seulement, une procedure ayant fini son travail libère aussi la mémoire des variables allouées dedans (.l, .s, dim, newlist, etc...)

et ce avant meme de libérer la librairie (closelibrary)...


SAUF AVEC STATIC.

Publié : mer. 20/juin/2007 15:23
par Flype
autre exemple (toujours sans globales) :

CODE DE LA DLL :

Code : Tout sélectionner

ProcedureDLL.l MesPhrases(*n.Long)
  
  Protected i.l
  
  Static Dim phrase.s(100) ; Static garde en mémoire le tableau, même après que la procédure a fini son travail !
  
  *n\l = 100 ; pour informer l'utilisateur du nombre d'éléments dans le tableau.
  
  For i = 0 To 99
    phrase(i) = "Phrase " + Str(i)
  Next
  
  ProcedureReturn @phrase()
  
EndProcedure

ProcedureDLL.l MesPhotos(n.l) ; avec un argument pour redimensionner le tableau.
  
  Protected i.l
  
  Static Dim photo.s(0) 
  
  Redim photo.s(n)
  
  For i = 0 To n - 1
    photo(i) = "Photo " + Str(i) + ".jpg"
  Next
  
  ProcedureReturn @photo()
  
EndProcedure
CODE TEST :

Code : Tout sélectionner

Import "test.lib"
  MesPhrases.l(*n)
  MesPhotos.l(n.l)
EndImport

Structure TABLEAU
  s.s[0]
EndStructure

*tab.TABLEAU

Debug "======================="

*tab = MesPhrases(@n)

For i = 0 To n - 1
  Debug *tab\s[i] 
Next

Debug "======================="

*tab = MesPhotos(8)

For i = 0 To 7
  Debug *tab\s[i] 
Next

Debug "======================="

*tab = MesPhotos(20)

For i = 0 To 19
  Debug *tab\s[i] 
Next

Debug "======================="

*tab = MesPhotos(5)

For i = 0 To 4
  Debug *tab\s[i] 
Next

Debug "======================="

Publié : mer. 20/juin/2007 17:25
par Kwai chang caine
JE VOUS AIME !!!!!

Vous ne serez jamais a quel point :D

J'ai passé toute la journée a me ronger les sang, pour pouvoir depuis ce matin 9h recuperer cette saloperie de tableau qui etait dans ma DLL :twisted:

J'y comprend rien, j'ai meme demandé au forum US et TROND m'a confirmé ce que DOBRO aussi croyait impossible.

Et la PAF !!! pas un, ni deux mais trois codes plus génials les uns que les autres.

Je suis vraiment tres fier de vous connaitre 8)
kcc, programme en C, mon pauvre tu pleurerais.
Mais je pleure déjà tous les jours que les dieux font :cry: :cry: :cry:
Tu veux que je n'ai plus assez d'eau pour faire pipi dans ma couche :lol:

Vous pourrez au moins avouer que cette fois je m'etais cassé la tete.
J'ai bien fait de venir voir la fin du film, il se finit bien :D

Sincerement et du fond du coeur merci
Vous ne pouvez pas, ou peut etre, ne vous rappellez plus, ce que ça peut faire de plancher toute une journée sur 10 lignes, sans rien en ressortir de bon le soir.

J'avais appris tout le fonctionnement des DLL rien que pour recuperer des données dedans, alors quand j'ai appris que Pure ne le faisait pas 8O
Je vous explique pas la commande de valium.

Mille merci a vous deux, ainsi qu'a DOBRO qui a galéré avec moi cet apm.
Je vous souhaite une excelente et divine fin de soirée

Votre eternel serviteur et admirateur KCC

Publié : mer. 20/juin/2007 17:30
par Kwai chang caine
PS :

@Cpl bator
Je ne sais pas si je te l'ai deja dit, mais il est rigolo ton pingoin.
Je l'aimait bien aussi le balaise militaire qui me clignait de l'oeil en aidant et defendant toujours son prochain :D

Publié : mer. 20/juin/2007 17:39
par Flype
Sincerement et du fond du coeur merci
Vous ne pouvez pas, ou peut etre, ne vous rappellez plus, ce que ça peut faire de plancher toute une journée sur 10 lignes, sans rien en ressortir de bon le soir.
ho que si, t'inquiète :lol: