C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: アプリケーションエラー


(過去ログ 50 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■27529 / inTopicNo.1)  アプリケーションエラー
  
□投稿者/ C++見習い (1回)-(2008/11/09(Sun) 02:38:49)

分類:[C/C++] 

2008/11/09(Sun) 04:09:42 編集(投稿者)
2008/11/09(Sun) 04:09:37 編集(投稿者)

アプリケーションエラーについての質問です。
言語:Microsoft Visual C++,環境:Windows XP Professional

関数SimAnnで最大値を得る関数Get_eachMaxをfor文で複数回呼び出し,
すべての最大値を求めるプログラムを作成しています。
コンパイルすると通るのですが,実行すると

アプリケーションエラー
"0x7c950f29"の命令が"0x00000069"のメモリを参照しました。メモリが"read"になることはできませんでした。
"0x7c950f29"の命令が"0x0000006e"のメモリを参照しました。メモリが"read"になることはできませんでした。

というエラーが出て止まってしまいます。デバッグしてみると,

HEAP[SA.exe]: Heap block at 0037F188 modified at 0037F1F4 past requested size of 64
SA.exe の 0x7c941230 でハンドルされていない例外が発生しました : ユーザー設定のブレークポイント。

という出力とともにmalloc.cが開かれます。メモリに関するエラーだということは分かるのですが,
原因がつかめずに困っています。どなたか原因がわかる方がいればご教授願います。

以下に,その一部を抜粋したものを掲載します。


※すべての関数は同じクラスのメンバ関数,length = int
SimAnn()
{
  for(i = 0; i < 100; i++)
  {
    Get_eachMax();
  }
}


Get_eachMax()
{
  int wmax = 0;
  for(int i = 0; i < N; ++i)
  {
    int w = 0;
    int tempw = calcMaxWidth(temp_new_sm[i], w);
    if(wmax < tempw)
    {
      wmax = tempw;
    }
  }
  int hmax = 0;
  for(int i = 0; i < N; ++i)
  {
    int x = 0;
    int temph = calcMaxHeight(temp_new_sm[i], x);
    if(hmax < temph)
    {
      hmax = temph;
    }
  }
}


calcMaxWidth(int mod, length &w)
{
  for(int k = 0; k < N; ++k)
  {
    if(temp_new_data[k].name == mod)
    {
      w += temp_new_data[k].x_width;
      break;
    }
  }
  vector<length> l;
  l.resize(N+1);
  int j = 0;
  for(vector<int>::iterator i = O[mod][MAA].begin(); i != O[mod][MAA].end(); ++i, ++j)
  {
    length tempw = w;
    l[j] = calcMaxWidth(*i, tempw);
  }
  if(j == 0)
  {
    return w;
  }
  return getMaxL(l);
}


calcMaxHeight(int mod, length &x)
{
  for(int k = 0; k < N; ++k)
  {
    if(temp_new_data[k].name == mod)
    {
      x += temp_new_data[k].y_width;
      break;
    }
  }
  vector<length> h;
  h.resize(N+1);
  int j = 0;
  for(vector<int>::iterator i = O[mod][MBA].begin(); i != O[mod][MBA].end(); ++i, ++j)
  {
    length temph = x;
    h[j] = calcMaxHeight(*i, temph);
  }
  if(j == 0)
  {
    return x;
  }
  return getMaxL(h);
}


getMaxL(vector<length> l)
{
  length maxl = 0;
  for(vector<length>::iterator i = l.begin(); i != l.end(); ++i)
  {
    if(maxl < *i)
    {
      maxl = *i;
    }
  }
  return maxl;
}


