• ベストアンサー

C言語ソースのコンパイルについて

C言語ソースファイルのコンパイルを実施しています。以前はコンパイルできていたのに、環境を変更したらコンパイルできなくなりました。原因や解決方法をお教え下さい。 旧環境 OS:WindowsNT VC:5.0 新環境 OS:Windows2000 VC:6.0 現象 HSTMTの宣言が出来ない? エラーメッセージ ・・・\TEST.c(683) : warning C4700: 値が割り当てられていないローカルな変数 'hstmt' に対して参照が行われました。 状況 変数 'hstmt'はHSTMTとして宣言しています。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

みなさん,ご指摘の通りなのですが, 「環境を変更したら...」 というのがどのような変更なのかにもよりますが, ご質問のエラーメッセージから判断すると, 変数を初期化せずに参照したと言うことです. 変数は,初期化(値の代入)せずに参照してはいけないことになっています. なぜならば,初期化しないと,その変数にどんな値が入っているのか分からないからです. BASICですと,変数は使用するときに必ずゼロに初期化されますので,このような心配はありません. しかし,Cなどのスピード重視の言語では,指定されていない余計なことはしないのがスタイルなのです. 「宣言」することと,「初期化」することは,別のものです. int a; a=0; または, int a=0; と書けば,宣言して,初期化できます. 中には,変数の初期値など関係ないプログラムもアルでしょうから,このエラーチェックは,必須ではありません. よって,ワーニングレベルで動作するプログラムもたくさんあります. しかし,プログラムの基本的な考え方に立てば,「間違い」と言えます.C++は,初期化する専用関数をコンストラクタといって「当然」のように用意します. (必須ではないのかもしれません.) エラーチェックのレベルも,コンパイラオプションの設定でも変わります. 一度,ご確認を.

momo_right
質問者

お礼

回答ありがとうございました。 ご指摘の通り、初期化忘れでした。 現行で問題なかったので、そのままチェックもせずにコンパイルしたのがまずかったです。 ありがとうございました。

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>・・・\TEST.c(683) : warning C4700: 値が割り当てられていないローカルな変数 'hstmt' に対して参照が行われました 値の代入が一度も行われていない変数の内容を使用しています。 というワーニングです。C言語のソースとしてだめなのはわかりますよね? ということで、最初からバグもちだったということです。 これって、VC5でもリリースビルドなら出た気がしますけど。

momo_right
質問者

お礼

回答ありがとうございました。 初期化していませんでした。現行では問題なくコンパイルできていたので油断していました。 ありがとうございました。 VC5.0だと、初期化していないと、エラーが出たり出なかったりでまちまちでした。

  • ponnta
  • ベストアンサー率17% (31/179)
回答No.1

エラーの内容を見た感じでは、 hstmtに値を入れることなくいきなりリードしているんじゃないかな? ローカル変数はスタックに作られるため、格納されている値が不定ですからね・・・

momo_right
質問者

お礼

回答ありがとうございました。 初期化を入れたら正常終了しました。 旧環境では初期化していなくとも正常終了していたので油断してしまいました。 ありがとうございました。

