Appel de gnuplot a partir d'un prog en c++

keno83 Messages postés 16 Date d'inscription lundi 24 juillet 2006 Statut Membre Dernière intervention 6 septembre 2006 - 10 août 2006 à 00:08
fabienquillet Messages postés 3 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 27 juin 2007 - 27 juin 2007 à 13:20
bonjour,


je vous explique un peu la situation: j'ai un fichier .txt avec
plusieurs colonnes et j'aimerai faire un graphe des colonnes 2,3
etc  en fonction de la colonne 1...

D'apres les quelques recherches que j'ai faite, il faudrait que j'utilise 'using' dans la syntaxe gnuplot.

J'aimerai donc savoir comment je peux directement appeler gnuplot a
partir d'un programme c++ pour que l'afficahge du graphe se fasse
directement à l'execution du programme.

Il me semble qu'il faut utiliser la fonction 'system' mais je n'en suis pas sur


Si quelqu'un peut m'aider...

12 réponses

turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
10 août 2006 à 09:43
Oui, c'est ca; tu dois utiliser system.

Essaye deja de trouver la bonne ligne de commande en la tappant
directement dans la console, une fois que tu la trouver, tu l'appel
dans ton prog avec system :


system("gnuplot argument");

TuRn3r
0
keno83 Messages postés 16 Date d'inscription lundi 24 juillet 2006 Statut Membre Dernière intervention 6 septembre 2006
10 août 2006 à 21:25
ok

et est ce qu'il est possible de faire varier une variable dans l'argument

Par la je veux dire, j'ai un fichier avec plusieurs colonnes.

Pour faire le graphe de la colonne 2 en fonction de la colonne 1 j'aurai dans l'argument quelque chose du genre 'using 1:2'...

serait il alors possible de faire varier le 2 du genre a avoir


for (k=0,k<size,k++)

system('........using 1:k')
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
10 août 2006 à 21:38
oui, formatte la chaine avant de l'envoyer

std::stringstream cmd:
for (k=0,k<size,k++)
{
    cmd << "gnuplot using 1:" << k ;

    system(cmd.str.c_str());
}

ou si tu est en C utilise sprintf à la place, l'idée reste la même

TuRn3r
0
keno83 Messages postés 16 Date d'inscription lundi 24 juillet 2006 Statut Membre Dernière intervention 6 septembre 2006
10 août 2006 à 22:40
merci pour tes reponses j'essaie ca de suite...

par contre petite question pour comprendre un peu ce que tu m'indiques:

pourquoi le 'size_t' devant k=0,k<size,k++)

qu'est ce que cela signifie


deuxieme petite question: il doit y avoir un en-tete a rajouter pour utiliser stringstream,non


et derniere question: si je me fie a tes dires, la syntaxe de mon programme doit donc etre:


std::stringstream cmd;

for(size_t k=0;k<size;k++)

{

cmd<<"gnuplot plot 'res.txt' using 1:"<<k;


system(cmd.str().c_str());

}


En tout cas merci  beaucoup pour toutes tes indications
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
10 août 2006 à 23:48
pourquoi le 'size_t'
--> size_t correspond à un unsigned int, c'est exactement pareil mais plus sourt à écrire (faignantise pure)

deuxieme petite question: il doit y avoir un en-tete a rajouter pour utiliser stringstream,non
--> oui : <sstream>

et derniere question: si je me fie a tes dires, la syntaxe de mon programme doit donc etre:

std::stringstream cmd;
for(size_t k=0;k<size;k++)
{
cmd<<"gnuplot plot 'res.txt' using 1:"<<k;

system(cmd.str().c_str());
}
--> oui mais pourquoi ton fichier est entre ' ', je suis pas sur que ce soit utile (à vérifier néanmoins)

TuRn3r
0
keno83 Messages postés 16 Date d'inscription lundi 24 juillet 2006 Statut Membre Dernière intervention 6 septembre 2006
11 août 2006 à 21:55
merci  pour toutes tes indications, je pense arriver a la solution

par contre petit souci:

lorsque j'ecris cmd<<"gnuplot plot 'res.txt' using 1:"<<k

