Page 1 sur 1

Conversion: string to real.

Posté : mar. 24 mai 2016, 16:10
par jmz
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.

Re: Conversion: string to real.

Posté : mar. 24 mai 2016, 19:35
par GM
Bonsoir,

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

Image

Re: Conversion: string to real.

Posté : mer. 25 mai 2016, 16:07
par jmz
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?..

Re: Conversion: string to real.

Posté : mer. 25 mai 2016, 20:12
par GM

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);

Re: Conversion: string to real.

Posté : mer. 25 mai 2016, 22:43
par jmz
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!!...

Re: Conversion: string to real.

Posté : ven. 27 mai 2016, 00:04
par GM
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.

Re: Conversion: string to real.

Posté : mer. 8 juin 2016, 17:03
par jmz
(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é..

Re: Conversion: string to real.

Posté : lun. 4 juil. 2016, 10:37
par jmz
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..