関連するQ&A

  • 「.c」拡張子でC++文法を使用したソースのコンパイルについて

    すみません、C&C++初心者です。 よく分からないので教えて下さい。 「.c」拡張子のファイルなのですが、以下C++の文法が使用されたソースがあります。 ・変数宣言が関数内の処理途中でされている ・構造体の変数宣言で「struct」の記述が省略されている ・const変数がswitch分のcaseラベルに使用されている これを以下環境でコンパイルしたところ、エラーとならず正常終了しました。 OS:HP-UX コンパイラ:aCC です。 (ちなみにwindows環境(win2003sv、clコンパイラ)でコンパイルしたところ、想定通りC++文法箇所でエラーになりました) 自分なりに調べた限り、C++対応コンパイラというものは、拡張子によって 「.c」ならC言語、「.cc」「.cpp」ならC++、といった判断をしてコンパイルする、 といった記述がよく見受けられました。 しかし本件の場合、「.c」ですがC++の文法が許容されたということになります。 本サイトでも検索したところ、「C言語での変数宣言の場所」というご質問で 「新しいgccコンパイラでは、変数の途中処理宣言は許容されている」 という内容のものは確認できましたが、これに似たような現象なのでしょうか。 ご存じの方おりましたらご教授よろしくお願いいたします。

  • C言語のコンパイルについて...。

    あの、C言語を勉強しているのですが、コンパイル法がわかりません。  作成は ”秀丸”で行っています。MS-DOSプロントでコンパイルは、どうやれば、できるのでしょうか?  Visual C は持っていますがインストしていません。    OSはWindows2000です。    コンパイルの手順や いいコンパイルソフトがあればお願いします。

  • C言語で文字列をかえす正しい書き方が知りたいです?

    C言語で次の警告が表示されます。 文字列を返したいのですが、正しい書き方はどのようにすれば良いのでしょうか? jci.h(20) : warning C4172; ローカル変数またはテンポラリのアドレスを返します。 char *test(char *a, int b) { char str[BUFSIZ]; return str; <------ }

  • Visual C++ 2008 Expreesのコンパイルについて

    夜も遅くに申し訳ありません 現在、Visual C++ ExpressでCのソースを書いているのですが 以下のような警告がでてしまいます 1>------ ビルド開始: プロジェクト: addres2, 構成: Release Win32 ------ 1>コンパイルしています... 1>strling.c 1>.\strling.c(19) : warning C4090: 'return' : 異なる 'const' 修飾子です。 1>.\strling.c(67) : warning C4090: 'return' : 異なる 'const' 修飾子です。 1>save.c 1>.\save.c(8) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(237) : 'fopen' の宣言を確認してください。 1>namesort.c 1>nameret.c 1>.\nameret.c(20) : warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(279) : 'gets' の宣言を確認してください。 1>main.c 1>.\main.c(30) : warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(279) : 'gets' の宣言を確認してください。 1>load.c 1>.\load.c(15) : warning C4996: 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(237) : 'fopen' の宣言を確認してください。 1>key.c 1>input.c 1>.\input.c(13) : warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(279) : 'gets' の宣言を確認してください。 1>.\input.c(28) : warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. 1> C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h(279) : 'gets' の宣言を確認してください。 1>.\input.c(31) : warning C4047: '関数' : 間接参照のレベルが 'char *' と 'char (*)[64]' で異なっています。 1>.\input.c(31) : warning C4024: 'InputKey' : の型が 1 の仮引数および実引数と異なります。 1>リンクしています... 1>コード生成しています。 1>コード生成が終了しました。 1>マニフェストを埋め込んでいます... 1>ビルドログは "file://g:\プログラム\addres2\addres2\Release\BuildLog.htm" に保存されました。 1>addres2 - エラー 0、警告 10 ========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ========== 一応は正常終了するのですが実行ファイル(exe)が生成されません 原因を探そうとネットを漁ってみたのですが判らないままです。 警告を全て消さないといけないのでしょうか? 申し訳ありませんが教えてください

  • 【C言語】 コンパイルエラーが解決できません

    参考書でC言語学習中の初心者です。 参考書記載のサンプルコードをコンパイルするとエラーになります。 誤字脱字は何度も確認しています。google等でも調べましたがわかりませんでした。。。 どなたか、どこが間違っているのかご教示いただけませんでしょうか。 また、何か的外れな記載があればご指摘いただけますでしょうか。 【環境】 OS: Mac OS X 10.9.3 コンパイラ:Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 【サンプルコード】  ------------------------------------------------- #include<stdio.h> int main(void){ int data; data = 10; printf("変数dataの値 = %d\n", data); printf("変数dataのアドレス = %08X", &data); return 0; } ------------------------------------------------- 【エラー】 破線内 ------------------------------------------------- sample12-1.c:9:45: warning: format specifies type 'unsigned int' but the argument has type 'int *' [-Wformat] printf("変数dataのアドレス = %08X", &data);                     ~~~~ ^~~~~ 1 warning generated. ------------------------------------------------- 宜しくお願い申し上げます。

  • C言語のコンパイル後のエラ-

    UNIX windows98でC言語をプログラムしました。 #include<stdio.h> void main() { int val; val=5; printf("今、変数の中身は、 %dです¥n”, val); val=val+1; printf(”今、変数の中身は、 %dです¥n", val);  val=val++; printf("今、変数の中身は、 %dです¥n”,  val); } をファイル名 aaaとして gcc aaa.c でコンパイルしたところ、 aaa.c: In function 'main': aaa.c:5:warning: return type of 'main' is not 'int' とエラ-が現れます。 return(o);を最後に追加するのでしょうか。もし、そうならば、どこに追加する のか、教えてください。   

  • C言語をコンパイルしたいのですが、無料のコンパイル環境はありますか?

    学校で、C言語習いました。 課題で出されたレポートの動作確認をしたいのですが、コンパイル環境がありません。 学校に行けばコンパイルできるのですが、エラーが出たら持ち帰り家で考える→再度学校で実行→以下続く をしていたら時間がかかってしょうがありません。 フリーのコンパイル環境はあるのでしょうか? あれば入手方法を教えてください。(PC環境はWindowsXPです。) もちろん、違法入手ではなくて安全なものを探しています。 ない場合は、どのくらいの値段で売っているものなのでしょうか? 検索してよく見かけるのは、『Borland C++Compiler 5.5 』なのですが、Windows2000(!?)までしか対応しておらず、現在はサイトが停止(!?よくわからないのですが、DL不可)していたので入手できませんでした。 入手方法を知りたいのはもちろんなのですが、Cファイルを作成して実行する方法など、短くても簡単でもよいので合わせて使い方を教えていただければ嬉しいです。 あと、素人質問で申し訳ないのですが、C言語のコンパイラでC++やその他の言語のコンパイルはできますか?(その逆もできますか?)

  • C言語の実行モジュール、コンパイル

    2点程、教えて頂きたい事があります。 よろしくお願いします。 (1)Solaris9でC言語でコンパイルされた実行モジュールを、そのままSolaris10にコピーし実行した場合、実行できるのでしょうか? (2)Solaris10で、makefile等を利用しC言語のコンパイルをしようと思うのですが、Solaris10がインストールされた段階で既にコンパイルする環境は整っているのでしょうか?。それともCD等からコンパイル環境をインストールしないといけないのでしょうか?(Solarisメディアが無い場合にコンパイル可能でしょうか?)

  • c言語やjavaのソースを読みたいのですが

    c言語やjavaのソースを読みたいのですが ゲームやアプリのプログラムを公開しているサイトを御存知でしたら 教えてください。言語の開発環境は、VC++・vc#・Eclipse・visualBasic(2005)です。

  • eclipseでC言語がコンパイルできない

    cigwinを先日入れてeclipseでC言語開発をしようと思ったんですが、 Hello Worldを実行しようとすると、 ・Program "g++" not found in PATH ・Program "gcc" not found in PATH というエラーがでます。 gcc,g++がPATHにないよ、といっているようですが、 これはどのように解決したらいいのでしょうか? cigwinでgcc,g++の場所を確認すると/usr/bin/gcc, /usr/bin/g++とありました。 インストールはされているようです。 環境変数の方もシステム環境変数、ユーザ環境変数両方に、 C:\cygwin\bin;C:\cygwin\usr\bin;C:\cygwin\usr\local\bin と指定しています。 何かPATHの設定を間違っているのでしょうか? それともeclipseの設定でしょうか?

専門家に質問してみよう