Syntax Error... Pourquoi tant de haine ???

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Syntax Error... Pourquoi tant de haine ???

Message par hackotedelaplaque »

Bonjour à toutes et à tous !

je veux créer une procedure toute simple mais elle me renvoie un "syntax error" à la compil :

Code : Tout sélectionner

Procedure SetHorinzontalSpeed(Myvariable.Mystructure,vitesse.w)
  Myvariable\x+vitesse
Endprocedure
Ca me paraissait tout bête mais ça ne passe pas.
Est-ce parce qu'on ne peut passer un type strucure en argument d'une Procédure ???
Si oui comment ruser ?

En vous remerciant messieurs dames et à vot' bon coeur !
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Il faut passer l'adresse mémoire de la structure en param.

Exemple :

Code : Tout sélectionner

Structure Machin
  Truc.l
  Bidule.l
EndStructure


Procedure Chose(Mem.l)
  CopyMemory(Mem, @Temp.Machin, SizeOf(Machin)) ; On copie le contenu dans une variable temporaire
  Temp\Truc = 14 ; On édite
  CopyMemory(@Temp.Machin, Mem, SizeOf(Machin)) ; on replace dans la structure d'origine
EndProcedure


; On crée la variable avec une structure
Bignou.Machin

; On la rempli
Bignou\Truc = 5
Bignou\Bidule = 12

; On lance la procedure en lui donnant en param l'adresse mémoire la variable
Chose(@Bignou)

Debug Bignou\Truc
on doit pouvoir faire avec des pointer aussi mais moi et les pointeur, c'est pas encore ça.
si quelqu'un peut faire un exemple, ça m'intéresse également :wink:
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)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Il faut que tu passes par un pointeur, dont voici un exemple:

Code : Tout sélectionner

Structure test
  a.l
  b.l
EndStructure

Procedure essai(*test.test)
  *test\a=10
  *test\b=11
EndProcedure

essai(@valeur.test)

Debug valeur\a
Debug valeur\b
Voilà M'sieur :D
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

Ca marche !!!!
...... mais j'ai rien compris !!! :oops:


Disons que j'appréhende vaguement le concept mais ça reste assez flou.

Et puis quelle est la différence de fond entre vos deux techniques ?
Pourquoi une structure ne serait pas un argument valide pour une fonction ?
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Les arguments passés à une procédure ont une taille de 1, 2 ou 4 octets (.b, .w, .l, .f et pointeurs).

Pour les strings ou les variables structurées, on doit également passer une variable sur 4 octets mais en général ces 2 types ne tiennet pas sur 4 octets. Une chaine variant de contenu souvent, il n'y a que son adresse qui reste fixe, cette adresse tient sur 4 octets (un long). Dans le cas d'une string, PB passe automatiquement l'adresse de la chaine (qui reste fixe) mais pas dans le cas d'un variable structurée.

Tu dois passer un pointeur (voir exemple de Nico). Le pointeur reçoit l'adresse du début de la structure et comme c'est un pointeur sur une structure, ont peut acceder aux élémentx de la structure à l'aide du pointeur.
Dernière modification par Anonyme2 le sam. 09/oct./2004 12:31, modifié 1 fois.
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Tu peux aussi déclarer ta variable globale

Code : Tout sélectionner

Structure Mystructure
  x.l
EndStructure

Global Myvariable.Mystructure

Myvariable\x = 10

Procedure essai(vitesse.w) 
  Myvariable\x+vitesse 
EndProcedure 

Debug Myvariable\x
Debug ""
essai(20)

Debug Myvariable\x
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Lorsqu'on passe des arguments à une procédure, la procédure fait une copie locale.

Et comme il n'est pas possible de faire: valeur1.test=valeur2.test
On ne peut pas passer une variable structurelle à une autre donc on ne peut pas le faire non plus avec une procédure.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

; On crée la variable avec une structure
Bignou.Machin
Délocalisé ou non, Breton il est, Breton il reste :lol:
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Message par hackotedelaplaque »

Je pense avoir bien compris maintenant, merci à tous.
Les pointeurs, ça me faisait un peu peur au début.

Mais bon je suppose que c'est comme les filles, faut désacraliser et après on peut plus sans passer ! !!

Encore merci messieurs du basic.
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
Répondre