Petit programme

Tout ce qui concerne l'utilisation ou l'installation d'Asymptote.

Modérateur: gdm_asy

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

Petit programme

Messagepar fbaldit » Mercredi 03 Mars 2010, 20:43

Bonjour,

je suis en train de me documenter sur les aspects programmation avec asymptote (1.91). En lisant la doc je me suis intéressé aux fonctions à nombre de paramètres variables. J'ai repris le code source d'une fonction calculant la somme des arguments (en nombre variable) qui lui sont passés. Juste pour voir, j'ai inséré une ligne dans le code, ce qui donne:

Code: Tout sélectionner
real sum(... real[] nums)
{
real total=0;
for(real x : nums)
  {
    total += x;
    // ma ligne
    write(x);
  }
return total;
}


Or l'affichage des valeurs successives de x ne se produit pas: c'est ce que je ne comprends pas. Par contre (évidemment) la fonction fonctionne, c'est à dire renvoit bien la somme des arguments passés à l'appel. J'ai vérifié, sur un exemple simple, que write(x); doit bien écrire x sur la sortie standard. Je précise aussi que mon test est fait en écrivant le code ci-dessus dans un fichier .asy qui est compilé puis importé en mode interactif.

Si quelqu'un parmi vous a une idée/explication, merci d'avance.
Cordialement,
F.B.
fbaldit
Déca-utilisateur
 
Messages: 19
Inscription: Dimanche 13 Septembre 2009, 14:53
Statut actuel: Lycée

Publicité

Re: [Asymptote] Petit programme

Messagepar GMaths » Mercredi 03 Mars 2010, 21:23

2010-03-03_212830.png
2010-03-03_212830.png (14.18 Kio) Vu 996 fois


