che cosa intendi in pratica? Fai un esempiokiroken ha scritto: intendo comunicare con gnuplot come se stessi scrivendo su di un file con le fwrite. In poche parole collegare ad esempio lo stdout del programma c con lo stdin di gnuplot così puoi interagire con gnuplot in modo interattivo (a quanto ho capito gnuplot prevede interattività). Con echo dai un comando e poi basta.
[c]utilizzare gnuplot [RISOLTO]
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
Re: [c]utilizzare gnuplot
beh diciamo che vorrei ottenere il risultato di però a runtime ovvero lanciando gnuplot dentro al programma radice e concatenare gli stream
Codice: Seleziona tutto
./radice | gnuplothttp://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
d95555c36aeeee715c0a34ce1e4dd713
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
se non ho capito male, già come ho fatto io funziona.
Si, ma in pratica quali operazioni vuoi eseguire? vuoi che l'output del programma c compaia in gnuplot?
Non mi è chiaro proprio quello che vorresti fare in concreto ::)
Si, ma in pratica quali operazioni vuoi eseguire? vuoi che l'output del programma c compaia in gnuplot?
Non mi è chiaro proprio quello che vorresti fare in concreto ::)
Re: [c]utilizzare gnuplot
ehm forse ho compreso male il funzionamento di gnuplot quindi quello che voglio fare non ha senso con questo programma.
Potrei chiedere ad esempio questo a gnuplot?
Potrei chiedere ad esempio questo a gnuplot?
Codice: Seleziona tutto
gnuplot
// ora posso scrivere le richieste a gnuplot
f(x)=2y //mostrami il grafico di questa funzione
// attendo 40 secondi
f(x)=4y //ora mostrami il grafico di quest'altra il tutto senza chiudere l'istanza di gnuplothttp://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
d95555c36aeeee715c0a34ce1e4dd713
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
si certo, credo che si possa farekiroken ha scritto: ehm forse ho compreso male il funzionamento di gnuplot quindi quello che voglio fare non ha senso con questo programma.
Potrei chiedere ad esempio questo a gnuplot?Codice: Seleziona tutto
gnuplot // ora posso scrivere le richieste a gnuplot f(x)=2y //mostrami il grafico di questa funzione // attendo 40 secondi f(x)=4y //ora mostrami il grafico di quest'altra il tutto senza chiudere l'istanza di gnuplot
Qualche post sopra avevo segnalato una libreria c che utilizza gnuplot.
Comunque puoi chiamare più di una volta la funzione system:
- la prima volta per chiamare la prima plot
- poi dai un comando tipo delay
- chiami una seconda volta plot
Ultima modifica di cristian_c il domenica 19 aprile 2009, 0:05, modificato 1 volta in totale.
Re: [c]utilizzare gnuplot
si ma con system crei due istanze di gnuplot non è la stessa cosa 
non parlo di usare le librerie c di gnuplot dentro a radice, ma radice che comunica con la stessa istanza di gnuplot
non parlo di usare le librerie c di gnuplot dentro a radice, ma radice che comunica con la stessa istanza di gnuplot
http://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
d95555c36aeeee715c0a34ce1e4dd713
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
Questo è un po' diverso e dovrebbe essere un utility da usare in accoppiata con Emacs per comporre script da utilizzare con Gnuplot
feff.phys.washington.edu/~ravel/software/gnuplot-mode/gpelcard.pdf
feff.phys.washington.edu/~ravel/software/gnuplot-mode/gpelcard.pdf
gnuplot-delay [0.01]
Time in seconds to allow the gnuplot display to
update. Increase this number if the prompts and
lines are displayed out of order.
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
Ho fatto qualche modifica al programma riducendo il campo di visualizzazione della funzione ai soli numeri positivi (per ovvi motivi dovuti ai problemi riscontrati alcuni post fa) e ho impostato la scala logaritmica per l'asse x.
Purtroppo però in compilazione sono occorsi degli errori inaspettati.
Intanto posto il codice:
Ed ecco gli errori:
a cosa può essere dovuto e come posso risolvere? :-\ ::) ??? :-[
Purtroppo però in compilazione sono occorsi degli errori inaspettati.
Intanto posto il codice:
Codice: Seleziona tutto
#include <stdio.h>
#include <math.h>
#define ERR 0.00001
int ordine(double x)
{
int n=0;
while (floor(x)!=0) {
x=x/10;
n++;
}
return n+1;
}
main()
{
char *indice[]={"quadrata","cubica","quarta","quinta","sesta","settima","ottava","nona","decima"};
long double a,b,m,x;
long double fm,pot;
int n,i,res;
char x_str[50];
printf("\n// il programma calcola la radice\n// di un numero reale positivo scelto dall'utente\n// con indice intero immesso da tastiera\n\n");
do {
printf("Inserire un indice valido per la radice(un numero intero da 1 a 10): ");
res=scanf("%d",&n);
while(getc(stdin)!='\n');
} while((n<1 || n>10) && (res==0));
do {
printf("Inserire un valore reale di cui calcolare la radice: ");
res=scanf("%s",&x_str);
while(getc(stdin)!='\n');
} while(res==0);
sscanf(x_str,"%Lf",&x);
if (x>=0) {
if (n==1) printf("\nla radice prima di %Lf è %Lf\n",x_str,x_str);
else if (x==1) printf("\nla radice %s di 1 è 1\n\n",indice[n-2]);
else {
if (x>1) {
a=1; b=x;
}
else {
a=x; b=1;
}
do {
m=(a+b)/2;
pot=m;
for(i=1;i<n;i++) pot*=m;
fm=pot-x;
if (fm!=0) {
if (fm>0) b=m;
else a=m;
}
} while (fabs(fm)>ERR);
printf("\nla radice %s di %s è %Lg\n\n",indice[n-2],x_str,m);
}
char cmd[100];
float f = 1/(float)n;
sprintf(cmd,"echo \"set logscale x 10;plot[0:(%d)]x**(%f)\" | gnuplot -persist",ordine(x),f);
system(cmd);
}
else printf("Il numero reale digitato non è positivo.\n\n");
}Codice: Seleziona tutto
cristiancozzolino@cristian-desktop:~/programmazione$ gcc radice.c -o radice -lm
radice.c: In function ‘main’:
radice.c:32: warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[50]’
radice.c:37: warning: format ‘%Lf’ expects type ‘long double’, but argument 2 has type ‘char *’
radice.c:37: warning: format ‘%Lf’ expects type ‘long double’, but argument 3 has type ‘char *’
cristiancozzolino@cristian-desktop:~/programmazione$
Re: [c]utilizzare gnuplot
per il primo leva & a x_str. x_str è già un puntatore all'array
Per gli ultimi due devi convertire gli array di char in long double
Per gli ultimi due devi convertire gli array di char in long double
http://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
d95555c36aeeee715c0a34ce1e4dd713
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
grazie per aver risposto! 
Per il primo ho risolto, per gli altri due pensavo che la sscanf servisse proprio a fare la conversione:
Per il primo ho risolto, per gli altri due pensavo che la sscanf servisse proprio a fare la conversione:
Codice: Seleziona tutto
sscanf(x_str,"%Lf",&x);Re: [c]utilizzare gnuplot
si ma poi se ci passi x_str non funziona 
http://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
d95555c36aeeee715c0a34ce1e4dd713
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
eppure la sintassi che ho utilizzato è corretta: http://digilander.libero.it/uzappi/C/librerie/funzioni/scanf.html ::)kiroken ha scritto: si ma poi se ci passi x_str non funziona![]()
Re: [c]utilizzare gnuplot
intendevo dire che ti da errore qua perchè invece di passarci le long double gli hai passato dei char *
Codice: Seleziona tutto
if (n==1) printf("\nla radice prima di %Lf è %Lf\n",x_str,x_str);http://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
d95555c36aeeee715c0a34ce1e4dd713
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
Grazie kiroken per l'aiuto e per avermi segnalato l'errorekiroken ha scritto: intendevo dire che ti da errore quaperchè invece di passarci le long double gli hai passato dei char *Codice: Seleziona tutto
if (n==1) printf("\nla radice prima di %Lf è %Lf\n",x_str,x_str);
Ora in compilazione non ricevo più errori, ma in esecuzione invece si. Infatti la finestra di gnuplot non compare, ma viene segnalato un errore in output:
Codice: Seleziona tutto
cristiancozzolino@cristian-desktop:~/programmazione$ ./radice
// il programma calcola la radice
// di un numero reale positivo scelto dall'utente
// con indice intero immesso da tastiera
Inserire un indice valido per la radice(un numero intero da 1 a 10): 5
Inserire un valore reale di cui calcolare la radice: 3456
la radice quinta di 3456 è 5.1017
line 0: x range must be greater than 0 for log scale
cristiancozzolino@cristian-desktop:~/programmazione$
Re: [c]utilizzare gnuplot
prova a far stampare tutti i comandi che invii a system così ti accorgi subito se tenti di inviargli qualcosa di non corretto
http://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
d95555c36aeeee715c0a34ce1e4dd713
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
non mi è chiara la modalità in cui farlo ::)kiroken ha scritto: prova a far stampare tutti i comandi che invii a system così ti accorgi subito se tenti di inviargli qualcosa di non corretto
Re: [c]utilizzare gnuplot
Codice: Seleziona tutto
sprintf(cmd,"echo \"set logscale x 10;plot[0:(%d)]x**(%f)\" | gnuplot -persist",ordine(x),f);
printf("il comando che invio è %s\n", cmd);
system(cmd);http://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
d95555c36aeeee715c0a34ce1e4dd713
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
Grazie!kiroken ha scritto:cosìCodice: Seleziona tutto
sprintf(cmd,"echo "set logscale x 10;plot[0:(%d)]x**(%f)" | gnuplot -persist",ordine(x),f); printf("il comando che invio è %s\n", cmd); system(cmd);
Codice: Seleziona tutto
cristiancozzolino@cristian-desktop:~/programmazione$ ./radice
// il programma calcola la radice
// di un numero reale positivo scelto dall'utente
// con indice intero immesso da tastiera
Inserire un indice valido per la radice(un numero intero da 1 a 10): 5
Inserire un valore reale di cui calcolare la radice: 3456
la radice quinta di 3456 è 5.1017
il comando che invio è echo "set logscale x 10;plot[0:10**(5)]x**(0.200000)" | gnuplot -persist
line 0: x range must be greater than 0 for log scale
cristiancozzolino@cristian-desktop:~/programmazione$
Re: [c]utilizzare gnuplot
controllare se la sintassi con cui hai invocato il comando è corretta usando i manuali io non lo conosco gnuplot"set logscale x 10;plot[0:10**(5)]x**(0.200000)" | gnuplot -persist
http://petition.stopsoftwarepatents.eu/
d95555c36aeeee715c0a34ce1e4dd713
d95555c36aeeee715c0a34ce1e4dd713
- cristian_c
- Accecante Asceta

