• ベストアンサー

gnuをc言語に通して時計を作る という課題をやっています ビルドした結果、a、b、theta、のローカル変数は一度も使われておりませんと出てきてしまい、時計の針が出てきません fprintf(gp, "set a=%lf, a"); fprintf(gp, "set b=%lf, b"); fprintf(gp, "set theta=%lf, theta"); と設定したつもりですがどこがどう間違えてるかわかりません お願いします。下にソースファイルのプログラムを載せときました #include "stdafx.h" //この文は通常、不要。単純アプリやHello worldを選ぶと必要。 #include <stdio.h> // はずしても通る #include <stdlib.h> #include <math.h> //数学関数の呼び出しに使用する。 #define GNUPLOT_PATH "C:/FUJITA/gnuplot/bin/pgnuplot" int main(int argc, char* argv[]) { double a,b,theta,k; FILE *gp; 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 title Clock \n"); fprintf(gp, "set size square \n"); fprintf(gp, "set key off\n"); fprintf(gp, "unset border \n"); fprintf(gp, "unset xtics \n"); fprintf(gp, "unset ytics \n"); fprintf(gp, "set grid \n"); fprintf(gp, "set parametric \n"); fprintf(gp, "set xrange [-1:1] \n"); fprintf(gp, "set yrange [-1:1.2] \n"); fprintf(gp, "set pi=%lf, pi \n"); fprintf(gp, "set a=%lf, a"); fprintf(gp, "set b=%lf, b"); fprintf(gp, "set theta=%lf, theta"); fprintf(gp, "set grid \n"); for (k=0; k<10; k++){ fprintf(gp,"theta=k \n"); fprintf(gp,"set a=0.5*pi-(theta*pi)/180.0 \n"); fprintf(gp,"set b=0.5*pi-(theta*pi)/(180.0*12.0)"); fprintf(gp,"set arrow 1 from 0.0,0.0 to 0.4*cos(b),0.4*sin(b) front size 0.1,30 lt 5 lw 5 \n"); fprintf(gp,"set arrow 2 from 0.0,0.0 to 0.8*cos(a),0.8*sin(a) front size 0.1,15 lt 5 lw 3 \n"); } fprintf(gp," set arrow 1 from 0.0,0.0 to 0.4*cos(b),0.4*sin(b) front size 0.1,30 lt 5 lw 5\n""0.4*cos(b),0.4*sin(b) \n"); fprintf(gp," set arrow 2 from 0.0,0.0 to 0.8*cos(b),0.8*sin(b) front size 0.1,15 lt 5 lw 3\n","0.8*cos(a),0.8*sin(a) \n"); fprintf(gp,"plot sin(t),cos(t)\n"); fprintf(gp,"pause 100 \n"); return (0); }

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

C言語でプログラムを書く前に、gnuplotに直接描画コマンドを入力して時計を描画することはできているのでしょうか? 今の命令列だと、set title Clock の部分で既に下記のようなエラーが出るはずです。gnuplotに与える命令列を完全なものにしてから、それをどのようにC言語で生成するかを考えたほうがいいと思います。 gnuplot> reset gnuplot> set title Clock undefined variable Clock あと、gnuplotのことをgnuと勝手に略すのはやめて欲しいです。コンピュータ関連の世界では、GNUというのは普通全く別のものを指すので。

参考URL:
http://ja.wikipedia.org/wiki/Gnuplot,http://ja.wikipedia.org/wiki/GNU
ikeike_200
質問者

お礼

ありがとうございます

その他の回答 (1)

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.1

fprintf(gp, "set a=%lf, a"); fprintf(gp, "set b=%lf, b"); fprintf(gp, "set theta=%lf, theta"); 変数(引数)を「"」の中に入れてどうしたいの? fprintf(gp, "set a=%lf", a); fprintf(gp, "set b=%lf", b); fprintf(gp, "set theta=%lf", theta); でしょ? (他は、全く見ていないです。)

ikeike_200
質問者

お礼

ありがとうございます

