みんなの「教えて(疑問・質問)」にみんなで「答える」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);
}

投稿日時 - 2010-01-09 02:24:07

QNo.5578819

すぐに回答ほしいです

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

C言語のプログラムの世界とC言語のプログラムが作り出すgnuplotのプログラムの世界を区別して捉えないと混乱の素です。(プログラムとプログラムが作り出すプログラムとを区別して考えるのはなかなか難しいので、ある程度経験をつませずに出した課題とすればかなりひどい)

つまり、短針と長針が出ないのは
> for文の使い方と
> 最後のほうのpauseの使い方が間違っていると思うのですが
という問題ではないです。
(for文の中のgnuplotに与える文に改行(\n)がないのはいただけませんが)
(for文の後のgnuplotに与える文も文頭にコマンドがついておらず、改行(\n)で終わらない変な文があるようですが)

fprintf(gp, "plot sin(t),cos(t)");はC言語で書かれたプログラムで、
この中にあるplot sin(t),cos(t)はgnuplotに与えるプログラムです。
gnuplotにはpopenで開かれたpipeを通じてプログラムが与えられます。

pi=3.14;やtheta=k;はC言語でpiやthetaにkを代入していますが、
これらの代入をgnuplotに与えるプログラムは知らないので、
fprintf(gp,"set a=0.5*pi-(theta*pi)/180.0");
が出力するコードset a=0.5*pi-(theta*pi)/180.0は
知らない変数が出てきたということでエラーでしょう。
そして、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はaへの代入が出来ていない時点で実行されないと思います。

正しくは、fprintf(gp, "set pi=%lf", pi);と書いてgnuplotの世界にC言語の世界のpiの値を教えてあげることでしょうか。(教えるべき値はpiのほかにもありますが)

あと、課題の内容がわからないのでなんとも言えませんが、
この部分を解決すれば短針と長針はとりあえず出ると思います。
デバッグするにはpopenではなく、gp=stdoutして標準出力に出力したものを
gnuplotにリダイレクトしてみたほうがわかりやすいかもしれませんが...

投稿日時 - 2010-01-09 04:29:20

お礼

詳しい説明ありがとうございます

指摘された箇所を直し、またa,b,thetaもfprintf(gp, "set の形で書いてみたのですが、まだa,b,thetaは一度も使われていませんと出てきます

質問を新しくしたので時間があったら回答お願いします

投稿日時 - 2010-01-09 15:46:47

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問