Page 1 sur 1

Declare, ProcedureReturn et pointeur (et structure)

Publié : dim. 21/oct./2012 21:01
par Golfy
Bonjour,

je cherche comment utiliser les pointeurs avec des procédures.
Je cherche également à voir comment retourner directement une valeur dans un champ d'une structure.

(la recherche du forum ne m'avance pas et celle de Google considère le caractère * comme un wildcard :oops: )

Enfin, est-ce que cet exemple est juste ?

Code : Tout sélectionner

Procedure Test(nb)
	*TTT = AllocateMemory(nb)
	ProcedureReturn *TTT
EndProcedure

*W = test(10)
*Y = test(10)
*Z = test(10)
Debug *W
Debug *Y
Debug *Z
Debug SizeOf(*Y)
En effet, après plusieurs lancements, je constate un écart de 32 octets entre les valeurs *W, *Y et *Z (alors que Sizeof indique 8 octets).
(Win7 64 bits, PB 5.00 beta 4)
Merci d'avance,

Re: Declare, ProcedureReturn et pointeur (et structure)

Publié : lun. 22/oct./2012 9:21
par Le Soldat Inconnu
oui, il est juste.

tu cherches un truc de ce genre ?

Code : Tout sélectionner

Structure Bidule
	MotLong1.l
	MotLong2.l
EndStructure

Procedure Test(*Mot.Long)
	
	*Mot\l + 1
	
EndProcedure

Machin.Bidule\MotLong1 = 10
Debug Machin.Bidule \MotLong1
Test(@Machin\MotLong1)
Debug Machin.Bidule \MotLong1
ou ça ?

Code : Tout sélectionner

Structure Bidule
	MotLong1.l
	MotLong2.l
EndStructure

Procedure Test(*Mot.Bidule)
	
	*Mot\MotLong1 + 1
	*Mot\MotLong2 + 1
	
EndProcedure

Machin.Bidule\MotLong1 = 10
Debug Machin.Bidule \MotLong1
Test(@Machin)
Debug Machin.Bidule \MotLong1

Re: Declare, ProcedureReturn et pointeur (et structure)

Publié : lun. 22/oct./2012 12:58
par Golfy
La deuxième solution me conviendra parfaitement, merci ! :D

question au passage : c'est mon proxy qui bloque certains smileys comme celui-là ? --> :??:

Re: Declare, ProcedureReturn et pointeur (et structure)

Publié : lun. 22/oct./2012 15:20
par Le Soldat Inconnu
non, c'est le Forum qui buggé, et le grand méchant Fred ne veut remettre les smileys manquant :mrgreen: on a déjà fait plusieurs demande dans ce sens mais qui sont restés sans suite (il suffirait d'un copié collé des smileys du forum anglais vers le forum fr sur le ftp)

Re: Declare, ProcedureReturn et pointeur (et structure)

Publié : lun. 22/oct./2012 16:42
par Golfy
Les histoires de pointeurs et adresses, ça m'a toujours tordu le cerveau...
Le schéma que j'ai fait ci-dessous est-il juste ?
peut-on mettre un @ devant toute variable ou structure ?

Image
free picture hosting

Re: Declare, ProcedureReturn et pointeur (et structure)

Publié : lun. 22/oct./2012 19:10
par graph100
Golfy a écrit :Enfin, est-ce que cet exemple est juste ?

Code : Tout sélectionner

Procedure Test(nb)
	*TTT = AllocateMemory(nb)
	ProcedureReturn *TTT
EndProcedure

*W = test(10)
*Y = test(10)
*Z = test(10)
Debug *W
Debug *Y
Debug *Z
Debug SizeOf(*Y)
En effet, après plusieurs lancements, je constate un écart de 32 octets entre les valeurs *W, *Y et *Z (alors que Sizeof indique 8 octets).
(Win7 64 bits, PB 5.00 beta 4)
Merci d'avance,
Si tu constates des écarts, c'est normal car "Debug *Z" te donne l'adresse contenue dans le pointeur *Z : l'adresse vers laquelle pointe *Z
et pareil pour les autres pointeurs.
Comme tu affectes la mémoire à chaque fois, chaque zone mémoire possède une adresse différente, et elle sont au moins éloignée de leur taille (sinon il pourrais y avoir chevauchement).

Le "Sizeof(*Y) te renvoie la taille du pointeur, comme tu obtiens 8 je suppose que tu compiles avec PB x64bit,
la taille du pointeur est celle que tu déclares en faisant : "*mon_pointeur.i" ou "mon_pointeur.l", il vaut mieux toujours utiliser le type integer.
Par contre si tu utilises une structure pour ton pointeur, pas besoin de te préoccuper de ça.


Pour tes images, il me semble que tu te trompes lorsque tu écris : name @B
je ne sais pas si B pour toi c'est le contenu de là ou pointe le pointeur *B, mais ça ne marche pas comme ça.

*B et B sont des variables complétement séparé en PB.
Faire @B te renvoie l'adresse de la variable B
Faire @*B te renvoie l'adresse du pointeur *B
Faire *B = @Buffer assigne l'adresse de la variable Buffer dans le pointeur *B
Faire *B = *Buffer assigne l'adresse vers laquelle pointe *Buffer dans le pointeur *B

(Au dessus, Buffer et *Buffer sont des trucs différents, comme expliqué plus haut)

C'est plus clair ? :wink:

Re: Declare, ProcedureReturn et pointeur (et structure)

Publié : mar. 23/oct./2012 9:32
par Golfy
oui, il y a une erreur dans le schéma, je le comprend maintenant... c'est compliqué et en plus, si je veux utiliser des procédures avec des retours et des paramètres, je finis par ne plus savoir où j'écris des choses (Poke, etc.)

Merci Graph100 et merci LSI :)

Re: Declare, ProcedureReturn et pointeur (et structure)

Publié : mar. 23/oct./2012 12:04
par kernadec
bonjour
on peut aussi faire sans pointeurs avec ProcedureReturn tableau()
Ne fonctionne que pour des données uniquement numériques.

Cordialement

Code : Tout sélectionner

Procedure test()  
  
  Structure donnees
    b.b
    d.d
    i.i
    l.l
    q.q
    w.w
  EndStructure
  
  Dim tableau2.donnees(0)
  
  tableau2(0)\b=1
  tableau2(0)\d=0.314 
  tableau2(0)\i=2222 
  tableau2(0)\l=10  
  tableau2(0)\q=1000
  tableau2(0)\w=1
  
  ProcedureReturn tableau2()
  
EndProcedure

Dim tableau1.donnees(0)

tableau1()=test()

Debug tableau1(0)\b
Debug tableau1(0)\d
Debug tableau1(0)\i
Debug tableau1(0)\l
Debug tableau1(0)\q
Debug tableau1(0)\w

sinon dans le manuel avec la fonction Array

Code : Tout sélectionner

Structure test
  a.s
  d.d
EndStructure

Dim Tableau.test(1)

Procedure TestIt(c.l, Array Tableau.test(1))  ; Le tableau comporte 2 dimensions
  
  Tableau(0)\a = "ddd"
  Tableau(0)\d = 0.555
  
EndProcedure

TestIt(10, Tableau())

MessageRequester("Tableau", Tableau(0)\a+"  "+ StrD(Tableau(0)\d))