下記のプログラムを書きました。
下記のプログラムでは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;
}

このQ&Aに関連する最新のQ&A

A 回答 (2件)

過去の質問内容からして。


まずは、C/C++とgnuplotを分けて、それぞれの勉強してください。

gnuplotはCが無くても動作します。
テキストファイルに命令等を書いて
gnuplot テキストファイル
とコマンドラインから実行すればいいのです。また、gnuplotだけを実行すれば対話形式になって、一行ずつ入力しながらの確認ができます。

これで自分の作成したグラフを出力するには、どんな命令をgnuplotに与えればいいかを理解してください。
少なくとも、Cをちょっと直してコンパイルして..を繰り返すより楽なはずです。

参考サイトも沢山ありますし、マニュアルもあります。
    • good
    • 0
この回答へのお礼

ありがとうございます。勉強します。

お礼日時:2011/04/29 10:59

emf は 1ページしかかけないから.



しかし, C や C++ に関係ないことを自覚してるんだったら, もっと適切な場所を探そうとは思わないんだろうか?
    • good
    • 0
この回答へのお礼

すみませんでした。

お礼日時:2011/04/29 10:59

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語 コンパイラ

C言語のコンパイラを無料でインストールしたいのですが
気に入ったのが見つかりませんでしたぁ
いいコンパイラがあったら教えてください
よろしく御願いします

Aベストアンサー

その前に対象OSやプラットフォームなどの環境を書かないと何とも
いえないと思います。

クロスコンパイラならみなさんのいうようにGCCが一番でしょうし、
Winに限定するならBCCかVC++ Express Editionがいいでしょう。
MS-DOSならLSI C-86試食版なんてのもありますけど。

なんか、上手く動作しないけどWatcom Cなんて手もあるかも。

Cだけでいいのか、C++が使えた方がいいのかによっても異なります。

参考URL:http://ja.wikipedia.org/wiki/C%E8%A8%80%E8%AA%9E

Qc言語のプログラムで平均点に一番近い点数表示するには関数を使わないプログラムでは表示できますか?

c言語のプログラムで平均点に一番近い点数表示するには関数を使わないプログラムでは表示できますか?

Aベストアンサー

関数を使わないと何もできない.

QC言語のコンパイラについて

私は、高校でC言語を使った授業をしています。
学校のPCではMinGWのコンパイラを使っています。
家のPCでもC言語をしたいのですがコンパイラの入手法がわかりません。
どなたか教えてください。

Aベストアンサー

あなたの自宅のPCがwindowsであるならば、Cygwinを使われたらどうでしょう?
mingwのCコンパイラも存在します。

参考URL:http://cygwin.com/

Q下記のプログラムがコンパイラでエラーになります。

いつも教えて頂きありがとうございます。
実は基本を理解しておらず、キーパンチの練習になっています。
もう1冊自分にも解る書籍を購入しようと思います。
このプログラムの誤りだけでも教えて頂きたいのです。
2000文字では足りないので、2回に分けて投稿させて頂きます。

下記のプログラムです。

/*****************************************************

基本交換法による並べ替えを行うプログラム

******************************************************/

#include <stdio.h>



#defineN7/*データ個数*/

#defineON1/*sw : 交換しました*/

#defineOFF0/*sw : 交換していません*/

#defineDATA_LEN 20/*データ配列の1列の要素数*/



/*関数のプロトタイプ宣言*/

void printData(char p[][DATA_LEN], int n);/*文字列を表示する関数*/

void sort(char p[][DATA_LEN], int n);/*文字列を並び替える関数*/

voidstr_change(char *ps1,char *ps2);/*文字列と文字列とを交換する関数*/

voidatr_cpy(char *pd,char *ps)/*文字列を複写する関数*/

intstr_cmp(char *ps1,char *ps2)/*文字列と文字列とを比較する関数*/



main()

{

/*データの宣言*/

char p_data[N][DATA_LEN] = {"ふじさわ","えのしま","しちりがはま",

"ごくらくじ","はせ","ゆいがはま","かまくら"};



/*最初の状態を表示*/

printData(p_data,N);



/*並べ替え*/

sort(p_data,N);



/*結果を表示*/

printf("¥nソ¥ートしました¥n¥n");

printData(p_data,N);

}



/****************************************************

ポインタ型から文字列を表示

****************************************************/

void printData(char p[][DATA_LEN], int n)

/* p : 二次元配列*/

/* n : 文字列の要素数*/

{

inti;/*添え字*/



for(i=0;i<n;i++)

{

printf("%s¥n",p[i]);

}



}