Passage rapide par ici... et uniquement le temps de confirmer le problème (sans être capable de l'expliquer) : le write(x); dans la boucle ne fonctionne pas.
Mais la fonction sum fait ce qu'elle doit faire, comme tu peux voir sur l'exemple d'utilisation.
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Petit programme

Messagepar GMaths » Mercredi 03 Mars 2010, 21:34

J'avais copié-collé le code sans y faire attention : enlève les ... et cela ira mieux.

Code: Tout sélectionner
real sum(real[] nums)
{
real total=0;
for(real x : nums)
  {
    total += x;
    write(x);
  }
return total;
}
real[] listetest={1,2,3,4,5,7.5};
write(sum(listetest));
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Petit programme

Messagepar OG » Mercredi 03 Mars 2010, 22:55

bonsoir

j'ai testé rapidement l'exemple initial sum( ... real .....) et chez moi cela fonctionne ! (Ubuntu, version SVN (pas important le fait que cela soit SVN)

Code: Tout sélectionner
real sum(... real[] nums)
{
real total=0;
for(real x : nums)
  {
    total += x;
    // ma ligne
    write(x);
  }
return total;
}

sum(1,2,4,5,6);
write(sum(1,2,4,6,6));


O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [Asymptote] Petit programme

Messagepar GMaths » Mercredi 03 Mars 2010, 23:26

OG a écrit:et chez moi cela fonctionne ! (Ubuntu, version SVN (pas important le fait que cela soit SVN)

Ce n'est pas un problème de version... mais de syntaxe adoptée

sum(1,2,3); va afficher les termes mais pas sum(new real[]{1,2,3});

alors qu'aussi bien write(sum(1,2,3)); et write(sum(new real[]{1,2,3})); affichent le total.

Je n'avais pas encore testé ces "Rest arguments".
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Petit programme

Messagepar OG » Jeudi 04 Mars 2010, 08:47

Bonjour

Ok, mais l'esprit de cette possibilité est plutôt sum(1,2,3,4); que sum(new real [] {1,2,3,4}); car si tu envoies comme argument un tableau alors cela ne sert à rien d'avoir une fonction qui attend un nombre variable d'entrée (sauf si c'est un nbre variable de tableau).

Pas sûr que la fonction sum écrite dans la doc qui utilise nums.length supporte en entrée new real []. (donne un erreur)
D'ailleurs tout le monde a faux ici ! La fonction sum définie F.B l'est uniquement pour un nombre arbitraire de réels donnés en argument. Mais quand tu écris sum(new real [] {1,2});
c'est la fonction sum d'Asymptote qui est utilisée !

O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [Asymptote] Petit programme

Messagepar fbaldit » Jeudi 04 Mars 2010, 10:31

Bonjour et merci pour vous être penché sur le problème.

Dans la liste des messages échangés je suis d'accord avec le dernier: l'idée est bien de passer une liste variable d'arguments, donc de ne pas enlever l'ellipsis ..., sans quoi la fonction sum() d'asymptote est déjà là. Par contre, à mon grand étonnement, le petit bout de code donné au début marche maintenant chez moi aussi !! (les write(x) affichent les valeurs des arguments successifs). Pourtant j'ai regardé attentivement, je ne comprends pas du tout !!! J'ai même maintenant un autre problème, qui me semble super-bizarre:

j'ai fait une copie de mon code ,puis je l'ai compilé, puis je l'ai testé:

Code: Tout sélectionner
fred@Siula-Grande:cp essai.asy copie-essai.asy
fred@Siula-Grande:asy copie-essai.asy
fred@Siula-Grande:asy
Welcome to Asymptote version 1.91 (to view the manual, type help)
> import copie-essai
-: 1.13: syntax error
> quit
fred@Siula-Grande:asy
Welcome to Asymptote version 1.91 (to view the manual, type help)
> import essai
> sum(1,2,3)
1
2
3
6


Tout ceci est incompréhensible pour moi. Surtout, pourquoi la compil a l'air de bien marcher puis lors de la session interactive non, il y a une erreur de syntaxe.
Si vous avez une idée, merci d'avance.
Cordialement,
F.B.
fbaldit
Déca-utilisateur
 
Messages: 19
Inscription: Dimanche 13 Septembre 2009, 14:53
Statut actuel: Lycée

Re: [Asymptote] Petit programme

Messagepar GMaths » Jeudi 04 Mars 2010, 16:54

OG a écrit:La fonction sum définie F.B l'est uniquement pour un nombre arbitraire de réels donnés en argument. Mais quand tu écris sum(new real [] {1,2});
c'est la fonction sum d'Asymptote qui est utilisée !

Bien vu ! J'ai tenté une réponse rapide entre deux copies sur quelque chose que je n'avais encore jamais pratiqué... et je n'ai même pas réalisé que "sum" existait.
Je vais prendre mon temps pour essayer de répondre à la prochaine question... mais je vais me coucher d'abord car 7h en deux nuits, cela ne doit pas être suffisant pour donner de bons conseils. :lol:
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Petit programme

Messagepar GMaths » Jeudi 04 Mars 2010, 17:07

GMaths a écrit:Je vais prendre mon temps pour essayer de répondre à la prochaine question...

Pas tant de temps que cela finalement : l'erreur est due au trait d'union dans le nom de fichier. :wink:
Cette fois, je vais pouvoir dormir serein de savoir encore répondre à des questions. :lol:
GMaths
Exa-utilisateur
 
Messages: 2031
Inscription: Lundi 01 Octobre 2007, 09:20
Statut actuel: Actif et salarié | Enseignant

Re: [Asymptote] Petit programme

Messagepar fbaldit » Jeudi 04 Mars 2010, 17:55

Merci, j'ai compris d'où venait l'erreur de syntaxe. Reste à comprendre pourquoi initialement la fonction n'afffichait pas les valeurs. Mais au moins maintenant ça fonctionne.
Merci encore !!
Cordialement,
F.B.
fbaldit
Déca-utilisateur
 
Messages: 19
Inscription: Dimanche 13 Septembre 2009, 14:53
Statut actuel: Lycée

Re: [Asymptote] Petit programme

Messagepar OG » Jeudi 04 Mars 2010, 21:03

fbaldit a écrit:Merci, j'ai compris d'où venait l'erreur de syntaxe. Reste à comprendre pourquoi initialement la fonction n'afffichait pas les valeurs. Mais au moins maintenant ça fonctionne.
Merci encore !!.


La fonction n'affichait pas les valeurs car sum(real [] x) est déjà défini dans asymptote,
sum(1,2,3) utilisait ta fonction
sum(new real []{1,2,3}) utilise la routine interne d'asymptote.

O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [Asymptote] Petit programme

Messagepar fbaldit » Vendredi 05 Mars 2010, 00:47

Bonjour,
je réponds ici au dernier mail d'O.G.: non, je ne crois pas que ce soit l'explication. Si, sans faire d'import de ma fonction, je tapais sum(1,2,3) (directement, en mode interactif), je recevais (je reçois) (c'est normal) une erreur. Cela ne marche qu'à condition que le code de ma fonction soit importé, ce qui montre bien qu'il faut une fonction capable de gérer un nombre variable d'arguments. Ce qui est vrai, c'est que si je tape (sans faire aucun import, au démarrage de la session interactive):

Code: Tout sélectionner
> int t[] = new int [] {1,2,3}
> t
0:   1
1:   2
2:   3
> sum(t)
6
>


Donc, oui la fonction sum() existe mais elle doit absolument recevoir une variable de type tableau. Si on tape sum(1,2,3) directement on a une erreur.
Cordialement,
F.B.
fbaldit
Déca-utilisateur
 
Messages: 19
Inscription: Dimanche 13 Septembre 2009, 14:53
Statut actuel: Lycée

Re: [Asymptote] Petit programme

Messagepar OG » Vendredi 05 Mars 2010, 09:06

fbaldit a écrit:Donc, oui la fonction sum() existe mais elle doit absolument recevoir une variable de type tableau. Si on tape sum(1,2,3) directement on a une erreur.


Peut-être me suis-je mal exprimé, mais je n'ai jamais dit le contraire.
O.G.
OG
Modérateur
 
Messages: 2285
Inscription: Lundi 12 Mars 2007, 11:20
Localisation: Rouen
Statut actuel: Actif et salarié | Maître de conférence

Re: [Asymptote, résolu] Petit programme

Messagepar fbaldit » Samedi 06 Mars 2010, 09:36

Bonjour,
OK, donc nous n'avons pas du nous comprendre. Pour moi le "test" que je voulais faire est clos puisque maintenant ça marche (et malheureusement je n'ai pas réussi à reproduire l'erreur constatée au début...ça reste un mystère...informatique).
Merci en tout cas pour l'erreur venant de l'usage du tiret dans le nom d'un fichier source, j'ai au moins appris ça!
Bien cordialement,
F.B.
fbaldit
Déca-utilisateur
 
Messages: 19
Inscription: Dimanche 13 Septembre 2009, 14:53
Statut actuel: Lycée


Retourner vers Asymptote

Qui est en ligne

Utilisateurs parcourant ce forum: Baidu [Spider] et 1 invité