Conversion: string to real.

Pour toute demande d'aide sur des exemples non finalisés, c'est ici.
Les exemples aboutis et intéressants seront ajoutés aux sous-forums qui suivent.

Règles du forum
Pour toute demande d'aide pour la conception (ou la confirmation d'un code) d'une figure Asymptote, c'est ici.

J'invite ceux qui ont régulièrement des questions à poser à aller dans leur panneau de l'utilisateur pour indiquer dans la signature de leurs messages :

  1. Nom du système d'exploitation (W7 ou Ubuntu 12.04 ou ...)
  2. Version d'Asymptote et éditeur utilisé pour les figures Asymptote
  3. Distribution LaTeX et éditeur utilisé pour les tex.


On va gagner du temps dans les réponses !
jmz
Messages : 14
Enregistré le : mer. 16 janv. 2013, 23:37

Conversion: string to real.

Message non lu par jmz » mar. 24 mai 2016, 16:10

Bonjour,
Est-ce que Asymptote propose une fonction du genre: real f(string real, ... ) ?..
Je contourne la difficulté en utilisant la fonction eval(..),ce qui est peut-être totalement inutile!.. Pas très pratique avec la nécessité de variables externes..Sinon, une idée pour la construire?..
Merci.

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Conversion: string to real.

Message non lu par GM » mar. 24 mai 2016, 19:35

Bonsoir,

est-ce que cet exemple est suffisant pour montrer le principe du transtypage d'un type à un autre ?

Image
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

jmz
Messages : 14
Enregistré le : mer. 16 janv. 2013, 23:37

Re: Conversion: string to real.

Message non lu par jmz » mer. 25 mai 2016, 16:07

Oui mais : chaine="5+5" provoque une erreur.
Ce que j'utilise pour l'éviter:

Code : Tout sélectionner

	//GLOBALES en début de programme.
	 string SS0;real XX0;	 
	//FONCTION
	//********
	real s_toreal(string sinit)
		{		
		int k;
		//string s=blanc_out(sinit);
		string s=sinit;
		SS0=s ;
		s=  "XX0=" +  SS0;
		//on effectue en fait  "XX0=sqrt(3);" par ex. XX0 contiendra: 1.732..
		eval(s,true);
		return XX0;
		 };	 
real x=s_toreal("sqrt(3)");write(x);
//on obtient : 1.73205080756888 
La fonction semble bien marcher mais l'inconvénient est la nécessité de variables externes .
En fait, comment créer une telle fonction sans utiliser eval?..
En interne, Asymptote a peut-être l'équivalent?..

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Conversion: string to real.

Message non lu par GM » mer. 25 mai 2016, 20:12

Code : Tout sélectionner

string calculafaire = "sqrt(3)+5";

// Tu voudrais :
// real x=eval(calculafaire,true);
// mais tu as eu comme erreur : cannot cast 'void' to 'real'

// Pourquoi ne fais-tu pas :
eval("real x="+calculafaire+";",true);

write(x);
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

jmz
Messages : 14
Enregistré le : mer. 16 janv. 2013, 23:37

Re: Conversion: string to real.

Message non lu par jmz » mer. 25 mai 2016, 22:43

Oui, mais à condition que la ligne soit dans la partie principale du programme.
Je cherchais à faire des saisies "rapides" à partir de tableaux ou de données sur fichiers .txt
A priori il me semblait plus simple de construire une fonction effectuant les calculs.
La fonction s_toreal(s) permettant d'étendre facilement à des tableaux de type real[], real[][]

Code : Tout sélectionner

 //par ex. à la suite de la fonction s_toreal 5..°.qui sera utilisée:
	real[] s_toreal(
	string[] tabinit)
	{	real[] tabder;
	string[]tabinit0=copy(tabinit);
	for(int i=0;i<tabinit.length;++i){tabder[i]=s_toreal(tabinit0[i]);};
	return tabder;	};
	
//application courte!.	
string s="tan(pi/4),sqrt(2)/2 , 3+1/2"; string[]Ts=split(s,",");
real[]tab0=s_toreal(Ts);write(tab0);

//Ensuite on peut construire:
real[][] s_toreal( string[][] ttabinit){...}; 
Avec eval() dans une fonction il faut obligatoirement des variables globales.
Ce serait plus esthétique que tout soit intégré dans une même entité...
Si on ne peut se passer de la fonction eval(), l'idéal serait donc qu'Asymptote le propose!..Mais est-ce vraiment utile!!...

Avatar du membre
GM
Administrateur du site
Administrateur du site
Messages : 1512
Enregistré le : dim. 7 mars 2010, 14:50

Re: Conversion: string to real.

Message non lu par GM » ven. 27 mai 2016, 00:04

jmz a écrit :Avec eval() dans une fonction il faut obligatoirement des variables globales.
Le titre de ta demande aurait dû être en lien avec cela : "eval - problème de portée de variable"
avec un exemple comme celui-là, qui montre ce qui fonctionne (TEST1, TEST2) et ce qui ne fonctionne pas (TEST3).

Code : Tout sélectionner

