Page 1 sur 2

Passage de paramètres par référence au procédure

Publié : mer. 22/déc./2004 20:23
par nguray
Que penser vous de pouvoir faire modifier les variables du programme principale que le on passe à une procédure

Ex:

Procedure Test(ref a.l,ref b.l)
a.l = 100
b.l = 100
EndProcedure

c.l = 10
d.l = 10

Test(c.l,d.l)

Debug c
Debug d

Afficherais

100
100

Nico m'a proposer la solution suivante

Procedure Test(*a.LONG,*b.LONG)
*a\l = 100
*b\l = 100
EndProcedure

c.l = 10
d.l = 10
Test(@c,@d)
Debug c
Debug d

Solution parfaitement fonctionnelle,mais je trouve que PureBasic mérite une méthode plus intégré et surtout plus naturelle.

:D

Publié : mer. 22/déc./2004 20:49
par Backup
je vois pas trop l'interet !!

vaux mieux demander des trucs plus urgent et plus flagrant !!

comme par exemple les boucles

for t=a to b step c
next t

avec a , b ,c en nombre a virgule ou variable a virgule !


ou le retour de plusieurs valeurs d'une procedure
valeurs "alphanumerique !! "

qui me paraisse bien plus urgent a mon avis !
:?

Publié : mer. 22/déc./2004 21:20
par Chris
Oui..., ça a peut-être un interêt, mais il ne me saute pas aux yeux pour le moment.

Je suis un peu de l'avis de Dobro, il y a plus urgent...
... à moins que vous n'ayez envie de nous faire une espèce d'usine à gaz totalement incompréhensible et inutilisable par les non-programmeurs... :?

Publié : mer. 22/déc./2004 21:25
par nguray
Tous est une question de priorité, je suis nouveau en PureBasic, je ne savais pas que les boucle For...Next ne prend pas les flottants.

Mais ne peut on pas remplacer en attendant la boucle For...Next par une boucle While...Wend

a.f = 1.5
b.f = 3.5
c.f = 0.1

t.f = a.f
While t.f<=b.f
t.f = t.f + c.f
Debug t.f
Wend

Au Passage, j'ai remarqué qu'il y a un bug sur la précision car on obtient ceci comme affichage:
1.700
..
..
3.499999 <= Sortie de la boucle si il n'y pas de bug.
3.599999


Avec les paramètres par références on peut implicitement retourner plusieurs résultats
Ex :

Procedure Test(par1,par2,ref res1,Ref res2,Ref res3)
res1 = par1+par2
res2 = par1-par2
res3 = par1*par2
EndProcedure

par1 = 10
par2 = 20
res1.l = 0
res2.l = 0
res3.l = 0

Test1(par1,par2,res1,res2,res3)
Debug res1
Debug res2
Debug res3

Doit Afficher
30
-10
200

Si tous est homogène on doit pouvoir faire des choses similaires avec les chaîne alphanumérique.


:)

Publié : mer. 22/déc./2004 23:03
par filperj
Ben... Le passage par référence avec les pointeurs structurés marche très bien !
Pourquoi changer la synthaxe ?

Publié : jeu. 23/déc./2004 0:06
par Backup
Mais ne peut on pas remplacer en attendant la boucle For...Next par une boucle While...Wend
si ! bien sur , mais c'est pas un for next c'est autre chose et plus long tant en ecriture qu'en temp machine il me semble !! :D

Au Passage, j'ai remarqué qu'il y a un bug sur la précision car on obtient ceci comme affichage:

avec la version 3.92 complete j'obtient

Code : Tout sélectionner

1.600000
1.700000
1.800000
1.900000
2.000000
2.100000
2.200000
2.300000
2.400000
2.500000
2.599999
2.699999
2.799999
2.899999
2.999999
3.099999
3.199999
3.299999
3.399999
3.499999
3.599998



Publié : jeu. 23/déc./2004 0:45
par Dräc
La traduction en PB de ton exemple nguray donne:

Code : Tout sélectionner

Procedure Test(*a.LONG,*b.LONG) 
  *a\l= 100 
  *b\l= 100
EndProcedure 

c.l = 10 
d.l = 10 

Test(@c,@d) 

Debug c 
Debug d