関連するQ&A

  • c言語とgnu

    gnuをc言語に通すプログラムを作っているのですが 教授に聞きにいっても、教えてくれずに本当に困っています 時計の針を動かすプログラムを作りたいのですが 時計の針が出てきません for文の使い方と 最後のほうのpauseの使い方が間違っていると思うのですが どこがどう間違ってるのか教えてくださいお願いします プログラム #include "stdafx.h" //この文は通常、不要。単純アプリやHello worldを選ぶと必要。 #include <stdio.h> // はずしても通る #include <stdlib.h> #include <math.h> //数学関数の呼び出しに使用する。 #define GNUPLOT_PATH "C:/FUJITA/gnuplot/bin/pgnuplot" int main(int argc, char* argv[]) { double theta,a,b,k,pi; pi=3.14; FILE *gp; 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 title Clock \n"); fprintf(gp, "set size square \n"); fprintf(gp, "set key off\n"); fprintf(gp, "unset border \n"); fprintf(gp, "unset xtics \n"); fprintf(gp, "unset ytics \n"); fprintf(gp, "set grid \n"); fprintf(gp, "set parametric \n"); fprintf(gp, "set xrange [-1:1] \n"); fprintf(gp, "set yrange [-1:1.2] \n"); fprintf(gp, "set grid \n"); for (k=0; k<10; k++){ theta=k; fprintf(gp,"set a=0.5*pi-(theta*pi)/180.0"); fprintf(gp,"set b=0.5*pi-(theta*pi)/(180.0*12.0)"); fprintf(gp,"set arrow 1 from 0.0,0.0 to 0.4*cos(b),0.4*sin(b) front size 0.1,30 lt 5 lw 5"); fprintf(gp,"set arrow 2 from 0.0,0.0 to 0.8*cos(a),0.8*sin(a) front size 0.1,15 lt 5 lw 3"); } fprintf(gp," set arrow 1 from 0.0,0.0 to 0.4*cos(b),0.4*sin(b) front size 0.1,30 lt 5 lw 5\n""0.4*cos(b),0.4*sin(b)"); fprintf(gp," set arrow 2 from 0.0,0.0 to 0.8*cos(b),0.8*sin(b) front size 0.1,15 lt 5 lw 3\n","0.8*cos(a),0.8*sin(a)"); fprintf(gp,"plot sin(t),cos(t)\n"); fprintf(gp,"pause 100 \n"); return (0); }

  • C言語における漢字の取り扱いについて??

    C言語とgnuplotを利用して下記のプログラムを書きました。 #include<iostream> #include<cstdio> #include<stdio.h> using namespace std; #define GNUPLOT_PATH "C:/gnuplot/gnuplot/binary/gnuplot.exe" int main() { FILE *gp; char s[100]; scanf("%s", s); gp = _popen(GNUPLOT_PATH, "w"); if (gp == NULL) { fprintf(stderr, "Oops, I can't find %s.", GNUPLOT_PATH); exit(EXIT_FAILURE); } // gnuplotにコマンドを送る fprintf(gp, "set terminal png\n"); fprintf(gp, "set output 'plot_sample.png'\n"); //fprintf(gp, "set "xl 距離"\n"); fprintf(gp, "set title '%s'", s); fprintf(gp, "set xrange [-pi:pi]\n"); fprintf(gp, "plot sin(x), (x+1)*x*(x-1)\n"); fflush(gp); // バッファに格納されているデータを吐き出す(必須) //getchar(); // 入力待ち _pclose(gp); exit(EXIT_SUCCESS); } ここでscanf(%s,s);のところでsに、あア亜と入力しました。 最終的にpngの画像としてあア亜と出力させようとしているのですが、文字化けして文字がうまくひょうじされていません。 なぜ、うまくいかないのかわかっていません。 pngにおける文字の取り扱いの問題なのかC言語における文字の取り扱いなのかと考えて解決策を考えているのですが、うまくいきません。 もしわかる方がいましたら教えていただけないでしょうか? よろしくお願いいたします。

  • gnuplotをC言語で操作する方法

    C言語を用いてgnuplotを操作しデータファイルから自動的にグラフを作成するプログラムを作ろうとしています。 使用環境はWindows7、VisualStudio2010です。 ほとんどの部分はうまくいったのですが一部分が正しく表示されません。 軸の目盛ラベルの表示フォーマット設定のコマンドで set format x "%.1f" として小数点以下一桁を強制的に表示させるためC言語でパイプを用いて #define GNUPLOT_PATH "C:/gnuplot/binary/pgnuplot.exe" int plot(char *file_name){ FILE *gp; gp = _popen(GNUPLOT_PATH, "w"); fprintf(gp, "set title 'TEST PLOT'\n"); : (中略) : fprintf(gp, "set format x '%.1f' \n");//この部分が正しく反映されません。 : (中略) : fprintf(gp, "plot '%s' using 1:2 with linespoints lt 4 lw 5 pt 6 ps 2.0 lc rgb 'red'\n",file_name); fprintf(gp,"quit \n"); fflush(gp); _pclose(gp); return 0; } '%.2f' の部分をいろいろいじってみたのですがうまくいかず、なぜできないのか原因がわかりません。 fprintf()の数値代入の %f と混ざってしまっているのでしょうか?

  • 入力を待たずにstdinの監視をしたい(C言語)

    こんにちは.タイトルのままなのですが,c言語でstdinに何かが入力されるまで待つことなく,stdinの監視がしたいです.例えば, whileループを回してる最中に,qがstdinに入力されたらbreakするけど,あとは普通に回る,みたいな感じにしたいです.fgetc(stdin)とすると,毎回入力を待つことになるので,待たないで回る方法が知りたいです. 具体的には,以下はgnuplotにsinカーブを表示するプログラムですが,コメントアウトしてある /* if((buf = fgetc(stdin)) == 'q'){ break; } */ の部分のようにすると毎回とまってしまいます.これを,毎回入力を待たずに,qを打ったら止まるようにするにはどうするのが普通なのでしょうか. 返信おまちしております. #include <stdio.h> #include <math.h> #include <unistd.h> FILE *gp; #define omega (M_PI/2) #define A 1 #define N 10 int i; int j; double x, t; int main(void) { gp = popen(gnuplot, "w"); fprintf(gp, "set xrange [0:11]\n"); fprintf(gp, "set yrange [-3.5:3.5]\n"); fprintf(gp, "set xlabel \"x\"\n"); fprintf(gp, "set ylabel \"y\"\n"); char buf; for (j = 0; j < N*160; ++j) { usleep(5000); /* if((buf = fgetc(stdin)) == 'q'){ break; } */ fprintf(gp, "plot '-' with lines linetype 1\n"); for (i = 0; i < j+1; ++i) { t = 0.1*i; x = A*sin(omega*t); fprintf(gp, "%f\t%f\n", t/10, x); } fprintf(gp, "e\n"); } fprintf(gp, "exit\n"); fflush(gp); pclose(gp); return 0; }

  • gnuplotでreplotできない??

    下記のプログラムを書きました。 下記のプログラムでは1枚のグラフの複数のグラフをどんどん重ね、さらに1つのemfファイルとして出力し保存しようとしています。 しかし、問題が発生しました。 プログラム中のfprintf(gp, "replot (x+1)*x*(x-1)\n");を消すとプログラムは動くのですがreplotがあるとうまく画像ファイルが保存されません。 emfファイルはできている(ファイル容量は0ではない。)のですが、emfファイルが壊れており見ることができません。 その理由がわかる方がいましたら、教えていただけないでしょうか? よろしくお願いします。 以下、書いたプログラムです。 #include <stdio.h> #include <windows.h> #include <tchar.h> #include <string> #include<conio.h> using namespace std; #define GNUPLOT_PATH "C:/gnuplot/gnuplot/binary/gnuplot.exe" //char *a[10]; char a[10][50]; long n; long l; int main() { FILE *gp; gp = _popen(GNUPLOT_PATH, "w"); if (gp == NULL) { fprintf(stderr, "Oops, I can't find %s.", GNUPLOT_PATH); exit(EXIT_FAILURE); } // gnuplotにコマンドを送る fprintf(gp, "set terminal emf color 'Ryumin-Light-EUC-H' 16\n"); fprintf(gp, "set output '%s.emf'\n", a[n]); fprintf(gp, "set title '日本語-入力テスト'\n"); //x軸の範囲の設定 //fprintf(gp, "set xrange [-60:60]\n"); //fprintf(gp, "set yrange [0:3]\n"); fprintf(gp, "set grid\n"); fprintf(gp, "set datafile separator ','\n"); fprintf(gp, "set datafile separator ','\n"); fprintf(gp, "set key bottom outside\n"); fprintf(gp, "plot sin(x)\n");     fprintf(gp, "replot (x+1)*x*(x-1)\n"); fflush(gp); // バッファに格納されているデータを吐き出す(必須) //getchar(); // 入力待ち _pclose(gp); exit(EXIT_SUCCESS); return 0; }

  • gnuplot で2本のグラフを一つにまとめる

    表示したいデータ X   Y1    Y2 2.000  3.0   -86.10 2.167  15.0   -90.64 2.333  21.0   -87.25 2.500   6.0    -84.04 表示するプログラム #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> char output_file[128]; int main(void){ sprintf(output_file,"./output.txt"); FILE *gp = popen("gnuplot -persist","w"); fprintf(gp, "set terminal png\n"); fprintf(gp, "set xrange [1:3]\n"); fprintf(gp, "set xtics 1,1,3\n"); fprintf(gp, "set mxtics 6\n"); fprintf(gp, "set xlabel 'Hour'\n"); fprintf(gp, "set yrange [0:50]\n"); fprintf(gp, "set ytics 0,5,50\n"); fprintf(gp, "set ylabel 'mm/h'\n"); fprintf(gp, "set y2range [-90:-75]\n"); fprintf(gp, "set y2tics -90,5,-75\n"); fprintf(gp, "set ytics nomirror\n"); fprintf(gp, "set my2tics 5\n"); fprintf(gp, "set y2label 'dbm'\n"); fprintf(gp, "set output './output.png'\n"); fprintf(gp, "set title 'Rain and Attenuation'\n"); fprintf(gp, "plot './output.txt' using 1:2 with lines linetype 1 ,'./output.txt' using 1:3"); } 左横軸は0から50までとなりました。 右横軸はー90からー80までとなりました。 XvsY1の曲線は左横軸に対応して正しく表示されました。 ただし、XvsY2の曲線は表示されませんでした。 解決法を教えてください。

  • gnuplotの出力グラフ名を外部で書き換えたい

    LINUX上のCからgnuplotを用い、適当なデータを作成し、グラフを1枚作成することに成功しました。今後はループ処理によって、データ名とグラフ名を替えながら大量のデータ処理をするつもりです。 gnuplotに送りこむデータ名の変更の仕方、グラフ名の変更の仕方を教えてください。 'out.data','out.png'を書き換える方法です。例えば’out1.data'から'out1000.data'。'out1.png'から'out1000data'のようにできれば、1000個のデータを処理し1000枚のグラフを作成できます。 下記に適当なグラフを出力するプログラム例を示します。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main(void){ FILE *data, *gp char *data_file; int i; double x,y; //make data file data_file="out.data"; data = fopen(data_file,"w"); for(i=0;i<=5;i++){ x=i; x=i*i; fprintf(data,"%f\t%f\n",x,y); } fclose(data); //make graph gp=popen("gnuplot -persist","w"); fprintf(gp,"set terminal png\n"); fprintf(gp,"set xrange [0:5]\n"); fprintf(gp,"set yrange [0:50]\n") fprintf(gp,"set output 'out.png'\n"); fprintf(gp,"plot \"%s\"with lines linetype 1 \n", data_file); pclose(gp); return(gp); return 0; }

  • 初めてのC言語 

    半径rで円周をだすプログラムを作りたいのですが作ってみたところ答えが0.00しかでてきません。 どこが間違っているのでしょうか。 #include <stdio.h> #define PI 3.14159265358979 /* 円周率 */ int main(void) { double r,a; printf("r="); scanf("%lf",&r); a=r*2*PI; printf("r*2*PI=%5.2lf\n",a); return 0; }

  • Cプログラミングの質問なのですが,

    Cプログラミングの質問なのですが, 以下のプログラムで正規乱数を発生させたいのですが,どこがおかしいのでしょうか? fp1のransuuはきちんとtxtで作成されています。 至急お助けください。 #include <stdio.h> #include<stdlib.h> #include<math.h> #define PI 3.141592653589793238 int main (void) { FILE *fp1,*fp2; int i,n; unsigned int x1,x2; double y1,y2; fp1=fopen("ransu.txt","r"); fp2=fopen("seikiransu.txt","w"); for(i=0;i<n;i++) { fscanf(fp1,"%lf",&x1); fscanf(fp1,"%lf",&x2); y1=sqrt(2)*sqrt(-2*log(x1))*cos(2*PI*x2); fprintf(fp2,"%lf\n",y1); } fclose(fp1); fclose(fp2); return 0; }

  • フーリエ変換のC言語プログラムについて

    正弦波(およびガウス性雑音)をフーリエ変換(離散)→逆フーリエ変換するというプログラムを組みました。正弦波をフーリエ変換すると実部は2回ピークがくるはずなのですが、すべて「0.000000」または「-0.000000」と表示されてしまいます。虚部は正常なようで実装の仕方もさほど違わないので、何が問題なのかわからずにいます。念のためコードはすべて載せますが、該当箇所は関数Fourierの fp = fopen("reX.txt", "w"); //書き込む あたりです。問題点を教えていただけないでしょうか。お願いします。 //gauss.txt, sin.txt:発生させたガウス性雑音&正弦波 //reX, imX:フーリエ変換の実部と虚部 //re-1, im-1:逆フーリエ変換の実部と虚部 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define PI 3.14159265358979323846 #define N 256 //n:長さ, w:角周波数, p:位相(phase), a:振幅 void SinCurve(int n, double w, double p, double a) { FILE *fp; double x; int t; fp = fopen("sin.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x = a * sin( w*(double)t + p ); fprintf(fp, "%f\n", x); } } fclose(fp); } //n:長さ, s:分散, m:平均 void Gauss(int n, double s, double m) { FILE *fp; double x, x1, x2, y1; int t; srand((unsigned) time(NULL)); fp = fopen("gauss.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x1 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); x2 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); y1 = pow(-2.0*log(x1), 0.5) * cos(2.0*PI*x2); y1 = s * y1 + m; fprintf(fp, "%f\n", y1); } } fclose(fp); } //ファイル名sのデータをフーリエ変換し、実部と虚部をreX, imXに保存 void Fourier(int num, char *s) { FILE *fp; int k, n; double largeX, x[N+100], t; fp = fopen(s, "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { // printf("%s\n", s); for(k = 0; k < num; k++) { fscanf(fp, "%lf", &x[k]); printf("x[%d]=%f\n", k, x[k]); } } fp = fopen("reX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*(double)k / (double)N; for(n = 0; n < num; n++) { largeX += x[n] * cos((double)n*t); // printf("%f\n", largeX); } fprintf(fp, "%f\n", largeX); printf("reX[%d]=%f\n", k, largeX); } } fp = fopen("imX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*k / (double)N; for(n = 0; n < num; n++) { largeX -= x[n] * sin(n*t); } fprintf(fp, "%f\n", largeX); } } fclose(fp); } void InverseFourier(int num) { FILE *fp; int k, n; double a[N+100], b[N+100], x, t; //a:reX, b:imX fp = fopen("reX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &a[k]); // printf("a[%d]=%f\n", k, a[k]); } } fp = fopen("imX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &b[k]); // printf("b[%d]=%f\n", k, b[k]); } } fp = fopen("re-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; t = 2.0*PI*(double)n / (double)N; for(k = 0; k < num; k++) { x +=a[k] *cos(k*t) - b[k] *sin(k*t); } x /= (double)N; fprintf(fp, "%f\n", x); // printf("x[%d]=%f\n", n, x); } } /* fp = fopen("im-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; for(k = 0; k < num; k++) { t = 2.0*PI*(double)k / (double)N; x = x + a[k] *sin(n*t) + b[k] *cos(n*t); } x /= (double)N; fprintf(fp, "%f\n", x); } } */ fclose(fp); } int main(void) { SinCurve(N, PI/8.0, 0.0, 1.0); // Gauss(N, 1.0, 0.0); Fourier(N, "sin.txt"); // Fourier(N, "gauss.txt"); InverseFourier(N); return 0; }

専門家に質問してみよう