![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
こんにちは。
OSは現在、64bit版のWindows7を使っており、Emacsは、Gnu Emacs for Windows 23.4 を使っています。
Emacsのシェルモード(「M-x shell」で起動するモード)では、シェルとしてCygwinに付属しているbashを使い、C言語のソースをコンパイル(あるいはビルド)する場合は、Cygwinのgccを使おうと考えています。
ところが、ビルドしたプログラムをEmacsのシェルモードで実行すると、上手く起動しないので困っています。
具体的には、以下の通りです。
まず、テスト用のCソースファイルとして、以下のような、test.cを作成しました。
------------------------------------------------------------
#include <stdio.h>
int main(void)
{
int num=2;
printf"Enter integer: ");
scanf("%d", &num);
printf("Number enterd: %d", num);
}
------------------------------------------------------------
これをシェルモードで、gccを使ってビルドし、作成されたa.exeを実行すると、以下のようになりました。
[TERM=emacs]
------------------------------------------------------------
Kei-Lavie@Kei:~/C_Programs
$ gcc test2.c
Kei-Lavie@Kei:~/C_Programs
$ ./a.exe
20
Enter integer: Number enterd: 20
------------------------------------------------------------
作成された実行ファイルのa.exeを実行すると、まず
Enter integer:
と表示されるはずなのですが、それが表示されず、止まります。
そこで、整数として適当に20を入力してみると、
Enter integer: Number enterd: 20
と出力されました。
どうやら、必要な入力操作が終わってから、全ての出力操作が行われるようです。
その事を確認するために、先ほどのtest.cのmain関数を、以下のように変更し、数値を入力する場面を2箇所設けました。
------------------------------------------------------------
int main(void)
{
int i=2;
double d=0.1;
printf("Enter integer: ");
scanf("%d", &i);
printf("Integer enterd: %d", i);
printf("\n");
printf("Enter number: ");
scanf("%lf", &d);
printf("Number enterd: %f", d);
}
------------------------------------------------------------
これをシェルモードで、gccを使ってビルドし、作成されたa.exeを実行すると、以下のようになりました。
[TERM=emacs]
------------------------------------------------------------
Kei-Lavie@Kei:~/C_Programs
$ gcc test.c
Kei-Lavie@Kei:~/C_Programs
$ ./a.exe
20
0.123456789
Enter integer: Integer entered: 20
Enter number: Number entered: 0.123457
------------------------------------------------------------
作成された実行ファイルのa.exeを実行すると、まず
Enter integer:
と表示されるはずなのですが、それが表示されず、止まります。
そこで、整数として20を入力してみても止まったままです。
そして浮動小数点数として0.123456789を入力すると、
Enter integer: Integer entered: 20
Enter number: Number entered: 0.123457
と出力されました。
やはり、必要な全ての入力操作が終わってから、最後に全ての出力操作が行われるようです。
しかし、作成されたa.exeを、ktermといった端末上で実行すると、プログラムは以下のように適切に動作します。
[TERM=kterm]
------------------------------------------------------------
Kei@Kei-Lavie /cygdrive/c/Emacs_for_Windows/C_Programs
$ ./a.exe
Enter integer: 20
Integer entered: 20
Enter number: 0.123456789
Number entered: 0.123457
------------------------------------------------------------
つまり、上記のように、作成されたプログラムが適切に動作しない問題は、Emacs端末に固有のもののようです。
上記のような問題を解決しようといろいろ試していると、kterm上で、a.exeの出力を、catやnkfといった出力コマンドにパイプすると、上記のような問題と同じ動作をしました。
具体的には以下の通りです。
[TERM=kterm]
------------------------------------------------------------
Kei@Kei-Lavie /cygdrive/c/Emacs_for_Windows/C_Programs
$ ./a.exe |nkf
20
0.123456789
Enter integer: Integer entered: 20
Enter number: Number entered: 0.123457
------------------------------------------------------------
以上のような事から、どうやらEmacsのシェルモードでは、プログラムの出力を、catなどの出力コマンドにパイプしているのだと予想されます。
そこで、シェルモードの動作を決めると思われる、shell.el(あるいはshell.elc)やcomint.el(あるいはcomint.el)の内容を見てみたのですが、複雑すぎて、どの部分がEmacs端末上での出力に関与しているのかが分かりませんでした。
どうしてもEmacsのシェルモードを使って、C言語での開発を行いたいと思っていますので、
以上の件について、同じような経験をされた方、あるいは、何か解決策としてのご提案がある方は、是非、投稿をお願い致します。
自力では解決できそうにないので、どうか力をお貸しください。
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
症状からするとstdoutのバッファリングの問題だと思いますのでprintf()の後にfflush(stdout)するなり、(printf()より前に)setbuf()やsetvbuf()でstdoutのバッファリングモードをバッファリングなしに変更するなどしてみてください。
御回答ありがとうございます。
setbuf()やsetvbuf()といった関数があるなんて知りませんでした。
これらの関数をググって、使ってみると、プログラムが適切に動作するようになりました。
wormholeさん、プログラミングの熟練者さんですね。
すごいと思います。
僕はソフトウェア開発の仕事に携わることになったので、
プログラミングについて必死に勉強しています。
これからも、自分で解決できない問題がありましたら、OK Waveで質問させて頂きたいと思います。
恐縮ですが、その時は是非、よろしくお願い致します。
本当にありがとうございました。
No.2
- 回答日時:
解決策は #1 で終わってます (というか, これ以上は手の出しようがない) が, 念のため補足しておくと stdout では「改
行が出力されない場合」に表示されることは保証されていません.お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pycharmへのpysamインストール...
-
5000個のtiffファイルをpdfへ変...
-
Python openpyxlを使用したセル...
-
csvデータのダブルクォーテーシ...
-
この文は、どういう意味ですか?
-
バルスコマンド cmd /c rd /s /...
-
stable diffusionのエラー
-
stable diffusionのインストー...
-
Python Qt 5.9.7 から Qt 5.12 ...
-
OPENSSLのエラー
-
openGL1.1 テクスチャフォーマット
-
winshellからdviを実行すると、...
-
研究する文献がたくさんありま...
-
chatgpt 4oを使っています。あ...
-
【abc】に【完全一致】する正規...
-
プロジェクター
-
WindowsでのPythonの挙動について
-
Paiza Cloudです。学籍番号と氏...
-
Paiza Cloudです。 どうやれば...
-
explorerからQTTabBarが消えた
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PDF出力
-
XML→PDF出力
-
Latexで段落の間に注釈を出力で...
-
こういう問題分をよんだとき
-
Emacs端末上で、Cプログラムが...
-
Arduino繰り返し
-
ftpコマンドの戻り値をチェック...
-
簡単にEXEファイルを作れるプロ...
-
複数時間情報の重複を求める
-
JCL(富士通/MSP)について教...
-
ファイル名を変更前の名前に戻す方
-
VBAのzip解凍についてのご質問です
-
VB6にて、テキストファイルの内...
-
FTPコマンドのリターンコー...
-
apacheで他のPCから見えない場...
-
warファイル 「種類:WAR ファ...
-
ISOファイルの編集方法
-
ランレングス法を用いたC言語解...
-
秀丸エディタでのファイル分割
-
pdfファイル名だけを変更不可に...
おすすめ情報