/*****************************************************

基本交換法

*****************************************************/

void sort(char p[][DATA_LEN],int n)

/* p : 二次元配列*/

/* n : 文字列の要素数*/

{

intsw;/*交換したか*/

inti,j;/*添え字*/



sw = ON;

for(i = n-1 ; i>=1 && sw == ON ; i--)

{

sw = OFF;

for(j = 0; j< i ;j++)

{

/* p[j] <= p[j+1]となるようにする*/

if(str_cmp(p[j],p[j+1]) > 0)

{

str_change(p[j],p[j+1];/*交換*/

sw = ON;

}

}

}

}


もう1回投稿致します。

いつも教えて頂きありがとうございます。
実は基本を理解しておらず、キーパンチの練習になっています。
もう1冊自分にも解る書籍を購入しようと思います。
このプログラムの誤りだけでも教えて頂きたいのです。
2000文字では足りないので、2回に分けて投稿させて頂きます。

下記のプログラムです。

/*****************************************************

基本交換法による並べ替えを行うプログラム

******************************************************/

#include <stdio.h>



#defineN7/*デー...続きを読む

Aベストアンサー

質問を2つ投稿しておいて、もう一方は無視するのですか?

また、この質問も締め切らず放置するのですか?

QC言語でのコンパイラの作成方法

C言語初心者のため、稚拙な文章になる可能性があることを最初にお詫びします。

現在Microsoft社のMicrosoft Visual C++ 6.0を用いてCドライブのルートにある「temp.c」というソースファイルをコンパイルするアプリケーションを作ろうと思っているのですが、ネット上で「C言語 コンパイラ 作成」等と検索しても、既にコンパイラがあることを前提としたホームページしか見つけることができず、肝心のコンパイラをどのように作ったらよいのかということが載ったホームページが見つかりません。

というわけで、今回はコンパイラをどのように作ったらよいのかというヒントだけでもいいので教えて頂けないかと思い投稿させて頂きました。
ちなみに「temp.c」はそこまで複雑なソースではなく、DOS上のアプリで、リソースやアイコンなどは用いないものです。


そもそも「コンパイラを作る」ということ自体が愚かな行為なのかと思ったりもします。
私が所持しているBcpadやMicrosoft Visual C++ 6.0に付属している既存のコンパイラを利用するということも考えたのですが、BcpadやMicrosoft Visual C++ 6.0の本体以外からコンパイラをどのように利用していいのかもわかりません。

どうぞ忌憚の無い意見をよろしくお願いします。
ちなみにOSはXPのSP3です。

C言語初心者のため、稚拙な文章になる可能性があることを最初にお詫びします。

現在Microsoft社のMicrosoft Visual C++ 6.0を用いてCドライブのルートにある「temp.c」というソースファイルをコンパイルするアプリケーションを作ろうと思っているのですが、ネット上で「C言語 コンパイラ 作成」等と検索しても、既にコンパイラがあることを前提としたホームページしか見つけることができず、肝心のコンパイラをどのように作ったらよいのかということが載ったホームページが見つかりません。

というわけで、...続きを読む

Aベストアンサー

あの・・・水を差すようで恐縮しますが

それって「コンパイラを作る」ではなくて
「コンパイラを呼び出す」だけでは?

ボタンを押したら
外部プログラムとして cc コマンドを実行するだけ…。
最近 C++ やってないんで忘れましたが WinExecとか CreateProcess とか使って…。もちろん環境変数や実行パラメータはきちんとセットした上でですけど…。Microsoft Visual C++ 6.0でもコマンドプロンプトだけでコンパイルできますから。

Q下記、プログラム内の「char *」の役割

C++初心者です。
縦長になってしまいますが、


#include <iostream.h>

void show(int);
void show(double);
void show(char *);   ←左記の記述の使い方

int main(void) {
show(1);
show(0.25);
show("文字列");
return 0;
}

void show(int x) {
cout << x << endl;
}

void show(double y) {
cout << y << endl;
}

void show(char *z) {
cout << z << endl;
}


のプログラムにおいて、「char *」の使い方がいまいち理解できません。

上記プログラムですとエラーが表示されないのですが、下記のプログラムだとエラーが発生します。


#include <iostream.h>

void show(int);
void show(double);
void show(char);   //←---------上記と違う行

int main(void) {
show(1);
show(0.25);
show("文字列");
return 0;
}

void show(int x) {
cout << x << endl;
}

void show(double y) {
cout << y << endl;
}

void show(char z) {  //←---------上記と違う行
cout << z << endl;
}


なぜ、ポインタ(*)を付けないといけないのか分かりやすく教えていただけましょうか。

C++初心者です。
縦長になってしまいますが、


#include <iostream.h>

void show(int);
void show(double);
void show(char *);   ←左記の記述の使い方

int main(void) {
show(1);
show(0.25);
show("文字列");
return 0;
}

void show(int x) {
cout << x << endl;
}

void show(double y) {
cout << y << endl;
}

void show(char *z) {
cout << z << endl;
}


のプログラムにおいて、「char *」の使い方がいまいち理解できません。

上記プログラムですとエラー...続きを読む

Aベストアンサー

> なぜ、ポインタ(*)を付けないといけないのか
> 分かりやすく教えていただけましょうか。
では、出来るだけ分かりやすくがんばります。

■ char 型 について

char 型というのは、キャラクターつまり、「1文字」を
保存する変数の型です。ここでいう「1文字」というは
アルファベット1文字と思って頂いて結構です。
(漢字の1文字ではありません)

では、アルファベットがいくつか集まった文字列を
保存するためにはどうしたらよいでしょうか?

その答えは、「char の配列」という事になります。
配列というのは、同じ型の変数を複数並べたものなので
1文字を複数並べれば、文字列です。

つまり
char[6] = "burbe";
burbe という文字列を保存するためには char が
6個(何故5文字なのに6個必要なのかは、『ここが最後』
という記号が必要だから)並んだ配列が必要になる。

以上より
> show("文字列");
では show(char[7]) となっているのは分かって
もらえるかな?
(漢字1文字は char 2個分に相当。最後のマークを含めて合計7個分)

■ 文字列の受け渡し
では、この文字列を関数の引数にしてやりとりする場合を
考えてみよう。

関数の引数にいれて渡すとき、配列をまるまる入れると
コンピュータは、配列の中身を全部コピーしないと
いけなくなる。
例えば、1万文字の小説を引数にいれると、なんと
コンピュータはがんばって、1万文字をすべてコピーし
必要なメモリは2倍(2万文字相当)になってしまう。

こんなことは大変なので、実は C 言語では
「文字列(文字配列)が保存されている先頭の場所」
だけを渡すことになっている。

つまり、小説を関数の引数にいれてやりとりする場合
「あの小説をよろしく」みたいに、小説を指さすのです。
関数の中では「あぁ、あれね」みたいな使い方をする。

これが、ポインターというもの。指差しの「あれ」がポインター
文字列を関数でやりとりする場合、ポインターを使う
決まりになっているので
void show(char *);
が正解♪
「文字列の先頭の文字のポインター」ということで char * となる

---
もっと詳しく理解したい場合は google にて
C言語 文字列 ポインター 配列
あたりをキーワードにして検索すれば、たくさん
解説ページがみつかると思うので、それらを読んで
がんばってください。

> なぜ、ポインタ(*)を付けないといけないのか
> 分かりやすく教えていただけましょうか。
では、出来るだけ分かりやすくがんばります。

■ char 型 について

char 型というのは、キャラクターつまり、「1文字」を
保存する変数の型です。ここでいう「1文字」というは
アルファベット1文字と思って頂いて結構です。
(漢字の1文字ではありません)

では、アルファベットがいくつか集まった文字列を
保存するためにはどうしたらよいでしょうか?

その答えは、「char の配列」という事になり...続きを読む

QC言語のコンパイラ

C言語の勉強がしたいと思っているのですが、コンパイラっていうんですかね、それについて少し調べてみたら
無料なら"Borland C++ Compiler"で、有料ならなんかかなり高いっぽいけど"Visual C++"っていうのがあることが解りました。

よくプログラミング系のサイトの人で"Borland C++"のコンパイラを利用してとてもプログラミングがしやすくなったということが書いてあるのですが、"Visual C++"と比べたらどっちの方がいいんですか?(やっぱり有料の方?)
もし人それぞれなら、みなさんは両方あったらどっちを使いますか?

初心者なら無料ので十分すぎるのだとは思いますが、プログラマーみたいな人から見るとどうなのかな~と思ったので教えていただけますか。
お願いします。
ついでに"Visual C++"って言語があるんですかね?何かそんな風に書いてあるところもあったもんで。
かさねがさねお願いします。

Aベストアンサー

Borland C++ Compilerは元々は有料ですよ。(パッケージ販売していた。)

統合環境など(IDE)を省いて無料として公開したものなのでなんら、無料だからといって劣る部分はありません。
(コンパイル速度もBC++の方が速いし。)

VC++がいいと言われている利点はMS社製なのでOSと同じ会社と言うことで親和性が高い、サンプルソースコード等の資料がボーランド用に比べて極端に多いという利点があります。

勿論、VC++用のソースコードでもBC++とVC++の違いを理解していれば、コンパイル可能です。(ライブラリ関係の呼び出し方が違うのでDLLをBC++用にインポートするなど)

個人的な意見ですが、純粋にプログラムを学びたいというのであればBC++で十分です。(もったいないくらい、昔は5,6万位だして買った記憶が、、、。)

本格的にWindowsのプログラムを学びたいのならVC++の購入を検討してみるべきです。(逆に、それくらいの金額を自分に投資できないならたとえVC++が無料であっても使いこなさないと思います。)

Borland C++ Compilerは元々は有料ですよ。(パッケージ販売していた。)

統合環境など(IDE)を省いて無料として公開したものなのでなんら、無料だからといって劣る部分はありません。
(コンパイル速度もBC++の方が速いし。)

VC++がいいと言われている利点はMS社製なのでOSと同じ会社と言うことで親和性が高い、サンプルソースコード等の資料がボーランド用に比べて極端に多いという利点があります。

勿論、VC++用のソースコードでもBC++とVC++の違いを理解していれば、コンパイル可能です。(ライブ...続きを読む

Q下記のプログラムがコンパイラでエラーになります。

その後のプログラムです。

/************************************************************

文字列を比較する関数

戻り値 : ps1 > ps21

ps1 = ps20

ps1 < ps2 -1

*************************************************************/

intstr_cmp(char *ps1,char *ps2)

/*ps1,ps2 : 比較する文字列が入った配列を指すポインタ*/

{

intkekka;/*比較結果*/



for(;*ps1 != '¥0' && *ps2 != '¥0' && *ps1 == *ps2 ;ps1++,ps2++);

if(*ps1 > *ps2)

{

kekka = 1;

}

else if(*ps1 == *ps2)

{

kekka = 0;

}

else

{

kekka = -1;

}



return kekka;



}



/*************************************************************

文字列と文字列とを交換する関数

*************************************************************/

voidstr_change(char *ps1,char *ps2)

/* ps1,ps2 : 交換する文字列が入った配列へのポインタ*/



{

chartemp[DATA_LEN]/*交換用一時保管*/



str_cpy(temp,ps1);/*複写 ps1->temp */

str_cpy(ps1,ps2);/*複写 ps2->ps1 */

str_cpy(ps2,temp);/*複写 temp->ps2 */



}





/*************************************************************

文字列を複写する関数

*************************************************************/

voidstr_cpy(char *pd,char *ps)

/* char *pd :複写される配列へのポインタ*/

/* char *ps :複写する配列へのポインタ*/

{

for(;*ps != '¥0';ps++,pd++)

{

*pd = *ps;/*1文字複写*/

}

*pd = '¥0';/*最後の1文字*/

}

これをコンパイルすると
kansuu4.c: In function ‘atr_cpy’:
kansuu4.c:18: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘main’
kansuu4.c:41: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
kansuu4.c:57: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
kansuu4.c:85: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
kansuu4.c:112: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
kansuu4.c:128: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘{’ token
kansuu4.c:134: error: expected ‘{’ at end of input

と出ました。

本当は自分で努力するべきだと思います。
「自分でよく見てみろ。」
でも結構です。
ご多忙中申し訳ありません。
ご回答の程、宜しくお願い致します。

その後のプログラムです。

/************************************************************

文字列を比較する関数

戻り値 : ps1 > ps21

ps1 = ps20

ps1 < ps2 -1

*************************************************************/

intstr_cmp(char *ps1,char *ps2)

/*ps1,ps2 : 比較する文字列が入った配列を指すポインタ*/

{

intkekka;/*比較結果*/



for(;*ps1 != '¥0' && *ps2 != '¥0' && *ps1 == *ps2 ;ps1++,ps2++);

if(*ps1 > *ps2)

{

kekka = 1;

}

else if(*ps1 == *ps2)

{

kekka...続きを読む

Aベストアンサー

「自分でよく見てみろ。」

ちなみに私の環境でコンパイルしたら、エラーが量産されました。

エラー E2451 test.cpp 19: 未定義のシンボル intkekka(関数 intstr_cmp(char *,char *) )
エラー E2451 test.cpp 29: 未定義のシンボル kekka(関数 intstr_cmp(char *,char *) )
エラー E2451 test.cpp 73: 未定義のシンボル chartemp(関数 voidstr_change(char *,char *) )
エラー E2451 test.cpp 73: 未定義のシンボル DATA_LEN(関数 voidstr_change(char *,char *) )
エラー E2379 test.cpp 77: ステートメントにセミコロン(;)がない(関数 voidstr_change(char *,char *) )
エラー E2268 test.cpp 79: 未定義の関数 'str_cpy' を呼び出した(関数 voidstr_change(char *,char *) )
エラー E2451 test.cpp 81: 未定義のシンボル temp(関数 voidstr_change(char *,char *) )
警告 W8070 test.cpp 85: 関数は値を返すべき(関数 voidstr_change(char *,char *) )
警告 W8070 test.cpp 115: 関数は値を返すべき(関数 voidstr_cpy(char *,char *) )

「自分でよく見てみろ。」

ちなみに私の環境でコンパイルしたら、エラーが量産されました。

エラー E2451 test.cpp 19: 未定義のシンボル intkekka(関数 intstr_cmp(char *,char *) )
エラー E2451 test.cpp 29: 未定義のシンボル kekka(関数 intstr_cmp(char *,char *) )
エラー E2451 test.cpp 73: 未定義のシンボル chartemp(関数 voidstr_change(char *,char *) )
エラー E2451 test.cpp 73: 未定義のシンボル DATA_LEN(関数 voidstr_change(char *,char *) )
エラー E2379 test.cpp 77: ステートメントにセ...続きを読む

QMacで使えるC言語のコンパイラを教えてください

最近C言語の勉強を始めました。
私はMacユーザなのですがMacでCを使えるコンパイラはあるのでしょうか。ネットで探しても見つかりませんでした。もしご存じでしたら教えてください。

Aベストアンサー

MacでC言語の勉強をフリーの処理系で楽しむならMacintosh Programer's Workshopが良いと思います。
PowerPC用のC/C++コンパイラ、MC68K用のC/C++コンパイラ、MC68Kのデバイスドライバ開発などに使えるアセンブラとMacプログラミング(Toolboxプログラミング)に必要なResEditなどのツールが全てそろっています。
http://developer.apple.com/tools/mpw-tools/

hohihohiさんご紹介のCodeWarriorも良いのですが、いかんせん高価なのでDiscover Programming for Macintosh日本語版リリース5(¥2、8000)程度で始められても良いかもしれません。
勉強に必要な入門書などがセットになっています。
ただし、2次生産物(作成したソフトウェア)の配布権などに制限がありますので実力がついたらCodeWarriorにアップグレード(¥4、1000)すると良いでしょう。
http://www.metrowerks.co.jp/Products/Discover/Discover_Mac5.htm

日本語による1年間のテクニカルサポートに¥2、8000をかけると思えば安いと思います。

MacでC言語の勉強をフリーの処理系で楽しむならMacintosh Programer's Workshopが良いと思います。
PowerPC用のC/C++コンパイラ、MC68K用のC/C++コンパイラ、MC68Kのデバイスドライバ開発などに使えるアセンブラとMacプログラミング(Toolboxプログラミング)に必要なResEditなどのツールが全てそろっています。
http://developer.apple.com/tools/mpw-tools/

hohihohiさんご紹介のCodeWarriorも良いのですが、いかんせん高価なのでDiscover Programming for Macintosh日本語版リリース5(¥2、8000)程...続きを読む

Q画像を扱うプログラムを書くのに役立つ入門書・webページ

GCCで画像(とりあえずbmp)を扱うプログラムを書こうと思うのですが、
これまで全く画像を扱った経験がありません。

役に立ちそうな分かりやすい入門書・参考書
あるいはwebページなどがありましたら教えてください。

Aベストアンサー

こんばんは。
「画像を扱う」との意味が今一不明のため、一般的な範囲での情報です。

Netpbm: おそらく最も多種な画像フォーマットを扱うソフトです。その中で BMP を扱っている部分のソースが参考になるのではないでしょうか?

ImageMagick: これも多種の画像を扱うソフトです。Netpbm が基本的にコマンドベースで(本質的に画像データを扱う事に専念)あることに対して、これは X 上の GUI も備えています。

GD: C 上から line や circle 等の図形や文字を描画するためのライブラリです。但し、出力は PNG や JPEG です。

主な物を述べましたが、上記ソフト名をキーにネット上を検索されると色々な情報が見つかると思います。


人気Q&Aランキング

おすすめ情報