Au secour, les copains sachant coder C et VB [Super RESOLU]

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 »

Merci ERIX, tu ne me connais pas bien mais moi j'comprend vite, mais faut m'expliquer drolement longtemps :D

Bon, je vais donc essayer, au debut, j'avais pas mis le zero, et ça me retournait des hieroglyphe et des carrés 8O
Je vais reessayer. :wink:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Mon bon ERIX, c'est bien ce que je crainiais :cry:
J'ai fait comme t'as dit, j'ai mis ton code de DLL et le code VB que j'ai mis juste au dessus, et voila ce qu'a fait de mon beau tableau tout neuf, ce language de m..... :?

Code : Tout sélectionner

hø€ø
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

ta boucle c'est normal qu'elle retourne 4 fois la même chose, l'adresse ne change pas.

J'ai regardé ton code et essaye ceci

Modifie ta Dll pour qu'elle retourne l'adresse de l'élément du tableau voulue, donc la Dll accepte un paramètre

Code : Tout sélectionner

Macro Ubound(Array)
     ; Rings sur le forum anglais
     ; http://www.purebasic.fr/english/viewtopic.php?t=8267
     (PeekL(Array-8))
EndMacro

ProcedureDLL.l LeTablo(element.l)
     Dim Tablo.s(3)  ; 3 = 4 éléments
     Tablo(0) = "Pure"
     Tablo(1) = "is "
     Tablo(2) = "your"
     Tablo(3) = "friend"
     ; on controle que la valeur n'est pas supérieure à la valeur max
     If element<0 Or element> = Ubound(Tablo())
          ProcedureReturn -1
     Else
          ProcedureReturn @Tablo(element)
     EndIf
EndProcedure 


essaye la boucle

Code : Tout sélectionner


 For i = 0 To 3 
  Debug.Print StringDLL(i)
 Next 
n'oublie pas de tester la valeur -1 si nécessaire
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Merci DENIS
Bah cette fois j'ai aucun resultat, meme plus mes hieroglyphes :cry:

Voila les codes, pour etre bien sur de ce que j'ai essayé:

Code : Tout sélectionner

Macro Ubound(Array) 
     ; Rings sur le forum anglais 
     ; http://www.purebasic.fr/english/viewtopic.php?t=8267 
     (PeekL(Array-8)) 
EndMacro 

ProcedureDLL.l LeTablo(element.l) 
     Dim Tablo.s(3)  ; 3 = 4 éléments 
     Tablo(0) = "Pure" 
     Tablo(1) = "is " 
     Tablo(2) = "your" 
     Tablo(3) = "friend" 
     ; on controle que la valeur n'est pas supérieure à la valeur max 
     If element<0 Or element> = Ubound(Tablo()) 
          ProcedureReturn -1 
     Else 
          ProcedureReturn @Tablo(element) 
     EndIf 
EndProcedure 

Code : Tout sélectionner

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString1 As Any) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Any) As Long
Private Declare Function LeTablo Lib "c:\EssaiTablo.dll" () As Long

Public Function StringDLL(Variable)
 Dim RetourAdresse As Long, RetourDll As String
 RetourAdresse = Variable
 RetourDll = Space$(lstrlen(RetourAdresse))
 lstrcpy RetourDll, RetourAdresse
 StringDLL = RetourDll
End Function

Private Sub Form_Load()
 
 Dim EssaihWnd As Long, RetourDll As Long
 EssaihWnd = LoadLibrary("c:\EssaiTablo.dll")
 
 For i = 0 To 3
  Debug.Print StringDLL(i)
 Next
 
 FreeLibrary (EssaihWnd)
 
End Sub
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Sur le forum VB, j'avais eu cette reponse.
Moi j'y ai rien compris (Comme dab).
Je pense que c'est du coté de VB que ça merde
enfin, tu passes par lstrcpy , qui copie une chaine..., pas un tableau. il faudrait utiliser VarPtr et CopyMemory dans ton cas
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Je n'ai pas VB, je vais essayer avec VBA sous excel (ca marchait bien sous PB) :D


oublies Varptr car tu cherches à récupérer une chaine et tu scrutes pour les voir toutes. De plus, je ne sais pas si les tableaux VB MS sont gérés comme ceux de PB, alors prudence, d'autant que les indices sous VB peuvent commencer à 0 ou 1.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

(ca marchait bien sous PB)
C'est la faute a FRED :?
Quelle idée de faire un language qui marche tout le temps, qui change presque pas de VB, sauf la couleur et encore on peut la changer.
On comprend plus apres pourquoi, les autres languages ne sont pas comme lui.
Je n'ai pas VB, je vais essayer avec VBA sous excel
Oui super idée, avec VBA ça devrait marcher pour les essais.
Si ça marche avec VBA c'est encore plus sur, parce que VBA c'est encore plus pourri que VB :? alors c'est peu dire
De plus, je ne sais pas si les tableaux VB MS sont gérés comme ceux de PB
Surement pas, si c'est simple et sur, alors bilou il aime pas :?
Regarde meme ce qu'en disent les pros du pot
déjà que les tableaux sont souvent un calvaire pour VB alors si en plus tu ne déclares ni ne types quoi que ce soit, çà risque de poser problème en effet
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

