Parce que si j'avais bien compris normalement dans un tableau les variables sont à la suite les unes des autres
Retour tableau alpha contenu dans une DLL pour Pure et VB
- Kwai chang caine
- Messages : 6992
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
il suffit de prendre le debugger pour voir qu'il sagit d'un seul espace memoireKwai chang caine a écrit :Ce qui porterais à dire qu'une DLL ne classe pas un tableau dans la mémoire comme un exe![]()
Parce que si j'avais bien compris normalement dans un tableau les variables sont à la suite les unes des autres
dont les valeurs sont contigues (a la suite les unes des autres
donc en ayant le l'adresse du premier element, on devrai etre a meme de lire la suite !
- Kwai chang caine
- Messages : 6992
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Alors la, si toi tu sais pas, c'est pas moi qui peut t'expliquer
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
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
- Kwai chang caine
- Messages : 6992
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
tant que comme je te l'ai deja ecris, on ne pourra pas retourner plusieurs valeurs d'une procedure, on n'y arrivera pas ..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
et j'attends ça depuis plusieurs années !!
- Kwai chang caine
- Messages : 6992
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
- Kwai chang caine
- Messages : 6992
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
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
L'exe :
J'obtiens que les phrases 3 et 4 
J'ai bien peur qu'a la fermeture de la DLL les variables en mémoire soit libérée
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 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'ai bien peur qu'a la fermeture de la DLL les variables en mémoire soit libérée
- Kwai chang caine
- Messages : 6992
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Je viens de modifier et y'a rien a faire les trois premieres lignes n'apparaissent pas, quelqu'un sait pourquoi ??
Dll :
Exe :
Merci de votre aide
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 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
-
Anonyme
salut Tchang, je ne comprend pas trop se que tu veut faire, j'ai lu en diagonale le post
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 :
EXE :
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$()
EndProcedureEXE :
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 @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 DE TEST :
dans cette méthode tout est dans le 'Static'
voilou, en espérant que ce te soit utile 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 : 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
Wendvoilou, en espérant que ce te soit utile kcc
bah oui, encore heureux.J'ai bien peur qu'a la fermeture de la DLL les variables en mémoire soit libérée
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.
autre exemple (toujours sans globales) :
CODE DE LA DLL :
CODE TEST :
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 : 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 "======================="
- Kwai chang caine
- Messages : 6992
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
JE VOUS AIME !!!!!
Vous ne serez jamais a quel point
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
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
Tu veux que je n'ai plus assez d'eau pour faire pipi dans ma couche
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
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
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
Vous ne serez jamais a quel point
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
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
Mais je pleure déjà tous les jours que les dieux fontkcc, programme en C, mon pauvre tu pleurerais.
Tu veux que je n'ai plus assez d'eau pour faire pipi dans ma couche
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
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
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
- Kwai chang caine
- Messages : 6992
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere