LES TABLEAUX :-(

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

LES TABLEAUX :-(

Message par Kwai chang caine »

Bonjour à tous

Alors avant toute chose, et surtout avant de me faire engueuler, car vous avez pu constater que tout comme chacun, j'aime pas me faire engueuler :(

J'ai cherché dans les TUTOS
Et j'ai trouvé quelque chose qui parle des tableaux, mais comme je le disait hier.....pas ce que je cherche a savoir

Donc voila, j'ai vu dans le forum US et aussi avec mon ami CPL que les adresses des strings d'un tableau de string, etaient toutes rangées à la queue leu leu dans un tableau de long.
J'ai lu aussi que pour trouver ces adresses il fallait apliquer cette formule

Code : Tout sélectionner

AdresseOrigine + i * 4
Alors comme je recommence a zero depuis la 10e fois, pour essayer de comprendre ce qui m'a échappé. :?
J'aimerais avoir des bases solides :roll:

Et comme me l'a conseillé, mon ami DJES....il faut faire des essais.
Donc KCC il essai....et super ...ça marche pas :D

Pourqoui je n'obtiens pas les memes adresses :(

Code : Tout sélectionner

Dim a$(10)
a$(0) = "Kcc 0"
a$(1) = "Kcc 1"
a$(2) = "Kcc 2"
a$(3) = "Kcc 3"
a$(4) = "Kcc 4"

For i = 0 To 4
 Debug @a$(i)
 Debug @a$() + i * 4
 Debug ""
Next
Je vous souhaite une bonne journée qui a bien commencé avec CPL :lol:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: LES TABLEAUX :-(

Message par Octavius »

Comme ça peut-être :

Code : Tout sélectionner

Dim a$(10)
a$(0) = "Kcc 0"
a$(1) = "Kcc 1"
a$(2) = "Kcc 2"
a$(3) = "Kcc 3"
a$(4) = "Kcc 4"

For i = 0 To 4
Debug @a$(i)
Debug @a$(0) + i * 32
Debug ""
Next i

For i = 0 To 4
Debug PeekS( @a$(0) + i * 32 )
Next i
Chez moi ça marche.
Cls
Messages : 620
Inscription : mer. 22/juin/2005 8:51
Localisation : Nantes

Re: LES TABLEAUX :-(

Message par Cls »

C'est tout à fait normal que les adresses soient différentes.
Dans le premier cas :

Code : Tout sélectionner

Debug @a$(i)
@a$(i) te renvoi l'adresse mémoire contenant la chaine de caractères.

Dans le second cas :

Code : Tout sélectionner

Debug @a$() + i * 4
@a$() te renvoi l'adresse du tableau et i * 4 l'adresse de l'adresse contenant la chaine de caractères.
En gros dans un cas tu as directement l'adresse : dans l'autre tu as l'adresse de l'adresse...

Par ailleurs utilise SizeOf() plutôt que des valeurs en dur ;)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: LES TABLEAUX :-(

Message par djes »

C'est à cause des $. Essaye ça

Code : Tout sélectionner

Dim a.s(10)

a(0) = "Kcc 0"
a(1) = "Kcc 1"
a(2) = "Kcc 2"
a(3) = "Kcc 3"
a(4) = "Kcc 4"

For i = 0 To 4

  Debug @a(i)
  Debug PeekS(@a(i))

  Debug @a() + i * 4
  Debug PeekS(PeekL(@a() + i * 4))

Next

CallDebugger ;regarde avec "voir les zones mémoires" sur les adresses qui te sont données :)
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: LES TABLEAUX :-(

Message par Le Soldat Inconnu »

(on a tous répondu en même temps ...)

Le tableau de string, c'est particulier

Code : Tout sélectionner

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

For i = 0 To 4
	Debug @a(i)
	Debug PeekL(@a() + i * 4)
	Debug PeekS(PeekL(@a() + i * 4))
	Debug ""
Next
et oui, l'adressage n'est pas simple

@a(i) donne l'adresse du string
@a() donne l'adresse de la table qui contient les adresses des strings

@a() = adresse du long qui contient l'adresse de @a(0)
@a() + 4 = adresse du long qui contient l'adresse de @a(1)
@a() + 8 = adresse du long qui contient l'adresse de @a(2)

et par conséquent

@a(0) = peekl( @a() )
@a(1) = peekl( @a() + 4 )
@a(2) = peekl( @a() + 8 )

J'espère que c'est clair :)


sinon, on peut faire comme ça aussi si c'est plus clair pour toi, je passe par une structure STRING

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"

For i = 0 To 4
	Debug @a(i)
	Debug @a(0) + i * 4
	Debug PeekS(PeekL(@a(0) + i * 4))
	Debug ""
Next
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: LES TABLEAUX :-(

Message par Kwai chang caine »

Merci beaucoup à tous mes amis.

Alors la je ne sais plus quoi dire.
J'ai l'impression d'avoir petit dejeuner avec vous ce matin :D
Moi c'etait tartine beurre / confiture (Pas bien) :oops:

Tu as raison soldat, c'est vraiment pas simple 8O

Comme je discutais avec DJES l'autre jour, j'ai fais le gros code avec des PEEK et POKE, sans comprendre et cette fois sans copier/coller juste en lisant les codes des autres
Hors mis le transfert par *strPtr.INTEGER de SROD, que j'aurais jamais trouvé.....tout a la veuve poignet :D
Avouez quand meme que j'aurais du avoir compris..et ben non :oops:

Donc tu vois que les methodes traditionnelles avec moi elles marchent pas.
Les profs se tirait les cheveux avec moi....je sortais la reponse...et j'avais rien compris :oops:

Donc comme le pinard le KCC nouveau est arrivé :D
Il faut que je comprenne..peu importe la boisson pourvu qu'on est l'ivresse :lol:

Je vais tout bien ecrire ce que vous m'avez dit, dans mon fichier EXCEL de centaines de pages qui me sert de cerveau, et j'espere que cette fois, j'ai bien les bases, au moins jusqu'au prochain trou de memoire :?

Bon maintenant que j'ai compris PB..j'essaye VB sans les PEEK et POKE ça va etre du gateau :?
Voila pourquoi je voulais connaitre les API CopyMemory_ pour savoir si je lis avec VB les adresses que j'obtiens avec PB, et bien vais je "abimer" les pointeur PB ???
C'est parti

Encore mille merci à tous, vraiment ça fait chaud au coeur 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: LES TABLEAUX :-(

Message par Kwai chang caine »

Bon ça a pas trainé.... :oops:
KCC il viens de tout relire conscieusement ce que vous avez ecris...

Il a a peu pres compris tout :D
Mais y'a encore un os dans le fromage :?

Y'a une ligne du soldat que j'ai vraiment pas compris :oops:

Le soldat il a ecrit que

Code : Tout sélectionner

@a(0) = peekl( @a() )
8O
Mais alors ce que je ne comprend pas c'est la difference entre @a() et PeekL(a()) :cry:

J'ai dessiné un petit graphique que je completerais au fur et a mesure, pour voir si j'me melange pas les pingoinces :D

Image
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: LES TABLEAUX :-(

Message par djes »

Il n'y en a pas, c'est une notation, le langage comprend ce que tu veux :

@a.s(0) signifie donne moi l'adresse de l'élément 0 du tableau de chaînes
@a.s() + i*0 signifie donne moi l'adresse de l'élément 0 du tableau contenant les adresses des chaînes
@a.s() signifie donne moi l'adresse du tableau contenant les adresses des chaînes
a.s() signifie donne moi l'adresse du tableau contenant les adresses des chaînes (pareil quoi, c'est pour ça que tu t'embrouilles!)

Si tu lis ce qu'il y a à cette adresse, tu obtiens l'adresse de la première chaîne. Ton schéma est bon.
Dernière modification par djes le mar. 06/oct./2009 11:34, modifié 2 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: LES TABLEAUX :-(

Message par Kwai chang caine »

Bon mon schema est bon c'est deja un bon debut
Kwai chang truc a écrit :Mais alors ce que je ne comprend pas c'est la difference entre @a() et PeekL(a())
Tu me dis que y'a pas de difference entre ses deux termes " @a() et PeekL(a()) "
Et quand je tape ça :

Code : Tout sélectionner

Dim a$(10)
a$(0) = ""
a$(1) = "Kcc 1"
a$(2) = "Kcc 2"
a$(3) = "Kcc 3"
a$(4) = "Kcc 4"
Debug @a$() 
Debug PeekL( a$() )
Dans le debug ça me donne deux resultats differents 8O

Code : Tout sélectionner

8134568
8193640
Plus je reflechi...moins j'comprend :(
Et puis les PeeK je peux les dessiner ou dans mon dessin :(
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: LES TABLEAUX :-(

Message par flaith »

Perso j'utiliserais plutôt cette façon (au lieu de mettre 4 j'utilise sizeof) :

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"

For i = 0 To 4
  Debug @a(i)
  Debug @a(0) + i * SizeOf(Integer)
  Debug PeekS(PeekL(@a(0) + i * SizeOf(Integer)))
  Debug ""
Next
On peut mettre Long mais avec Integer ca marche aussi bien en 32 qu'en 64Bits :mrgreen:
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: LES TABLEAUX :-(

Message par djes »

Kwai chang caine a écrit :Bon mon schema est bon c'est deja un bon debut
Kwai chang truc a écrit :Mais alors ce que je ne comprend pas c'est la difference entre @a() et PeekL(a())
Tu me dis que y'a pas de difference entre ses deux termes " @a() et PeekL(a()) "
Et quand je tape ça :

Code : Tout sélectionner

Dim a$(10)
a$(0) = ""
a$(1) = "Kcc 1"
a$(2) = "Kcc 2"
a$(3) = "Kcc 3"
a$(4) = "Kcc 4"
Debug @a$() 
Debug PeekL( a$() )
Dans le debug ça me donne deux resultats differents 8O

Code : Tout sélectionner

8134568
8193640
Plus je reflechi...moins j'comprend :(
Et puis les PeeK je peux les dessiner ou dans mon dessin :(
Non, il n'y a pas de différence entre a.s() et @a.s() et @a.s() + i*0, le résultat est le même.
Peekl sert à lire ce qu'il y a à une adresse.
Donc si tu lis ce qu'il y a à l'adresse renvoyée par a.s()

Code : Tout sélectionner

debug peekl(a.s())
tu vas obtenir l'adresse de la première chaine, que tu pourras lire avec un peeks()

Code : Tout sélectionner

debug peeks(peekl(a.s())
Tu comprends, là?

En fait depuis le début on se bat avec toutes les conneries que Microsoft avec VB ont mis dans la tête des programmeurs, qui manipulent des objets sans savoir ce que ça signifie "derrière".
Dernière modification par djes le mar. 06/oct./2009 11:31, modifié 2 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: LES TABLEAUX :-(

Message par Kwai chang caine »

Merci FLAITH 8)
On peut pas dire que rajouter les structures me facilite la tache :lol:

Mais ce que j'ai du mal a comprendre....c'est que le a$(0) est un enregistrement comme tous les autres a$(1), a$(2) etc....bon ça ca va c'est imprimé :D
Mais c'est ce bon sang de a$() qui me perturbe... :?
Et encore plus le PeekL(a$()) 8O

En fin de compte j'ai compris que @ devant la variable pointait sur l'adresse du tableau de pointeur correspondant comme dans mon schema.
Donc @a(0) pointe sur le tableau de long dans lequel l'adresse de la premiere variable du tableau est :D

Mais c'est la difference entre entre @a(0) et PeekL(@a(0)) qui me perturbe..je n'arrive pas a voir ou pointent les PEEK dans mon dessin :(
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: LES TABLEAUX :-(

Message par Kwai chang caine »

@DJES
Alors la j'crois que je vais devenir zinzin :(
Non, il n'y a pas de différence entre a.s() et @a.s() et @a.s(0), le résultat est le même.
Tu me dis que y'a aucune difference entre @a$() et @a$(0) 8O

Mais si tu tape ça :

Code : Tout sélectionner

Dim a$(10)
a$(0) = "Kcc 0"
Debug @a$() 
Debug @a$(0)
Tu obtiens

Code : Tout sélectionner

8134504
8193640
Alors la.....j'en ai les bras qui m'en tombent si 8134504 = 8193640
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: LES TABLEAUX :-(

Message par djes »

Faut pas parler de pointer. Un pointeur pointe, il est fait pour ça, quand on voit *, on sait qu'on va travailler avec des données en mémoire, sans se coltiner des peek et poke, et que pb va convertir tout ça à notre place.
@ renvoie une adresse comme donnée manipulable, celle de la variable qui est spécifiée.
Peek sert à lire des données à des adresses.
Poke sert à écrire des données à des adresses.
Dernière modification par djes le mar. 06/oct./2009 11:32, modifié 1 fois.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: LES TABLEAUX :-(

Message par djes »

Oulà, tu as raison, je me mélange les pinceaux! Je corrige mes posts :)
Répondre