Retour tableau alpha contenu dans une DLL pour Pure et VB

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ! :?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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 :?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !! :?
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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
Anonyme

Message 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 
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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:
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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.
Image
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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 "======================="
Image
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message 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
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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:
Image
Répondre