Publié : jeu. 23/déc./2004 9:47
par hardy
Moi, je trouve qu'il n'y a pas de problème concernant les procédures.
On peut toujours modifier en passant par les adresses.
Quant aux boucles "for", ce ne sont que des boucles "while".
Et si je ne m'abuse, une boucle while n'est pas plus lente qu'une boucle "for" : les boucles "for" ne seraient-elles pas codées sour la forme d'une boucle while ou repeat en asm?
Pour ce qui me concerne, ce que je considère comme le plus urgent, c'est le support en natif des 64bits, et plus si possible, pour pouvoir faire des calculs précis.
Actuellement PB ne permet pas, sauf à bidouiller des lib qui ralentissent, de faire du calcul avec une précision satisfaisante pour des applications "scientifiques"

Publié : jeu. 23/déc./2004 10:19
par Backup
8 lignes de code

Code : Tout sélectionner

a.f = 1.5
b.f = 3.5
c.f = 0.1

t.f = a.f
While t.f<=b.f
     t.f = t.f + c.f
     Debug t.f
Wend

6 lignes de code

Code : Tout sélectionner

a.f = 1.5
b.f = 3.5
c.f = 0.1

for t.f= a.f  to b.f step c.f
      Debug t.f
next t.f
Franchement lequel vous parait le plus clair ??

et encore je ne parle pas des boucles imbriquées !!!
avec while - wend c'est la galere les imbrications de boucles !!!


:D

Publié : jeu. 23/déc./2004 10:56
par hardy
Dobro est un gros raleur. (mais ça, tout le monde le savait déjà!) :lol: :lol: :lol:

Publié : jeu. 23/déc./2004 11:54
par Chris
De toute façon, si il y a trois types de boucles, c'est certainement qu'elles ont une différence, et qu'elles sont utiles.

Dobro est peut-être un râleur, mais il a raison.
Les boucles For/Next, While/Wend, et Repeat/Until, existent dans pratiquement tous les langages, et depuis des années. Depuis le début de la programmation, pour certaines.

Quand au passage de paramètres par des pointeurs structurés, tel qu'on le fait à l'heure actuelle, je trouve ça très bien, et je ne vois pas pourquoi on devrait changer maintenant.

Ca fonctionne parfaitement, c'est relativement simple à comprendre, que demander de plus?

Publié : jeu. 23/déc./2004 12:17
par Anonyme2
Chris a écrit :De toute façon, si il y a trois types de boucles, c'est certainement qu'elles ont une différence, et qu'elles sont utiles.

Dobro est peut-être un râleur, mais il a raison.
Les boucles For/Next, While/Wend, et Repeat/Until, existent dans pratiquement tous les langages, et depuis des années. Depuis le début de la programmation, pour certaines.

Quand au passage de paramètres par des pointeurs structurés, tel qu'on le fait à l'heure actuelle, je trouve ça très bien, et je ne vois pas pourquoi on devrait changer maintenant.

Ca fonctionne parfaitement, c'est relativement simple à comprendre, que demander de plus?
Tout à fait d'accord Chris.

Voici un petit code de test sur une boucle For (pas tout à fait pareil qu'un While) :D

Code : Tout sélectionner

For i = 0 To 0
   Debug "Boucle For : Alors, combien de passages ?  --> i vaut " + Str(i)
Next i

Publié : jeu. 23/déc./2004 17:07
par Chris
Autre problème qu'il faudrait règler, au niveau de la boucle For\Next\Step, c'est le Step qui demande soit une valeur numérique, soit une constante, mais pas une variable.

Code : Tout sélectionner

Pas.l = 3

For i = 0 To 100 Step Pas
  Debug i
Next
Step renvoie une erreur, car il demande une constante.

Le problème, est qu'on pourrait très bien envisager que 'Pas' puisse être le résultat d'une opération, ou bien un appel de procédure.
J'ai mixé les deux, regardez le message d'erreur

Code : Tout sélectionner

Procedure Test(Pas_, Deb_, Fin_)
  #Pas_ = Pas_
  For Val_.l = Deb_ To Fin_ Step #Pas_
    Debug Val_
  Next
EndProcedure

P = 6/2
Test(P, 0, 10)

Publié : jeu. 23/déc./2004 17:10
par Fred
Le passage par reference est prévu, mais bon c'est clair que ce n'est pas hyper prioritaire.

Publié : jeu. 23/déc./2004 19:04
par Backup
ha la vache !!! :lol: il a rien dit sur les boucle for-next -step ! :? :D