J'ai modifié ton code VB et ca marche sous VBA

J'ai relu la doc PB sur les Dll et il est dit en anglais (dommage c'est pas traduit) que :

Note about returning strings from DLL's:

If you want to return a string out of a DLL, the string has to be declared as Global before using it.

ce qui veut dire que la variable doit être globale


Voilà le code PB

Code : Tout sélectionner

Macro Ubound(Array)
     ; Rings sur le forum anglais
     ; http://www.purebasic.fr/english/viewtopic.php?t=8267
     (PeekL(Array-8))
EndMacro


ProcedureDLL.l LeTablo(element.l)
     Global Dim Tablo.s(3)  ; 3 = 4 éléments
     ; on controle que la valeur n'est pas supérieure à la valeur max
     Tablo(0) = "Pure"
     Tablo(1) = "is "
     Tablo(2) = "your"
     Tablo(3) = "friend"
     If element<0 Or element> = Ubound(Tablo())
          ProcedureReturn -1
     Else
          ProcedureReturn @Tablo(element)
     EndIf
EndProcedure 



et le code VB (regardes j'ai modifié la fonction Letablo pour qu'elle accepte le paramètre d'entrée)

Code : Tout sélectionner

Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString1 As Any) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Any) As Long
Private Declare Function LeTablo Lib "c:\EssaiTablo.dll" (ByVal element As Long) As Long

Public Function StringDLL(Variable)
 Dim RetourAdresse As Long, RetourDll As String
 RetourAdresse = Variable
 RetourDll = Space$(lstrlen(RetourAdresse))
 lstrcpy RetourDll, RetourAdresse
 StringDLL = RetourDll
End Function

Private Sub Form_Load()

 Dim EssaihWnd As Long, RetourDll As Long
   
 For i = 0 To 4
  Debug.Print StringDLL(LeTablo(i))
 Next
 
 FreeLibrary (EssaihWnd)
 
End Sub


Dernière modification par Anonyme2 le dim. 19/oct./2008 5:53, modifié 1 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

DENIS je t'aime !!!!!

C'etait "juste" ça 8O
Un petit global qui me traumatise depuis 2 jours :?

Dix milles merci
Ca fait du bien de savoir que quand on est vraiment dans la "oumpha" on a des copains qui sont la, .... tapi dans l'ombre pres a bondir pour sauver la vierge et l'orphelin (Moi c'est l'orphelin, hein !!!! :lol:)

J'etais désespéré, et ces CAIDS du forum VB qui ont le chic de rendre tout compliqué, alors que notre FREDO, il a tout fait pour que des burnes comme moi, puisse jouer presque dans la meme cour que vous (les vrais).

Allez encore un petit dernier Merci DENIS

Et aussi merci à tout ceux qui m'ont aidé dans ce POST.
J'en ai presque la larme à l'oeil.

Je vous souhaite une excelente soirée
Et que les dieux vous preservent, ainsi que PURE et son equipe 8)
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Sinon une petite erreur c'est la boucle for i = 0 to 4, c'est to 3 :D

le 4 c'était pour mes tests
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message par comtois »

avec la 4.30 tu peux te passer de cette macro

Code : Tout sélectionner

Macro Ubound(Array)
     ; Rings sur le forum anglais
     ; http://www.purebasic.fr/english/viewtopic.php?t=8267
     (PeekL(Array-8))
EndMacro 
Tu peux utiliser ArraySize().
C'est balot , la valeur retournée est fausse, il faut ajouter +1.

Code : Tout sélectionner

Dim toto(45)

Macro Ubound(Array)
     ; Rings sur le forum anglais
     ; http://www.purebasic.fr/english/viewtopic.php?t=8267
     (PeekL(Array-8))
EndMacro 

Debug Ubound(toto())
Debug ArraySize(toto())+1
http://purebasic.developpez.com/
Je ne réponds à aucune question technique en PV, utilisez le forum, il est fait pour ça, et la réponse peut profiter à tous.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

comtois a écrit :avec la 4.30 tu peux te passer de cette macro

Tu peux utiliser ArraySize().
C'est balot , la valeur retournée est fausse, il faut ajouter +1.
c'est pour ça que je préfère Ubound(Array) qui est à mon sens la vraie dimension, mais je ne polémique pas la-dessus, Arraysize est bien dans certains cas
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

@DENIS
Merci :wink:

@COMTOIS
Impecable, plus c'est simple et mieux ça me va :D
Deja qu'au dessus de 3 lignes je panique :lol:
Merci à toi aussi
Répondre