Page 1 sur 1

Passage tableau de string par son adresse [resolu]

Publié : mer. 17/juin/2009 11:26
par Kwai chang caine
Bonjour la famille :D

Alors voila, comme dab KCC il est parti dans une galere sans nom :?

Toujours dans son combat pour l'accouplement et l'elevage de petits PVB (Enfants de PB et de VB :lol:), je voudrais passer un tableau sous ce format.

Bon alors, je sais que vous allez me dire, que y'a plein de methode plus simple, depuis la 4.30 on peut passer l'array complet, ou encore autre chose.....
Mais moi, j'ai absolument besoin que ce soit sous cette forme, car j'ai déja passer 15 jours a rechercher un code pour passer un tableau de VB à PB et maintenant que ce code y marche pour VB, j'arrive pas a faire son equivalent en PB ...si c'est pas un monde ça :?

Je vous explique quand meme l'idée
Donc sans changer la forme du code, le voudrais avoir dans l'element "0" la longueur du tableau et dans les autres les adresses de chaques strings du dit tableau de string.

Mais la ça plante
Je doit encore me foutre dedans avec les adresses :cry:

Code : Tout sélectionner

Procedure Demande(*AdresseTablo)
 
 Dim Info.l(1)
 SizeOfArray.l = PeekL(*AdresseTablo)
 ReDim Info(SizeOfArray)
 CopyMemory(*AdresseTablo + 4, @Info(), SizeOfArray * 4)
 Debug Info(1)
 Debug Info(2)
 Debug Info(3)
 Debug PeekS(Info(1))
 Debug PeekS(Info(2))
 Debug PeekS(Info(3))
 
EndProcedure 

Longueur = 10
Dim Kcc.s(Longueur)
Kcc(0) = " "
PokeL(@Kcc(0), Longueur)
Kcc(1) = "Coucou"
Kcc(2) = "me"
Kcc(3) = "revoilou"

Demande(@Kcc(0))
Bonne journée

Publié : mer. 17/juin/2009 11:41
par djes
Sans parler des quelques bugs (poke d'un long n'importe où par exemple...), il existe la commande arraysize() qui pourrait te venir en aide.

Publié : mer. 17/juin/2009 11:55
par Kwai chang caine
Bonjour DJES :D

J'ai pensé que ce pouvait etre lui qui merdoie, car ce doit etre dans les premieres fois que j'ai un "POKE" dans mon code, d'habitude je les ai tous sur ma voiture :D
Mais meme en l'enlevant c'est "kifkif bourique" :cry:

Code : Tout sélectionner

Procedure Demande(*AdresseTablo)
 
 SizeOfArray = 10
 Dim Info.l(SizeOfArray)
 CopyMemory(*AdresseTablo + 4, @Info(), SizeOfArray * 4)
 Debug Info(1)
 Debug Info(2)
 Debug Info(3)
 Debug PeekS(Info(1))
 Debug PeekS(Info(2))
 Debug PeekS(Info(3))
 
EndProcedure 

Dim Kcc.s(10)
Kcc(0) = " "
Kcc(1) = "Coucou"
Kcc(2) = "me"
Kcc(3) = "revoilou"

Demande(@Kcc(0))
C'est peut etre encore pas possible, ce que je demande :roll:

Bon pour l'arraysize, je l'ai mis :D

Code : Tout sélectionner

Procedure Demande(*AdresseTablo)
 
 Dim Info.l(10)
 SizeOfArray.l = PeekL(*AdresseTablo)
 ReDim Info(SizeOfArray)
 CopyMemory(*AdresseTablo + 4, @Info(), SizeOfArray * 4)
 Debug Info(1)
 Debug Info(2)
 Debug Info(3)
 Debug PeekS(Info(1))
 Debug PeekS(Info(2))
 Debug PeekS(Info(3))
 
EndProcedure 

Dim Kcc.s(10)
Kcc(0) = " "
PokeL(@Kcc(0), ArraySize(Kcc()))
Kcc(1) = "Coucou"
Kcc(2) = "me"
Kcc(3) = "revoilou"

Demande(@Kcc(0))

Publié : mer. 17/juin/2009 12:28
par djes
En fait ta procédure demande est là pour vérifier que tout se passe bien, c'est ça?

Publié : mer. 17/juin/2009 12:49
par Kwai chang caine
Non non, ma procedure demande est la, pour lire un tableau de long correspondant aux adresses des elements du tableau de string correspondant.

Avec VB il envoie ces adresses avec l'instruction "StrPtr()"

Code : Tout sélectionner

Info(0) = arraysize de  Kcc.s()
Info(1) = Adresse de Kcc.s(1)
Info(2) = Adresse de Kcc.s(2)

Publié : mer. 17/juin/2009 12:49
par djes
Tiens! T'as rien vu, rien entendu, OK? 8)

Code : Tout sélectionner

Procedure Demande(*AdresseTablo)
 
 taille=PeekL(*AdresseTablo)
 Dim Info.s(taille)
 For i=0 To taille
  info(i)=""
 Next i

 CopyMemory(*AdresseTablo , @Info(), (taille * 4))

 Debug Info(1)
 Debug Info(2)
 Debug Info(3)
 
EndProcedure