- Messaggi: 23422
- Iscrizione: lunedì 29 ottobre 2007, 11:31
Re: [c]utilizzare gnuplot
copio incollo dal manuale ^_^
4.3 Specificare il dominio e il codominio
Il comando splot traccia automaticamente il grafico della funzione per x ∈ [−10; 10] e per y ∈
[−10; 10] e adattando l’asse delle z ai valori cos` ottenuti. Molte volte abbiamo per` la necessit`
di tracciare il grafico per valori di x e di y diversi da quelli di default. Se x1,x2,y1,y2,zi,z2
sono numeri reali un primo modo per ottenere il risultato voluto ` quello di utilizzare splot con
la seguente sintassi:
plot[x1:x2][y1:y2][z1:z2]f(x,y) viene specificato sia dominio che codominio
plot[x1:x2][y1:y2]f(x) viene specificato solo il dominio
plot[][][z1:z2]f(x) viene speciticato solo il codominio
In questo modo i valori specificati per il dominio e codominio valgono solo per il grafico che
stiamo tracciando.
6.3 Usare la scala logaritmica
Per impostare la scala logaritmica si usa il comando:
set logscale asse base
in cui asse ` x,y,z o qualunque combinazione due a due di questi valori, e base ` la base
logaritmica prescelta.
Per eliminare la scala logaritmica si usa il comando:
set nologscale asse
in cui asse ` x,y,z o qualunque combinazione due a due di questi valori.
Per eliminare tutte le scale logaritmiche impostate si usa il comando:
set nologscale
mentre per vedere la situazione delle scale logaritmiche impostate si usa il comando:
show logscale.
Per ulteriori precisazioni si veda l’help in linea richiamabile con help set logscale
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti
