
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 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
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
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
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
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
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
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
Wend
bah oui, encore heureux.J'ai bien peur qu'a la fermeture de la DLL les variables en mémoire soit libérée
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 "======================="
Mais je pleure déjà tous les jours que les dieux fontkcc, programme en C, mon pauvre tu pleurerais.