Page 1 sur 1

Equivalent code Pascal

Publié : ven. 03/janv./2020 17:32
par Philippe_GEORGES
Bonjour à tous,

Une question, sans doute un peu simpliste, mais je travaille beaucoup en Pascal Objet et j'ai besoin de migrer du code vers Purebasic.

En pascal, j'ai par exemple une procedure comme ceci :

Code : Tout sélectionner

Procedure calcul(a,b : integer; VAR somme, difference, produit : integer);
begin
end;

Là, les valeurs somme, difference, produit sont retournées par la procédure.

Comment faire l'équivalent en Purebasic ? sans doute en utilisant les pointeurs, mais là je ne sais pas !!

Merci à vous tous,

Phil

Re: Equivalent code Pascal

Publié : ven. 03/janv./2020 18:10
par Zorro
soit tu utilises des variables globales

dans ce cas plus de soucis

Code : Tout sélectionner


Declare calcul(a,b )

Global Somme,difference,produit


Calcul(5,3) ; appel procedure

debug 		somme
debug	difference
debug	produit	



Procedure calcul(a,b )
		somme=a+b
		difference=a-b
		produit=a*b		
EndProcedure

soit tu utilises une structure : et dans ce cas , on peut avoir des variables Locales a la procedure....

Code : Tout sélectionner

structure resultat
		somme.l
		difference.l
		produit.l
EndStructure
resultat.resultat

Declare calcul(a,b ,resultat)

Calcul(5,3,@resultat.resultat) ; appel procedure et on refile l'adresse de la structure aussi

debug 		resultat\somme
debug	resultat\difference
debug	resultat\produit	

Procedure calcul(a,b ,*resultat.resultat)
		*resultat\somme=a+b
		*resultat\difference=a-b
		*resultat\produit=a*b		
EndProcedure


note que tu peux aussi utiliser une structure de façon plus conventionnelle (en utilisant les globales, ce qui fait moins de parametres a passer du coup )

Code : Tout sélectionner

Declare calcul(a,b )

structure resultat
		somme.l
		difference.l
		produit.l
EndStructure
global resultat.resultat

Calcul(5,3) ; appel procedure

debug 		resultat\somme
debug	resultat\difference
debug	resultat\produit	

Procedure calcul(a,b)
		resultat\somme=a+b
		resultat\difference=a-b
		resultat\produit=a*b		
EndProcedure

Re: Equivalent code Pascal

Publié : ven. 03/janv./2020 19:21
par Zorro
et j'allais oublier aussi

le fameux "Shared"qui permet de rendre une variable se trouvant a l'interieur d'une procedure
temporairement Global , puisque la valeur est rendu "publique" avec le mot Shared (Partagée)

Code : Tout sélectionner

Declare calcul(a,b )

Calcul(5,3) ; appel procedure

debug somme
debug difference
debug produit	

Procedure calcul(a,b)
		shared somme,difference,produit
		somme=a+b
		difference=a-b
		produit=a*b		
EndProcedure

voila, je pense avoir fait le tour de la question :)

Re: Equivalent code Pascal

Publié : sam. 04/janv./2020 7:56
par Demivec
Philippe_GEORGES a écrit :Procedure calculation (a, b: integer; VAR sum, difference, product: integer);
begin
Ici:

Code : Tout sélectionner

Procedure calculation(a, b, *sum.Integer, *difference.Integer, *product.Integer)
      *sum\i = a + b
      *difference\i = a - b
      *product\i = a * b      
EndProcedure

Define x = 4, y = 5
Define s, d, p

calculation(x, y, @s, @d, @p)
Debug "{" + x + ", " + y + "}; sum: " + s + "; difference : " + d + "; product: " + p

Structure result
  Sum.i
  Difference.i
  Product.i
EndStructure 

Define result.result

calculation(6, 2, @result\Sum, @result\Difference, @result\Product)
Debug "{" + 6 + ", " + 2 + "}; sum: " + @result\Sum + "; difference : " + result\Difference + "; product: " + result\Product
 

Re: Equivalent code Pascal

Publié : sam. 04/janv./2020 12:16
par Naheulf
D'après le wiki freepascal le mot clef « VAR » correspond à un passage par référence. La solution la plus proche en termes de comportement (et de variables à déclarer) est donc pour moi celle de Demivec.

Re: Equivalent code Pascal

Publié : dim. 05/janv./2020 11:38
par microdevweb
Voici deux solutions (du moins si j'ai bien compris la demande)

Code : Tout sélectionner

Structure test
  a.i
  b.i
  somme.i
  difference.i
  produit.i
EndStructure

Procedure calculation_1(*par.test)
  With *par
    \somme = \a + \b
    \difference = \a - \b
    \produit = \a * \b
  EndWith
EndProcedure
Procedure calculation_2(a.i,b.i,*s,*d,*p)
  PokeI(*s,a+b)
  PokeI(*d,a-b)
  PokeI(*p,a*b)
EndProcedure

Define myPara.test
myPara\a = 10
myPara\b = 2

calculation_1(@myPara)

Debug "SOMME A & B : "+Str(myPara\somme)
Debug "DIFF A & B : "+Str(myPara\difference)
Debug "PROD A & B : "+Str(myPara\produit)

Define.i s,d,p

calculation_2(10,2,@s,@d,@p)

Debug "SOMME A & B : "+Str(s)
Debug "DIFF A & B : "+Str(d)
Debug "PROD A & B : "+Str(p)




Re: Equivalent code Pascal

Publié : dim. 05/janv./2020 13:28
par Zorro
Naheulf a écrit :D'après le wiki freepascal le mot clef « VAR » correspond à un passage par référence. La solution la plus proche en termes de comportement (et de variables à déclarer) est donc pour moi celle de Demivec.

j'ai présenté 4 reponses !!

dont une qui utilise une structure et les pointeurs !
dans ce cas on utilise Exactement la meme Adresse pour un emplacement de Variable (membre de la Structure ) (donc par REFERENCE)

de plus , dans l'absolu , ça ne change pas grand chose , l'essentiel etant de ressortir les 3 résultats d'un coup... ;)

ma proposition a base de pointeurs et de structures a la qualité de n'avoir que 3 parametres a passer
les 2 membres pour le calcul , et l'adresse de la structure ...
je trouve ça plus elegant que

calcul( a,b,*s,*d,*p) ... mais bon



@aux_Autres : Merci pour vos tentatives de faire autrement que ce que j'ai proposé
a condition, que ce soit "Autrement" .... ;)

on peux varier a l'infini la façon de transmettre une valeur (ou l'adresse d'une variable ) soit par des Pokes ou des "="
ce qui serai intéressant , je pense, c'est d'avoir une solution qui soit vraiment original,et différente
de celles deja présentés ... je dis ça ... je dis ça LOL

ps: au final, perso je préfère encore la solution du "Shared" qui reste la plus simple a mettre en oeuvre
et a ecrire ! , apres c'est comme vous voulez ...

Re: Equivalent code Pascal

Publié : dim. 05/janv./2020 14:12
par Micoute
Zorro a écrit :perso je préfère encore la solution du "Shared" qui reste la plus simple a mettre en œuvre et a ecrire.
C'est celle que je préfère aussi.