/////////////////////////////////
/////////////////////////// TEST1
string calculafaire = "sqrt(3)";

eval("real test1="+calculafaire+";",true);
write("TEST1 = ",test1);

/////////////////////////////////
/////////////////////////// TEST2
real tempo2;
real s_toreal2(string calcul)
{      
    eval("tempo2="+calcul+";",true);
    return tempo2;
};   
real test2=s_toreal2(calculafaire);
write("TEST2 = ",test2);

/////////////////////////////////
/////////////////////////// TEST3
real s_toreal3(string calcul)
{      
    eval("real tempo3="+calcul+";",true);
    return tempo3;
};   
real test3=s_toreal3(calculafaire);
write("TEST3",test3);
Car, il me semble clair que :
  • pour une chaine qui contient un simple nombre... on sait transtyper en nombre : tu peux parler de conversion en "real" !
  • pour une chaine qui contient autre chose qu'un nombre, cela peut être tellement n'importe quoi dans la chaine, qu'il n'y a aucune surprise à ce qu'il n'y ait pas une fonction qui propose une conversion en "real" !
    Dans ce cas là :
    • on comprend que les langages informatiques aient une fonction de type eval() pour évaluer si la chaine n'est justement pas une ligne de code du langage concerné...
    • ... mais pour tout le reste, il faut créer un parseur adapté au contenu de ta chaine.
Et le problème de la limitation de eval() pour les variables doit être lié à un problème de sécurité : pas d'étonnement non plus, pour moi.
Index des fonctions - Exemple de lien donnant le résultat d'une recherche sur les mots 'arc' et 'triple' : http://asy.marris.fr/indexasy/?filtre=arc triple
Mes configurations (le 24/02/21) :
PC n°1 :Windows 10 - Asymptote(2.82)+MikTeX2.9 - Editeurs : Notepad++, TeXworks, Visual Studio Code.
PC n°2 : Ubuntu 20.04LTS - Asymptote(2.67-?? git) + TexLive2020
Mon serveur : Debian Stretch- Asymptote(2.68-16 git) + TexLive2018
Merci de préciser la votre !

jmz
Messages : 14
Enregistré le : mer. 16 janv. 2013, 23:37

Re: Conversion: string to real.

Message non lu par jmz » mer. 8 juin 2016, 17:03

(Réponse tardive suite problèmes réseaux..)
Effectivement le titre ne convenait pas.Juste quelques remarques...
Sur le même modèle que s_toreal(string s); on peut construire les fonctions : int s_toint(string s); pen s_topen(string s); bool s_tobool(string s); s_toXXX.. XXX représentant tous les types crées par les auteurs..
Une application simple:

Code : Tout sélectionner

string s="1/x,0+ 0.0001, sqrt(10), blue, fontsize(10)+blue,false";//données initiales
string[] Ts=split(s,",");//données initiales en tableau
string fct=Ts[0];//la fonction
real x1=s_toreal(Ts[1]);//xmin
real x2=s_toreal(Ts[2]);//xmax
pen pencourbe=s_topen(Ts[3]);//pen de la courbe
pen penlegende=s_topen(Ts[4]);//pen de la légende
bool b=s_tobool(Ts[5]);//pour mettre ou pas un cadre autour du graphique par ex...
//A l'aide du type tfunction, on trace aussitôt  en bleu la courbe 1/x entre 0.0001 et sqrt(10) 
On peut ainsi récupérer facilement les données d'un tableur par "copié/collé" dans une variable de type string, qui à l'aide de fonctions du genre s_toXXX deviendront immédiatement opérationnelles. (Idem en parcourant le contenu d'un fichier .txt)
Les fonctions s_toXXX me semblent une extension naturelle de la conversion de type, sans l'utiliser! Pour le parser, ici eval() fait le tri.
L'inconvénient : à chacun ses variables externes associées à chaque fonction!..
En laissant donc de côté la conversion de type,il me semble qu'il ne devrait pas être bien compliqué pour les auteurs de proposer ce genre de fonctions.. En attendant, on peut toujours les rassembler dans un module dédié..

jmz
Messages : 14
Enregistré le : mer. 16 janv. 2013, 23:37

Re: Conversion: string to real.

Message non lu par jmz » lun. 4 juil. 2016, 10:37

Erratum.. Laisser de côté " extension naturelle.." et lire à la place:
"La fonction eval permettra d'initialiser une variable de type XX avec une valeur contenue dans une variable de type string.."
Exemple avec le type pen:

Code : Tout sélectionner

string spen="red";  //variable de type string 
pen penrouge=s_topen(spen); initialisation de la variable penrouge
label("texte",position, penrouge);//utilisation de penrouge, affichage
L'intérêt?.. Effectuer rapidement des initialisations.. sinon??..
Juste une remarque:
"redd" au lieu de "red" provoquera une erreur mais sans indication de ligne en console et l'erreur ne bloquera pas forcément la compilation.
Si l'on a beaucoup d'appels de ce genre on peut taper: "CTRL F eval" dans la console en bas de l'écran puis cliquer sur "return" pour retrouver rapidement tous les eval..

Répondre