Page 2 sur 4

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 11:31
par Kwai chang caine
Oui mais cette histoire de difference entre @a() et @a(0)...
C'est pas pareil...@a() est l'adresse du tableau et @a(0) est l'adresse du premier pointeur de string, non ??
Comme sur mon dessin :roll:

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 11:34
par djes
Oui c'est ça!

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 11:37
par flaith
@variable donne l'adresse de la variable en mémoire
peekl(@variable) récupère l'information qui pointe à l'adresse de cette variable

mouais, c'est pas clair non plus.... :roll:

**edit** djes a été plus rapide :wink:

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 11:39
par Kwai chang caine
flaith a écrit :@variable donne l'adresse de la variable en mémoire
peekl(@variable) récupère l'information qui pointe à l'adresse de cette variable

mouais, c'est pas clair non plus.... :roll:

**edit** djes a été plus rapide :wink:

Je vais craquer

Image

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 11:41
par Kwai chang caine
Sur mon dessin...ou je peux dessiner le PEEKL...pitié :(

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 11:49
par Backup

Code : Tout sélectionner

Dim a.s(4)

a(0)="riri"
a(1)="fifi"
a(2)="loulou"
a(3)="donald"

Debug a(0) ; affiche "riri"

Debug @a() ; affiche l'adresse de la table qui contient les adresses des elements du tableau
Debug PeekS(@a(0)) ; affiche "riri"
Debug PeekS(@a(2)) ; affiche "loulou"


Debug PeekS(PeekL(@a())) ; affiche riri

Debug PeekS(PeekL(@a()+1*4)) ; affiche fifi
Debug PeekS(PeekL(@a()+3*4)) ; affiche donald

il te faut voir @a() comme contenant une table d'adresse

chaque une des adresse de cette table pointe vers un element du tableau

lorsque tu fait

Code : Tout sélectionner

Debug PeekS(PeekL(@a()+3*4)) ; affiche donald
tu affiche le contenu chaine (premier peekS() ) , de l'adresse (peekl()) de l'emplacement
@a()+3*4 , soit la 4 eme adresse (le +3) de la table situé dans @a() :) (de 0 a 3 font 4 elements)

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 11:54
par flaith
Alors, on va reprendre le fameux CallDebugger :

Code : Tout sélectionner

Dim a.String(10)
a(0)\s = "Kcc 0"
a(1)\s = "Kcc 1"
a(2)\s = "Kcc 2"
a(3)\s = "Kcc 3"
a(4)\s = "Kcc 4"

CallDebugger

For i = 0 To 4
		Debug @a(i)
		Debug @a(0) + i * SizeOf(Integer)
		Debug PeekL(@a(0) + i * SizeOf(Integer))
		Debug PeekS(PeekL(@a(0) + i * SizeOf(Integer)))
		Debug ""
Next
Tu vas ensuite dans le menu "Débogueur" sélectionne "Voir les zones mémoires"
dans Etendue tu mets :

@a() puis @a(5) et clic sur afficher, tu dois avoir un truc de ce genre

Code : Tout sélectionner

003722E0  68 06 38 00 80 06 38 00 98 06 38 00 B0 06 38 00  h.8.€.8.˜.8.°.8.
003722F0  C8 06 38 00                                      È.8.
ton adresse de @a() ou @a(0) = $380668 (c'est inversé, c'est normal) et le dernier @a(4) = $3806C8

Met maintenant dans Etendue ces deux valeurs sous cette forme :
$380668 et $3806E0 et clic sur afficher, tu as donc maintenant :

Code : Tout sélectionner

00380668  4B 63 63 20 30 00 4B 63 00 00 00 00 00 00 00 00  Kcc 0.Kc........
00380678  03 00 03 00 00 01 0E 00 4B 63 63 20 31 00 4B 63  ........Kcc 1.Kc
00380688  00 00 00 00 00 00 00 00 03 00 03 00 00 01 0E 00  ................
00380698  4B 63 63 20 32 00 4B 63 00 00 00 00 00 00 00 00  Kcc 2.Kc........
003806A8  03 00 03 00 00 01 0E 00 4B 63 63 20 33 00 4B 63  ........Kcc 3.Kc
003806B8  00 00 00 00 00 00 00 00 03 00 03 00 00 01 0E 00  ................
003806C8  4B 63 63 20 34 00 00 90 00 00 00 00 00 00 00 00  Kcc 4..........
003806D8  25 01 03 00 00 10 00 00                          %.......
:mrgreen:

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 12:02
par Kwai chang caine
Bon ....je vais lire et relire et relire ce que vous venez de m'ecrire....
Ca fait beaucoup de chose pour ma petite tete :oops:
Merci et a tout a l'heure 8)

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 12:25
par flaith
flaith a écrit :

Code : Tout sélectionner

...
  Debug PeekL(@a(0) + i * SizeOf(Integer))
...
Regarde bien ce que donne le PeekL, tu verras qu'il te donne l'adresse de chaque texte de ton tableau
1er PeekL donne donc 380668, etc...

Code : Tout sélectionner