引用返信 編集キー/
■27532 / inTopicNo.2)  Re[1]: アプリケーションエラー
□投稿者/ Jitta on the way (214回)-(2008/11/09(Sun) 09:31:41)
No27529 (C++見習い さん) に返信
> 2008/11/09(Sun) 04:09:42 編集(投稿者)
> 2008/11/09(Sun) 04:09:37 編集(投稿者)
>
> アプリケーションエラーについての質問です。
> 言語:Microsoft Visual C++,環境:Windows XP Professional
>
> 関数SimAnnで最大値を得る関数Get_eachMaxをfor文で複数回呼び出し,
> すべての最大値を求めるプログラムを作成しています。
> コンパイルすると通るのですが,実行すると
>
> アプリケーションエラー
> "0x7c950f29"の命令が"0x00000069"のメモリを参照しました。メモリが"read"になることはできませんでした。
> "0x7c950f29"の命令が"0x0000006e"のメモリを参照しました。メモリが"read"になることはできませんでした。
>
> というエラーが出て止まってしまいます。デバッグしてみると,
>
> HEAP[SA.exe]: Heap block at 0037F188 modified at 0037F1F4 past requested size of 64
> SA.exe の 0x7c941230 でハンドルされていない例外が発生しました : ユーザー設定のブレークポイント。
>
> という出力とともにmalloc.cが開かれます。メモリに関するエラーだということは分かるのですが,
> 原因がつかめずに困っています。どなたか原因がわかる方がいればご教授願います。
>
> 以下に,その一部を抜粋したものを掲載します。

上の情報からは、やってることは全く無駄。vector には、何も入っていないはずです。関数の自動変数なので、関数に入るごとにクリアされているはずです。

エラーについては、デバッグ実行して、自分が書いたコードまで、呼び出しもとに戻ってください。
引用返信 編集キー/
■27540 / inTopicNo.3)  Re[2]: アプリケーションエラー
□投稿者/ 出水 (92回)-(2008/11/09(Sun) 11:58:13)
バグの詳細はJittaさんの言う通りだと思います

> getMaxL(vector<length> l)
ところで…これはあんまりよくない書き方かも
&つけましょう
引用返信 編集キー/
■27632 / inTopicNo.4)  Re[3]: アプリケーションエラー
□投稿者/ επιστημη (1375回)-(2008/11/11(Tue) 15:24:30)
επιστημη さんの Web サイト
>>getMaxL(vector<length> l)
> ところで…これはあんまりよくない書き方かも
> &つけましょう

そもそもこんなもん要らない。
l内の最大要素が欲しいなら ↓こんだけでおしまい。

int result = *std::max_element(l.begin(), l.end());

これに限らず、STLをちゃんと使えば呈示されたコードはもっと簡単明瞭になりそです。

引用返信 編集キー/
■27661 / inTopicNo.5)  Re[1]: アプリケーションエラー
□投稿者/ Jitta (532回)-(2008/11/11(Tue) 21:33:52)
Jitta さんの Web サイト
No27529 (C++見習い さん) に返信
そもそも、このアルゴリズム、(動くの?or正しいの?)and机上検証した?
まず、エントリポイントがわからない。
コード中に、引用されている範囲では宣言されていない変数が出てくる。
→ N, O, MAA, MBA, temp_new_sm, temp_new_data
Get_eachMax で、「すべての最大値を求める」ということをやってるみたいだけど、結果が捨てられているっぽい。
calcMaxWidth, calcMaxHeight は、無限ループしているんじゃない?(で、それがエラーの原因っぽい)

calcMaxWidth(int mod, length &w)
{
    for(int k = 0; k < N; ++k)
    {
        if(temp_new_data[k].name == mod)
        {
            w += temp_new_data[k].x_width;
            break;
        }
    }
    vector<length> l;
    l.resize(N+1);
    int j = 0;
    for(vector<int>::iterator i = O[mod][MAA].begin(); i != O[mod][MAA].end(); ++i, ++j)
    {
        length tempw = w;
        // ここ。
        // for 文のループ条件は、この関数の中に依存していない。
        // ここ以前に、calcMaxWidth から抜け出すことはない。
        // tempw は w なので、同じ値がぐるぐる回っていそう。
        l[j] = calcMaxWidth(*i, tempw);
    }
    if(j == 0)
    {
        return w;
    }
    return getMaxL(l);
}

引用返信 編集キー/
■27674 / inTopicNo.6)  Re[2]: アプリケーションエラー
□投稿者/ C++見習い (2回)-(2008/11/12(Wed) 06:06:20)
みなさん返信ありがとうございます。

まず,私の情報の提示不足でみなさんに混乱を招いたことをお詫びします。

ここ数日で検証したところ,確かに無限ループに陥っていました。
それは,vectorのclearがうまくはたらいていなかったことが原因でした。
そこを訂正した結果,無事正常な動作を確認しました。

ご協力ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -