ページ 11

原因不明のエラー

Posted: 2010年2月09日(火) 10:54
by dic
原因不明なエラーがでます
bool    Download( char *http, char *file, char *type )
{
    DEF_OKIMARI;

    bool    bSuccess = false;
    struct    _finddata_t        f;
    long                    hFile;
    //    指定したファイル名を探します
    HANDLE    h;
    WIN32_FIND_DATA    data;
    h = FindFirstFile( file, &data );
というソースコードなのですが
最後のFindFirstFile関数のところで必ずエラーになります
朝5時くらいまでは、何の問題もなく動いていたのですが
ひと眠りして今10時くらいから FindFirstFile 関数でエラーが
おこるようになりました
エラーをデバッカでおってもFindFirstFile関数内の
アセンブラレベルで問題が起きているようで手がだせません
さらにデバッカでエラーがひっかかり、もういっかいエラーを
おこそうとそのままF5を押してもエラーが起きずに実行できるのです
まったく原因が分かりません
どなたかわかる方いらっしゃいませんか?

開発環境は VC++6 です

Re:原因不明のエラー

Posted: 2010年2月09日(火) 11:29
by たかぎ
どうなることを期待して、どうなったのかを書いてもらわないと何ともいえません。
画像にしても、肝心の変数ウォッチの部分が切れてしまっていますし。

Re:原因不明のエラー

Posted: 2010年2月09日(火) 11:49
by softya
VC++でしたら「呼び出し履歴」と言う機能がありますので、それでFindFirstFileの呼び出し元から調べてみて下さい。何処から、どんなパラメータで呼び出したか調べることが出来ます。

下記はVC++2005ですがさほど差が無いはずです。
http://ext-web.edu.sgu.ac.jp/koike/semi/VC2005/c17.html

Re:原因不明のエラー

Posted: 2010年2月09日(火) 13:00
by dic
私も意味がわからないので、意味不明な文章になりました すいません

期待していることは、sub.txt というファイルがすでにあるかどうか、FindFirstFile関数で
取得して、ハンドルが得られるかどうか
ということです

VC++2005はもってないです

VC++2008 Express でもコンパイル実行しましたが、同様のエラーが起きます

Stack Overflowを起こしてます
ブレークポイントを
h = FindFirstFile( file, &data );
に設定し
次のブレークポイントを
if( h == ...
に設定してます
この間で、エラーが起きてるのでFindFirstFile関数内でエラーが起きてるとしか
私としては言えないのです

Re:原因不明のエラー

Posted: 2010年2月09日(火) 13:19
by softya
「呼び出し履歴」を見る限りネストは浅いのでstack overflowの原因らしきものは見当たりませんね。
可能性があるとしたら、ローカル変数で巨大の配列とか宣言していませんか?
1MB近くまで取っていると、何かの拍子にoverすると思いますが。

Re:原因不明のエラー

Posted: 2010年2月09日(火) 15:41
by dic
回答ありがとうございます
すごいですね
たしかに巨大な配列を宣言しました
char buf[10240];を
char buf[1024000];
に変更しました
1024000Byte
= 1024KByte
= 1MB
で、計算上約1MB宣言してます
3か所変更したので3MBです

これは、どういったエラーを呼び起こすのでしょうか?

Re:原因不明のエラー

Posted: 2010年2月09日(火) 15:50
by たかぎ
> たしかに巨大な配列を宣言しました

Visual C++の場合、自動記憶域期間を持つオブジェクトはスタックからとられます。
スタックに使うメモリのサイズには限界がありますので、それより大きなサイズのオブジェクトを使おうとするとメモリが不足します。
その結果、Stack Overflowがおきるわけです。

Re:原因不明のエラー

Posted: 2010年2月09日(火) 16:01
by softya
大雑把にいうとローカル変数でstaticでは無い変数は、スタック領域にメモリ領域を確保します。
スタック領域のサイズはコンパイル時に変更可能ですが、デフォルトだとあれ?VC++6.0って1MBだと思ったんですが記憶違いかな?
スタック領域は、ローカル変数と関数の呼び出しなどで消費しますのでギリギリまで使われていると今回のように深い階層の関数呼び出しでスタックオーバーフローします。
大きな配列はstaticで取るか、mallocなどで動的確保して下さい。

Re:原因不明のエラー

Posted: 2010年2月09日(火) 18:05
by dic
解決しました
ありがとうございました