原因不明のエラー

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic

原因不明のエラー

#1

投稿記事 by dic » 15年前

原因不明なエラーがでます
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:原因不明のエラー

#2

投稿記事 by たかぎ » 15年前

どうなることを期待して、どうなったのかを書いてもらわないと何ともいえません。
画像にしても、肝心の変数ウォッチの部分が切れてしまっていますし。

softya

Re:原因不明のエラー

#3

投稿記事 by softya » 15年前

VC++でしたら「呼び出し履歴」と言う機能がありますので、それでFindFirstFileの呼び出し元から調べてみて下さい。何処から、どんなパラメータで呼び出したか調べることが出来ます。

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

dic

Re:原因不明のエラー

#4

投稿記事 by dic » 15年前

私も意味がわからないので、意味不明な文章になりました すいません

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

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

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

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

softya

Re:原因不明のエラー

#5

投稿記事 by softya » 15年前

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

dic

Re:原因不明のエラー

#6

投稿記事 by dic » 15年前

回答ありがとうございます
すごいですね
たしかに巨大な配列を宣言しました
char buf[10240];を
char buf[1024000];
に変更しました
1024000Byte
= 1024KByte
= 1MB
で、計算上約1MB宣言してます
3か所変更したので3MBです

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

たかぎ

Re:原因不明のエラー

#7

投稿記事 by たかぎ » 15年前

> たしかに巨大な配列を宣言しました

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

softya

Re:原因不明のエラー

#8

投稿記事 by softya » 15年前

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

dic

Re:原因不明のエラー

#9

投稿記事 by dic » 15年前

解決しました
ありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る