a l'execution, le compilateur me dit qu'il ne trouve pas le fichier
plot, ce qui laisse penser que la déclaration 'gnuplot plot 'res.txt'
using ... n'est pas la bonne...

si quelqu'un sait quelle est la syntaxe a utiliser


merci d'avance
0
fabienquillet Messages postés 3 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 27 juin 2007
27 juin 2007 à 10:29
je voudrai appeller la fonction gnuplot avec un programme c est ce que tu connais la syntaxe
merci d'avance
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
27 juin 2007 à 10:37
gp = popen(GNUPLOT_PATH,"w");
if(gp == NULL){
fprintf(stderr, "Oops, I can’t find %s.", GNUPLOT_PATH);
exit(EXIT_FAILURE);
}
fprintf(gp,"reset \n");
fprintf(gp,"set term windows \n");
fflush(gp);
fprintf(gp,"set grid x y \n");
fflush(gp);
fprintf(gp,"set title "Répartition des nombres générés par le pnrg r250 pour %d de tirages" tc lt 0 \n",max_generation);
fflush(gp);
// fprintf(gp,"set xlabel \'Ensemble\' tc lt 0 \n");
// fflush(gp);
fprintf(gp,"set ylabel \'Nombre de tirages \' tc lt 0 \n");
fflush(gp);
fprintf(gp,"set xr [0:1]\n");
fflush(gp);
fprintf(gp,"set yr [0:%d]\n",(int)(1.2*max_generation/nbr_case));
fflush(gp);
fprintf(gp,"set xtics\n");
fflush(gp);
fprintf(gp,"set ytics\n");
fflush(gp);
fprintf(gp,"plot \'%s\' u 1:2 title "" with boxes fs solid 0.7\n",fp1);
fflush(gp);
fprintf(gp,"set nokey \n");
fflush(gp);
fprintf(gp,"set label "{/Symbol c}^2 = %f" tc lt 16 at 0.1,%d \n",chi_2,(int)(1.1*max_generation/nbr_case));
fflush(gp);
fprintf(gp,"set label "dl = %d" tc lt 16 at 0.4,%d \n",
(int)(nbr_case-1),(int)(1.1*max_generation/nbr_case));
fflush(gp);
fprintf(gp,"set label "{/Symbol c}^{2}_{crit}(%d,%1.2f)= %3.3f" at 0.65,%d\n",
(int)(nbr_case-1.),0.05,123.54,
(int)(1.1*max_generation/nbr_case));
fflush(gp);
fprintf(gp,"set encoding iso_8859_1 \n");
fflush(gp);
fprintf(gp,"set term post eps landscape enhan mono "Times-Roman" 18 \n");
fflush(gp);
fprintf(gp,"set output "%s.eps"\n",fp2);
fflush(gp);
fprintf(gp,"replot\n");
fflush(gp);
getchar();
fprintf(gp,"reset\n");
fflush(gp);
fclose(gp);








TuRn3r
0
fabienquillet Messages postés 3 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 27 juin 2007
27 juin 2007 à 10:55
en fait je suis sous linux et dans le terminal je tape gnuplot toto.gnuplot pour afficher un champs de vecteur, j'aimerai que cette commande se fasse a partir de mon progamme c.
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
27 juin 2007 à 11:16
int main ()
{
...
 
// AFFICHAGE GRAPHQUE:
f = popen("gnuplot", "w");

// execution de la commande gnuplot
fprintf(f, " plot "toto.gnuplot" with lines\n");

fflush(f);

// terminer l'envoi de commande et fermer gnuplot
sleep (10000);
pclose(f);

return0;
}
 








TuRn3r
0
fabienquillet Messages postés 3 Date d'inscription vendredi 2 mars 2007 Statut Membre Dernière intervention 27 juin 2007
27 juin 2007 à 13:20
je te remerci ça m'a aidé à mieux comprendre popen
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
10 août 2006 à 21:40
oui, tu es en C++, j'avias pas vu, fais ca ca devrai marcher (si la syntaxe est bonne)

std::stringstream cmd;
for (size_t k=0, k<size, k++)
{
    cmd << "gnuplot using 1:" << k ;

    system(cmd.str().c_str());
}

TuRn3r
-1
Rejoignez-nous