こんにちは。
現在C言語の学習をしています。
参考書を使いながら学習しているのですが、内容がわからない部分があるので、ご教示願いたく質問させていただきました。
タイトルにもある通りなのですが、getch / putch用ヘッダということで、参考書にはプログラムが記述されおり、その通りに書いたのですが、コンパイルエラーが発生してしまいました。
これはどうしてでしょうか?エラー内容も書きたいのですが、とても多かったので、省略させていただきます。すいません。。;
#if !defined(__GETPUTCH)
#define __GETPUTCH
#if defined(_MSC_VER) || (__TURBOC__) || (LSI_C)
#include <conio.h>
static void init_getputch(void){ }
static void term_getputch(void){ }
#else
#include
#undef putchar
#undef puts
#undef printf
static char __buf[4096];
static int __putchar(int ch)
{
if(ch == '\n')
putchar('\r');
return (putchar(ch));
}
static int putch(int ch)
{
int result = putchar(ch);
fflush(stdout);
return (result);
}
static int __printf(const char *format, ...)
{
va_list ap;
int count;
va_start(ap, format);
vsprintf(__buf, format, ap);
va_end(ap);
for(count=0; __buf[count]; count++){
putchar(__buf[count]);
if(__buf[count] == '\n')
putchar('\r');
}
return (count);
}
int __puts(const char *s)
{
int i, j;
for(i=0, j=0;s[i]; i++){
__buf[j++] = s[i];
if(s[i] == '\n')
__buf[j++] = '\r';
}
return (puts(__buf));
}
static void init_getputch(void)
{
initscr();
cbreak();
noecho();
refresh();
}
static void term_getputch(void)
{
endwin();
}
#define putchar __putchar
#define printf __printf
#define puts __puts
#end if
#endif
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
このファイルには「条件付コンパイル」という手法が使われています。
その条件は
#if defined(_MSC_VER) || (__TURBOC__) || (LSI_C)
です。
_MSC_VER 等は「定義済みマクロ」と言われるもので、そのうちのコンパイラの情報を表わすものです。
これによって、「VisualC++,TurboC,LSI-C だったら conio.h をincludeする」「それ以外ならcurses.hを使う」となります。
conio.h はWindows/MS-DOS用のコマンドプロンプト環境での入出力を扱うライブラリ(のヘッダ)です。UNIX/Linuxにはありません。
逆に、cursesはUNIX/Linuxでの端末の入出力を扱うライブラリです。Windowsには通常はありません。
普通にやったら別々にプログラムを用意する必要がありますが、それを一つにするのが「条件付きコンパイル」です。
なのですが。
この判定では、 MinGWやCygwinでGCCを使った場合は、この判定に使われているマクロは定義されていないので、UNIX/Linuxと判定されます。
対処方法は
○Cywin/MinGWでCursesが使えるように設定する
○MinGWだったらConioを使うように設定する
のどちらかになります。
Cygwinだったら、セットアップからcurses関連のものをインストールします。
MinGWはほとんど使ってないので、詳細はわかりません。
No.1
- 回答日時:
エラーを怖がらわず、ちゃんと読む癖を付けましょう。
プロだって、まずはエラーメッセージを読むことから始めます。
それをアマチュアがやらないで、どうしてプログラミング技術が身につくというのでしょう。
沢山エラーがあっても、恐れてはいけません。
沢山ある場合は、一つの(大抵はくだらない)間違いが原因であることがほとんどです。
例えば int i; の ;を忘れる→ 変数 i が宣言されていないことになって、 for(i=0〜 って行で軒並みエラーになる、 といった具合に。
こういうのは、その根源を直すと一気にエラーの数が減ります。
> 参考書にはプログラムが記述されおり、その通りに書いた
こういう思い込みは捨てましょう。
○本には、誤植があることがあります
○フォントの関係で、似た文字の区別がつかないことがあります。
ゼロと大文字のオーと小文字のオーとか。
○正確に入力したつもりで間違えている、ということもよくあります。
自分で作ったつもりになって、修正することが大事です。
ただ見たままを入力するのではなく、意味を考えることが大事です。
「最初から入力しなおす」というのが、もっとも間違った方法です。
>#end if
>#endif
この辺がエラーになっていなかったですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# C言語 3 2022/11/09 13:27
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語プログラミングで初項を1....
-
getch / putch用のヘッダ
-
プログラムがエラーが出る原因
-
C言語 コンパイルエラー(文字...
-
C言語:2つの複素数(分数)の四...
-
TCP/IP: 非ソケットに対するソ...
-
プログラミングが分かりません。
-
c言語を使用しています。英語小...
-
Expression: nptr != NULL
-
インパルス応答と入力信号から...
-
第5調波や第3高調波って何です...
-
ウィルキンソン型分配器について
-
クレーンでのCFブレーキとな...
-
主増幅器と前置増幅器について
-
R-C直列回路にLを接続した時の...
-
整合フィルタ(matched filter)...
-
Audacityのマイク音量
-
中3数学の問題です。 2のウ、エ...
-
等式4m+5n=75を満たす自然数の...
-
複数のシリンダーの同調化にコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラミングが分かりません。
-
C言語のエラーについて
-
'printf':識別子が見つかりませ...
-
3×3のラテン方陣をつくるプログ...
-
プログラムがエラーが出る原因
-
TCP/IP: 非ソケットに対するソ...
-
Expression: nptr != NULL
-
加減剰余のオーバーフローについて
-
getch / putch用のヘッダ
-
コマンドライン引数について。
-
C言語のソースコードについて教...
-
C言語初心者です。計算がうまく...
-
C言語 コンパイルエラー(文字...
-
C言語 遺伝的アルゴリズムでの...
-
C言語で自作ヘッダーを作ったの...
-
リターンキー又は、スペースキ...
-
以下の問題のプログラムを教え...
-
c言語入門
-
C/C++ return文で関数の返却値...
-
c言語プログラミングで初項を1....
おすすめ情報
ご回答ありがとうございます。
確かに、かなりのエラーの量があってそれらから逃げていたかもしれません。
kmeeさんがおっしゃっていた#endif含めエラーを少し直すと、かなりエラーが少なくなりました。
今、#include(curses.h)の部分でエラーが出ており、内容は「こんなファイルしらないよ?」のような内容のエラーが出ています。
僕はwindowsのパソコンで使っているために出てしまうエラーなのでしょうか?
#include<curses.h>について、
質問本文には#include<curses.h>を記述していませんでした。
#elseの後のincludeに<curses.h>を入力したうえでの補足コメントです。
申し訳ありません。