情報メディアセンターの管理する実習室の Windows にインストールされたVisual C++ 2008 を使って プログラミングをするときに出会うかもしれない問題です.
scanf
で警告が出るこの点でVisual C++のコンパイラはLinux のgccなどのコンパイラと振舞いが異なります. 無視してもいいですし,
#define _CRT_SECURE_NO_WARNINGS
して消すこともできます.
scanf
は危険なので使わないほうがいいと考えられているというのは本当です.
その通りです. エクスプローラでそのフォルダを消去する(不要なら)か, 別のプロジェクト名を選ぶかしましょう.
ソリューションエクスプローラ上にプロジェクトが表示されないとしても, Visual Studioにプロジェクトとして登録されていないだけで, フォルダの実体は存在することがあります. 完全に削除するには, Visual Studio上でプロジェクトを削除するだけでなく, エクスプローラでフォルダを削除する必要があります.
その通りです. エクスプローラでそのファイルを消去する(不要なら)か, 別のファイル名を選ぶかしましょう.
ソリューションエクスプローラのプロジェクト内にファイルが表示されないとしても, Visual Studioに登録されていないだけで, ファイルの実体は存在することがあります. 完全に削除するには, Visual Studio上でファイルををクリアするだけでなく, 削除しましょう. またはエクスプローラでファイルを削除する必要があります.
意図したのと別のファイルを編集していませんか? タブ上に出るファイル名が同じでも別のフォルダ内のものかも. ソリューションエクスプローラから開き直してみましょう.
意図したのと別のプログラムを実行していませんか? 「デバッグ開始」「デバッグなしで開始」で実行されるプログラムは, ソリューションエクスプローラ上で太字で表示されている「スタートアッププロジェクト」です. 設定は
で行います.
#define _USE_MATH_DEFINES
#include <math.h>
なお, コマンドライン, IDEとも, Linuxのコマンドラインででccに-lmオプションを与える, に相当することは不要です.
1個のプロジェクトの中に, main 関数を含む *.cファイルを2個以上入れていませんか? 1個のプロジェクトに実行ファイルは1個, したがって, main 関数は1個だけです. 2個のプログラム(実行ファイル)を作りたいときは, 2個のソリューション/2個のプロジェクトを作りましょう.
この授業では, 1個のソリューションに1個のプロジェクト, 1個のプロジェクトに1個の .c ファイル(ヘッダーファイルは無し)という使い方をします.
言葉通り,
printf("Hello world!\n")のように, 行末の(つまり次の行の最初の単語の前に)セミコロン;が足りないというエラーです.
また, 一見 セミコロン; が不要と思われる場所でこのエラーが発生することがあります. それは, {} が match していないためであることがあります. 次の例で考えてみましょう.
int main(int argc, char **argv){ return do_hello_world(); /* } */ /* } 付け忘れ */ int do_hello_world(void){ printf("Hello world!\n"); return 0; }C++コンパイラは, int do_hello_world(void){ も main 関数の中にあると解釈することになります. ところが, 関数の中で関数を定義することはできません. そこで C++ コンパイラーは,
int do_hello_world; /* ; を補いました */ (void){ ... } /*と, 変数の宣言と解釈し, do_hello_world の後に セミコロン; がないよ, と文句を言うのです. C++ では(Cと異なり, またJavaと同じ様に)関数定義の先頭でなく, 任意の場所で変数の宣言が可能なのでした.
variable=変数, define=定義する(今の場合, 初期化のことです). Line=行. 39行目あたりをチェックしましょう.
Unix/Linuxのcc/gccや, Visual C++のRelease Buildでは, 《実行できちゃうけどおかしな結果になる》ケースです. デバッガーで実行したときにはこうして警告してくれるのです.
variable=変数, initialize=初期化する. チェックしましょう.
Unix/Linuxのcc/gccや, Visual C++のRelease Buildでは, 《実行できちゃうけどおかしな結果になる》ケースです. デバッガーで実行したときにはこうして警告してくれるのです.
Stack というのは関数内で一時的に確保される変数領域のことです. それが壊れたというのですから, Segmentation Fault と似た状況です
典型的には, x という配列を, 許される添字範囲を超えて使ってしまったときなどに起きます.