プロが教える店舗&オフィスのセキュリティ対策術

こんにちは。

現在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

質問者からの補足コメント

  • ご回答ありがとうございます。

    確かに、かなりのエラーの量があってそれらから逃げていたかもしれません。
    kmeeさんがおっしゃっていた#endif含めエラーを少し直すと、かなりエラーが少なくなりました。

    今、#include(curses.h)の部分でエラーが出ており、内容は「こんなファイルしらないよ?」のような内容のエラーが出ています。
    僕はwindowsのパソコンで使っているために出てしまうエラーなのでしょうか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2015/04/13 16:37
  • #include<curses.h>について、
    質問本文には#include<curses.h>を記述していませんでした。
    #elseの後のincludeに<curses.h>を入力したうえでの補足コメントです。

    申し訳ありません。

      補足日時:2015/04/13 16:39

A 回答 (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はほとんど使ってないので、詳細はわかりません。
    • good
    • 0

エラーを怖がらわず、ちゃんと読む癖を付けましょう。


プロだって、まずはエラーメッセージを読むことから始めます。
それをアマチュアがやらないで、どうしてプログラミング技術が身につくというのでしょう。


沢山エラーがあっても、恐れてはいけません。
沢山ある場合は、一つの(大抵はくだらない)間違いが原因であることがほとんどです。
例えば int i; の ;を忘れる→ 変数 i が宣言されていないことになって、 for(i=0〜 って行で軒並みエラーになる、 といった具合に。
こういうのは、その根源を直すと一気にエラーの数が減ります。


> 参考書にはプログラムが記述されおり、その通りに書いた

こういう思い込みは捨てましょう。
○本には、誤植があることがあります
○フォントの関係で、似た文字の区別がつかないことがあります。
 ゼロと大文字のオーと小文字のオーとか。
○正確に入力したつもりで間違えている、ということもよくあります。

自分で作ったつもりになって、修正することが大事です。
ただ見たままを入力するのではなく、意味を考えることが大事です。
「最初から入力しなおす」というのが、もっとも間違った方法です。


>#end if
>#endif

この辺がエラーになっていなかったですか?
この回答への補足あり
    • good
    • 0

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