00380668  4B 63 63 20 30 00 4B 63 00 00 00 00 00 00 00 00  Kcc 0.Kc........
00380678  03 00 03 00 00 01 0E 00 4B 63 63 20 31 00 4B 63  ........Kcc 1.Kc
00380688  00 00 00 00 00 00 00 00 03 00 03 00 00 01 0E 00  ................
00380698  4B 63 63 20 32 00 4B 63 00 00 00 00 00 00 00 00  Kcc 2.Kc........
003806A8  03 00 03 00 00 01 0E 00 4B 63 63 20 33 00 4B 63  ........Kcc 3.Kc
003806B8  00 00 00 00 00 00 00 00 03 00 03 00 00 01 0E 00  ................
003806C8  4B 63 63 20 34 00 00 90 00 00 00 00 00 00 00 00  Kcc 4..........
003806D8  25 01 03 00 00 10 00 00                          %.......
Le PeekS récupère l'adresse récupérée par PeekL et converti ce qu'il trouve à cette adresse en String (ouf !!!)

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 13:07
par Kwai chang caine
Regarde bien ce que donne le PeekL, tu verras qu'il te donne l'adresse de chaque texte de ton tableau
1er PeekL donne donc 380668, etc...
Bon j'ai vu que le 1er PEEK donne bien comme tu dis.
Mais ce qui est dur a comprendre, c'est que
Quand on fait ta methode avec structure l'adresse de @a() = @a(0)
Quand on fait la mienne sans structure @a() <> @a(0)

C'est ça qui me fou dedans

Code : Tout sélectionner

Dim a.String(10)
a(0)\s = "Kcc 0"

Debug @a()
Debug @a(0)

Debug ""

Dim b.s(10)
b(0) = "Kcc 0"

Debug @b()
Debug @b(0)
Moi on m'a toujours dit que l'adresse du tableau @a() et l'adresse du premier element donc @a(0) n'avait rien a voir. :roll:

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 13:31
par flaith
En fait tu as 2 choses :

un tableau de structure [a\string] et un tableau a une dimension simple [b]
le tableau de structure se comporte différemment au niveau des adresses
Adresse du tableau de structure = adresse du 1er élément du tableau de structure

le tableau simple, l'adresse du tableau donne adresse du 1er élément du tableau
donc peekl(adresse de b()) = adresse du 1er élément du tableau :

Code : Tout sélectionner

PeekL(@b()) = @b(1)
(re ouf !!!)

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 13:59
par Kwai chang caine
Bon merci...et bah c'est encore plus compliqué que ce que je croyais :(
Je vais essayer de m'en sortir grace a tous ce que vous m'avez appris

Encore merci a tous 8)

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 15:09
par TazNormand
Représentes-toi la mémoire comme une commode (le meuble). la commode est ta variable a().
l'adresse de ta commode est disons "à droite en entrant dans la chambre", représentée par @a().
chaque tiroir de la commode est un emplacement mémoire : a(0)...a(n-1) n-1 parce qu'on commence la numérotation à 0
la position du tiroir sur la commode (tiroir du haut, du milieu, du bas), c'est le @a(0...n-1).

En clair, si tu sais que les slips sont dans le tiroir du haut càd le a(0), le contenu du tiroir haut c'est bien a(0), mais pour accéder à ce tiroir, admettons que tu sois "aveugle", tu cherche sa position en @a(0), donc en haut, ainsi de suite.

Si par contre tu n'es pas devant la commode, et que tu cherches où elle se trouve, ton indication c'est que cela se trouve dans la chambre, en @a().

Désolé de prendre un exemple aussi con, mais parfois, il est bon de se représenter de manière concrète des concepts aussi abstrait que la mémoire de l'ordinateur.

Si j'ai dit une ânerie, merci de me corriger

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 15:28
par TazNormand
Image

KCC : Chérie, où sont mes slips ?
Mme KCC : vas voir dans la commode dans la chambre en @a() !!!
KCC : je trouves pas !!!
Mme KCC : regardes dans le tiroir du haut en @a(0)
KCC : y a quoi dans ce tiroir ?
Mme KCC : Ben, tu te sors les doigts du c.., et tu regardes dedans par PEEKS(@a(0)), ou par l'adresse du tiroir PEEKS(PEEKL(@a()))
KCC : et mes chaussettes ?
Mme KCC : tu fais chi.., regardes les autres tiroirs PEEKS(@a(x)) ou PEEKS(PEEKL(@a()+numtiroir*4)
KCC : AH OK OK OK, mais ils sont où mes slips ?

Re: LES TABLEAUX :-(

Publié : mar. 06/oct./2009 15:54
par Kwai chang caine
C'est vrai ça ...y sont ou mes slips ??? :?

Merci de ton explication, qui me conviens tout a fait :D

Reste quand meme que la position de l'armoire est en @a() d'accord.
Le premier tirroir est bien en @a(0)

Certe @a(0) le tirroir est bien dans l'armoire @a(), mais un tirroir....c'est pas la meme chose qu'une armoire. :?
KCC il est inhibé du bulbe....mais y range encore pas ses slips dans le frigo
Et selon si c'est en structure ou bien normal et ben c'est la meme adresse ou non. 8O

Soldat a utilisé un doux euphemisme en disant que les tableaux c'est pas simple
Moi j'avais compris que @a() etait l'adresse du tableau ou y'avait la table dedans
Et @a(0) un enregistrement comme un autre

D'ailleur avec VB, si je retourne @a() ça fait pas pareil que si je retourne @a(0)
Quoi qu'il en soit...ça plante dans les deux cas chez moi :D
Parce que SROD y m'a trouvé la super combine de convertion des pointeurs VB a PB avec *StrPtr.integer
Rien que ce mot m'a remplacé toute une procedure de convertion de variable BSTR en ANSI

Mais depuis une heure, maintenant que j'ai un tableau UNICODE je retourne son adresse et j'arrive pas a le lire dans VB :(
Je cherche une poutre et quand je serais sec comme un "sosse" peut etre que un genie arrivera a faire simplement ce que j'essaye de faire depuis un mois en compliqué :D

Je le hais BILOU et son language simplifié de merde, en plus aucun moyen de lire la memoire, y'a que l'API RTLMOVEMORY de dispo donc autant dire fifre :?
Pour la combine filemapping c'est plutot pour un fichier
Reste les pipes...mais ma femme va pas etre d'accord :cry:

En tout cas merci beaucoup pour ton aide