Declare, ProcedureReturn et pointeur (et structure)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Declare, ProcedureReturn et pointeur (et structure)

Message 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,
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Declare, ProcedureReturn et pointeur (et structure)

Message 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
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)]
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Declare, ProcedureReturn et pointeur (et structure)

Message 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à ? --> :??:
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Declare, ProcedureReturn et pointeur (et structure)

Message 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)
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)]
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Declare, ProcedureReturn et pointeur (et structure)

Message 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
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Declare, ProcedureReturn et pointeur (et structure)

Message 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:
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Declare, ProcedureReturn et pointeur (et structure)

Message 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 :)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Avatar de l’utilisateur
kernadec
Messages : 1606
Inscription : ven. 25/avr./2008 11:14

Re: Declare, ProcedureReturn et pointeur (et structure)

Message 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))
Répondre