Dim Kcc.s(10)
Kcc(0) = ""
PokeL(@kcc(),ArraySize(kcc()))
Kcc(1) = "Coucou"
Kcc(2) = "me"
Kcc(3) = "revoilou"

Demande(@Kcc())

Publié : mer. 17/juin/2009 13:05
par Kwai chang caine
Ouaaaahh !!!! ca marche, t'es un ange, merci 8)

Mais y'a un truc que je n'ai pas compris (etonnant non ??? :oops:), voir meme 2 pour etre plus precis

1/ Kcc() ce n'est pas la meme adresse que Kcc(0) ????

Je croyais que KCC(0) etait l'adresse du debut de tableau ??
J'avais encore tout pas bon ???? :roll:

2/ Et l'autre chose c'est que quand tu envoie a PB

Code : Tout sélectionner

Demande(@Kcc())
Ce n'est pas comme si tu envoyais un tableau des pointeurs du tableau dynamique de string ???

Publié : mer. 17/juin/2009 13:11
par Kwai chang caine
Ah ouaiiihh !!!
Je viens de voir que @Kcc() <> @Kcc(0)

Tout simplement en faisant ça :

Code : Tout sélectionner

Debug @Kcc() 
Debug @Kcc(0) 
Alors la.....ça m'trou le ..........................................................................................................................................moral :D
Je viens de faire 15 jours à me casser la minette dans des codes de ouf avec les BSTR, l'UNICODE et tout le bastringue, dont d'ailleur j'en ai pas compris la moitié :oops:

Et je n'avais pas vu que @Kcc() <> @Kcc(0) :oops:

Publié : mer. 17/juin/2009 13:33
par Kwai chang caine
Ou la la ...ça se bouscule dans le bro qui me sert de tete :?

J'ai pas tout compris.....mais je viens de pondre ce "zeu" qui me montre bien la difference entre l'adresse tableau et son premier enregistrement

Code : Tout sélectionner

Procedure Demande(*AdresseTablo) 
  
 taille=PeekL(*AdresseTablo)
  
 Dim Info.s(taille) 
 
 CopyMemory(*AdresseTablo , @Info(), (taille * 4)) 
 
 Debug @Info()
 Debug @Info(0)
 Debug Info(1) 
 Debug Info(2) 
 Debug Info(3) 
  
EndProcedure 

Dim Kcc.s(10) 
PokeL(@kcc(),ArraySize(kcc())) 
Kcc(1) = "Coucou" 
Kcc(2) = "me" 
Kcc(3) = "revoilou" 

Demande(@Kcc())

Publié : mer. 17/juin/2009 13:42
par Kwai chang caine
Bon....plus je reflechis et plus "j'comprend moins bien" :cry:

Cette adresse PokeL(@kcc(), ...) on a le droit d'ecrire dedans comme tu viens de faire ????
Elle est pas comme les toilettes à chaque fois que je veux y aller................... occupée ?????

C'est drolement de la bidouille d'aller ecrire dedans.....il va pas m'en vouloir mon PC d'aller fouiller dans ses petites culottes ????

Publié : mer. 17/juin/2009 14:31
par djes
Si :)

*Kcc() renvoie vers un tableau de pointeurs (*kcc(0), *kcc(1), etc...)
*Kcc(0) pointe vers le 1er élément
*kcc(1) 2nd

Bien sûr, aller poker dans les pointeurs n'est pas une très bonne idée, puisque tu vas sûrement empêcher la désallocation mémoire quand elle sera demandée par PB. Mais rien ne t'empêche de restaurer avant les dégâts que tu auras fait.
En outre, Windows doit sûrement libérer automatiquement toute la mémoire allouée par ton programme lorsque celui-ci se termine.

Publié : mer. 17/juin/2009 14:45
par Kwai chang caine
Bon d'accord..... en fin de compte si j'ai bien compris, j'suis "TOCKé" de "POKER" :lol:

KCC y ferais donc un bon createur de virus.......et peut etre bien le meilleur car il a aucune idée de l'antidote :D
Meme sous la torture y dirait rien :D

Quand tu met *Kcc(0) tu veut dire l'adresse de la variable Kcc(0) ???
Alors pourquoi tu l'ecris pas @Kcc(0) ???

Et encore autre chose.....super géniale ton idée de restaurer le bordel que j'ai foutu, je vais le faire tout de suite :D

=
=
=
=
=
=

Ah j'ai oublié un minuscule petit détail.................comment on fait :oops:

Publié : mer. 17/juin/2009 15:32
par djes
Quand je mets *kcc(0), ça veut dire le contenu de ce qu'il y a à cette adresse, c'est comme si je disais peekl(@kcc(0))

(désolé, l'habitude)

Pour restaurer, devine! Tu sauvegardes le truc que tu vas poker :)

Publié : mer. 17/juin/2009 16:05
par Kwai chang caine
D'accord, parce que c'est pas super simple ces histoires de pointeur de PEEK et PEEK et colegrame :?

Merci beaucoup de toute ta precieuse aide. 8)

Je commence un peu à y voir clair
Enfin comme un lundi matin au reveil ...hein !!! :lol:

Je te souhaite une excelente journée

Publié : jeu. 18/juin/2009 9:39
par djes
Merci, toi aussi