none
C言語のプログラム RRS feed

  • 質問

  • はじめまして。はじめて投稿します。よろしくお願いします。

    以下のようなプログラムを作成しmainprog.cで保存しました。コンパイルはうまくいくのですが、

    実行結果がうまくいきません。

    ポテンシャル方程式を2次の差分法で解くプログラムです。求めるポテンシャルpsi[][]の値がおかしくなります。

    疑問点は、psi[1][0],psi[2][0],psi[3][0],...,psi[19][0]が0.0でなく1.0になることです。

    この値はbound_value()でしか操作していないと思うのですが、途中で値が変わってしまいます。

    どこで変更されているのか、わかりません。

    relax()でも変更されないと思うのですが、

     

    コンパイラはvisual C++ 2005 (Visual Studio 2005)

    OSはWindows Vista Ultimate SP1

    パソコンは自作機です。(Intel Core2Quad 6600, マザーボード P5BDelux)

     

    ご教示いただけると助かります。

     

    以下にプログラムと実行結果を示します。

     

    #include <stdio.h>
    #include <math.h>

    #define imax 20
    #define jmax 10
    #define i1 8
    #define i2 12
    #define jbox 4
    #define psi_max 1.0
    #define eps 0.001
    #define nmax 50

    float psi[imax][jmax];
    int i,j;
    float e_max;
    int n;

    init_value(void)
    {
     extern float psi[imax][jmax];
     int i, j;
     
     for (i=0;i<= imax;i++){
      for (j=0;j<= jmax;j++){
       psiIdea[j]=0.0;
      }
     }
    }
    bound_value(void)
    {
     extern float psi[imax][jmax];
     int i,j;
     float ds,s;

     for (i=0;i<=imax;i++){
      psiIdea[0] = 0.0;
     }
     for (j=0;j<=jbox;j++){
      psi[i1][j] = 0.0;
     }
     for (i=i1;i<=i2;i++){
      psiIdea[jbox] = 0.0;
     }
     for (j=0;j<=jbox;j++){
      psi[i2][j] = 0.0;
     }
     for (i=0;i<=imax;i++){
      psiIdea[jmax] = psi_max;
     }

     ds = psi_max / jmax;
     for (j=0;j<=jmax;j++){
      s = j*ds;
      psi[0][j] = s;
      psi[imax][j] = s;
     }
    }
    relax(int j1,int j2){
     extern float psi[imax][jmax];
     extern int i;
     extern float e_max;
     float dpsi;
     int j;

     for (j=j1;j<=j2;j++){
      dpsi = (psi[i+1][j]+psi[i-1][j]+psiIdea[j+1]+psiIdea[j-1])/4.0-psiIdea[j];
      psiIdea[j]=psiIdea[j]+dpsi;
      if (fabs(dpsi)>e_max) {e_max = fabs(dpsi);}
     }
    }
    out_result(){
     extern float psi[imax][jmax];
     int i,j;
     FILE *outfile;

        outfile = fopen("calc.dat","w");

     for (i=0;i<=imax;i++){
      for (j=0;j<=jmax;j++){
       fprintf(outfile,"%f %f %f\n",(float) i,(float) j,psiIdea[j]);
      }
      fprintf(outfile,"\n");
     }
     fclose(outfile);
    }

    main(){
     extern float psi[imax][jmax];
     extern int i, j, n;
     extern float e_max;
     
     init_value();
     bound_value();
     n = 1;

     do{
      e_max = 0.0;
      for (i=1;i<=i1-1;i++){
       relax(1,jmax-1);
      }
      for(i=i1;i<=i2;i++){
       relax(jbox+1,jmax-1);
      }
      for(i=i2+1;i<=imax-1;i++){
       relax(1,jmax-1);
      }
      printf("%d %e\n",n,e_max);
      n++;
     } while((e_max < eps)||(n > nmax));

     out_result();
    }

    実行結果は calc.datに出力して以下のようになります。

    0.000000 0.000000 0.000000
    0.000000 1.000000 0.100000
    0.000000 2.000000 0.200000
    0.000000 3.000000 0.300000
    0.000000 4.000000 0.400000
    0.000000 5.000000 0.500000
    0.000000 6.000000 0.600000
    0.000000 7.000000 0.700000
    0.000000 8.000000 0.800000
    0.000000 9.000000 0.900000
    0.000000 10.000000 1.000000

    1.000000 0.000000 1.000000
    1.000000 1.000000 0.275000
    1.000000 2.000000 0.118750
    1.000000 3.000000 0.104688
    1.000000 4.000000 0.126172
    1.000000 5.000000 0.156543
    1.000000 6.000000 0.189136
    1.000000 7.000000 0.222284
    1.000000 8.000000 0.255571
    1.000000 9.000000 0.538893
    1.000000 10.000000 1.000000

    2.000000 0.000000 1.000000
    2.000000 1.000000 0.318750
    2.000000 2.000000 0.109375
    2.000000 3.000000 0.053516
    2.000000 4.000000 0.044922
    2.000000 5.000000 0.050366
    2.000000 6.000000 0.059875
    2.000000 7.000000 0.070540
    2.000000 8.000000 0.081528
    2.000000 9.000000 0.405105
    2.000000 10.000000 1.000000

    3.000000 0.000000 1.000000
    3.000000 1.000000 0.329688
    3.000000 2.000000 0.109766
    3.000000 3.000000 0.040820
    3.000000 4.000000 0.021436
    3.000000 5.000000 0.017950
    3.000000 6.000000 0.019456
    3.000000 7.000000 0.022499
    3.000000 8.000000 0.026007
    3.000000 9.000000 0.357778
    3.000000 10.000000 1.000000

    4.000000 0.000000 1.000000
    4.000000 1.000000 0.332422
    4.000000 2.000000 0.110547
    4.000000 3.000000 0.037842
    4.000000 4.000000 0.014819
    4.000000 5.000000 0.008192
    4.000000 6.000000 0.006912
    4.000000 7.000000 0.007353
    4.000000 8.000000 0.008340
    4.000000 9.000000 0.341529
    4.000000 10.000000 1.000000

    5.000000 0.000000 1.000000
    5.000000 1.000000 0.333105
    5.000000 2.000000 0.110913
    5.000000 3.000000 0.037189
    5.000000 4.000000 0.013002
    5.000000 5.000000 0.005299
    5.000000 6.000000 0.003053
    5.000000 7.000000 0.002601
    5.000000 8.000000 0.002735
    5.000000 9.000000 0.336066
    5.000000 10.000000 1.000000

    6.000000 0.000000 1.000000
    6.000000 1.000000 0.333276
    6.000000 2.000000 0.111047
    6.000000 3.000000 0.037059
    6.000000 4.000000 0.012515
    6.000000 5.000000 0.004453
    6.000000 6.000000 0.001877
    6.000000 7.000000 0.001119
    6.000000 8.000000 0.000964
    6.000000 9.000000 0.334257
    6.000000 10.000000 1.000000

    7.000000 0.000000 1.000000
    7.000000 1.000000 0.333319
    7.000000 2.000000 0.111092
    7.000000 3.000000 0.037038
    7.000000 4.000000 0.012388
    7.000000 5.000000 0.004210
    7.000000 6.000000 0.001522
    7.000000 7.000000 0.000660
    7.000000 8.000000 0.000406
    7.000000 9.000000 0.333666
    7.000000 10.000000 1.000000

    8.000000 0.000000 1.000000
    8.000000 1.000000 0.000000
    8.000000 2.000000 0.000000
    8.000000 3.000000 0.000000
    8.000000 4.000000 0.000000
    8.000000 5.000000 0.001053
    8.000000 6.000000 0.000644
    8.000000 7.000000 0.000326
    8.000000 8.000000 0.000183
    8.000000 9.000000 0.333462
    8.000000 10.000000 1.000000

    9.000000 0.000000 1.000000
    9.000000 1.000000 0.000000
    9.000000 2.000000 0.000000
    9.000000 3.000000 0.000000
    9.000000 4.000000 0.000000
    9.000000 5.000000 0.000263
    9.000000 6.000000 0.000227
    9.000000 7.000000 0.000138
    9.000000 8.000000 0.000080
    9.000000 9.000000 0.333386
    9.000000 10.000000 1.000000

    10.000000 0.000000 1.000000
    10.000000 1.000000 0.000000
    10.000000 2.000000 0.000000
    10.000000 3.000000 0.000000
    10.000000 4.000000 0.000000
    10.000000 5.000000 0.000066
    10.000000 6.000000 0.000073
    10.000000 7.000000 0.000053
    10.000000 8.000000 0.000033
    10.000000 9.000000 0.333355
    10.000000 10.000000 1.000000

    11.000000 0.000000 1.000000
    11.000000 1.000000 0.000000
    11.000000 2.000000 0.000000
    11.000000 3.000000 0.000000
    11.000000 4.000000 0.000000
    11.000000 5.000000 0.000016
    11.000000 6.000000 0.000022
    11.000000 7.000000 0.000019
    11.000000 8.000000 0.000013
    11.000000 9.000000 0.333342
    11.000000 10.000000 1.000000

    12.000000 0.000000 1.000000
    12.000000 1.000000 0.000000
    12.000000 2.000000 0.000000
    12.000000 3.000000 0.000000
    12.000000 4.000000 0.000000
    12.000000 5.000000 0.000004
    12.000000 6.000000 0.000007
    12.000000 7.000000 0.000006
    12.000000 8.000000 0.000005
    12.000000 9.000000 0.333337
    12.000000 10.000000 1.000000

    13.000000 0.000000 1.000000
    13.000000 1.000000 0.250000
    13.000000 2.000000 0.062500
    13.000000 3.000000 0.015625
    13.000000 4.000000 0.003906
    13.000000 5.000000 0.000978
    13.000000 6.000000 0.000246
    13.000000 7.000000 0.000063
    13.000000 8.000000 0.000017
    13.000000 9.000000 0.333338
    13.000000 10.000000 1.000000

    14.000000 0.000000 1.000000
    14.000000 1.000000 0.312500
    14.000000 2.000000 0.093750
    14.000000 3.000000 0.027344
    14.000000 4.000000 0.007813
    14.000000 5.000000 0.002198
    14.000000 6.000000 0.000611
    14.000000 7.000000 0.000168
    14.000000 8.000000 0.000046
    14.000000 9.000000 0.333346
    14.000000 10.000000 1.000000

    15.000000 0.000000 1.000000
    15.000000 1.000000 0.328125
    15.000000 2.000000 0.105469
    15.000000 3.000000 0.033203
    15.000000 4.000000 0.010254
    15.000000 5.000000 0.003113
    15.000000 6.000000 0.000931
    15.000000 7.000000 0.000275
    15.000000 8.000000 0.000080
    15.000000 9.000000 0.333357
    15.000000 10.000000 1.000000

    16.000000 0.000000 1.000000
    16.000000 1.000000 0.332031
    16.000000 2.000000 0.109375
    16.000000 3.000000 0.035645
    16.000000 4.000000 0.011475
    16.000000 5.000000 0.003647
    16.000000 6.000000 0.001144
    16.000000 7.000000 0.000355
    16.000000 8.000000 0.000109
    16.000000 9.000000 0.333366
    16.000000 10.000000 1.000000

    17.000000 0.000000 1.000000
    17.000000 1.000000 0.333008
    17.000000 2.000000 0.110596
    17.000000 3.000000 0.036560
    17.000000 4.000000 0.012009
    17.000000 5.000000 0.003914
    17.000000 6.000000 0.001265
    17.000000 7.000000 0.000405
    17.000000 8.000000 0.000128
    17.000000 9.000000 0.333374
    17.000000 10.000000 1.000000

    18.000000 0.000000 1.000000
    18.000000 1.000000 0.333252
    18.000000 2.000000 0.110962
    18.000000 3.000000 0.036880
    18.000000 4.000000 0.012222
    18.000000 5.000000 0.004034
    18.000000 6.000000 0.001325
    18.000000 7.000000 0.000432
    18.000000 8.000000 0.000140
    18.000000 9.000000 0.333378
    18.000000 10.000000 1.000000

    19.000000 0.000000 1.000000
    19.000000 1.000000 0.358313
    19.000000 2.000000 0.167319
    19.000000 3.000000 0.126050
    19.000000 4.000000 0.134568
    19.000000 5.000000 0.159651
    19.000000 6.000000 0.190244
    19.000000 7.000000 0.222669
    19.000000 8.000000 0.255702
    19.000000 9.000000 0.372270
    19.000000 10.000000 0.000000

    20.000000 0.000000 0.000000
    20.000000 1.000000 0.100000
    20.000000 2.000000 0.200000
    20.000000 3.000000 0.300000
    20.000000 4.000000 0.400000
    20.000000 5.000000 0.500000
    20.000000 6.000000 0.600000
    20.000000 7.000000 0.700000
    20.000000 8.000000 0.800000
    20.000000 9.000000 0.900000
    20.000000 10.000000 1.000000

     

    以上よろしくお願いします。

    2008年8月31日 9:10

回答

  •  WaterlilyFlower さんからの引用

    iがインクリメントされてimaxより大きくなるとforのループから抜けるので

    問題がないと考えています。

    問題大ありです。

    配列の宣言で[ imax ]と書いた場合、imax個の配列が用意されますが、その要素、インデックスは0 ~ imax - 1ですよ?

    imax番目の要素にアクセスしてはいけません。

     

    下記のようにランタイムチェックでちゃんと検出されてるじゃないですか。

     WaterlilyFlower さんからの引用

    Run-Time Check Failure #2 - Stack around the variable 'psi' was corrupted.

     

    先にC言語の基礎を見直ししてください。

    それが一番の近道だと思いますよ、急がば回れと言いますから。

    似たような問題が引き続き起きる可能性があるので、個別に回答を待っていては時間がかかります。

    2008年8月31日 14:56
    モデレータ

すべての返信

  • 外池と申します。

     

    ざっとみたところ、relaxで予期しない要素を変更している可能性しかないように思います。で、プログラムをすべてお示し頂いていますが、「方程式を2次差分で解く」という手法自体に馴染みがない方からはコメントにしようが無いと思いますし、ここは、プログラミングの手法について情報交換する場ですので、

     

    少し、具体的に、どのようにデバッグすれば良いか? という観点で情報を求められてはいかがでしょうか?

     

    で、文字化けしていて(絵文字になってしまっていて)、厳密にどうなっているのかが読み取れませんが、要するにrelaxの中でpsiの要素に代入する文がありますので、その直前に、添え字の値をチェックするif文を入れてみてはいかがですか? で、本来代入してはいけない添え字の値になっていたら止めるようにするわけです。

     

    このようなチェックは、Visual Studioのデバッグ機能を使えば、実効を止めて、さらに遡って、mainのどの呼び出しでそうなっているかも追うことができます。

    2008年8月31日 11:46
  • こういう長いコードを全部提示して、不具合を探してくれという質問は、コードを読み解く必要があるため、回答に時間がかかります。

    時間がかかる質問は敬遠されることがあるので、回答がつかなかったりすることもあります。

     

    C言語のポインタや配列を重点的に、基礎的な事柄をもう少し学んでおいた方が良い気がします。

     

     WaterlilyFlower さんからの引用

    relax()でも変更されないと思うのですが、

    してますよね。

     

    Code Snippet

     extern float psi[imax][jmax];
     extern int i;
     extern float e_max;
     float dpsi;
     int j;

     for (j=j1;j<=j2;j++){
      dpsi = (psi[i+1][j]+psi[i-1][j]+psi[j+1]+psi[j-1])/4.0-psi[j];
      psi[j]=psi[j]+dpsi;

     

     

    これはコンパイルエラーにならないですか?

    psiはfloat[][](配列の配列≒ポインタのポインタ)であるのに対して、psi[j](配列の入れ物≒ポインタ)に対して演算結果を代入してますよね?

    psi[j]はアドレスを指し示すのに対して、それを書き換えているのですから、psi[ x ][ y ]の値が変化する(しているように見える)のは当然です。最悪は落ちます。(演算結果を見通してないのでその辺は分かりません)

     

    また、この問題を解決したとしても、extern floatとして渡すのには非常に違和感を持ちます。

    関数の引数で渡すように見直してはいかがでしょうか。

    2008年8月31日 12:21
    モデレータ
  • #他にも何かあるかも知れませんが、とりあえず。

    for (i=0;i<= imax;i++){

    }

    これでは境界を越えてしまいます。

    2008年8月31日 13:37
  • 外池様 コメントありがとうございます。

    いろいろ調べたのですが、relaxで値を変更する前にbound_valueをぬけると値が変わってしまうようです。

    ブレークポイントを設けて、ウオッチ式を設定してみます。

     

    デバッグでのポイントなどありましたらコメントいただけると幸いです。
    2008年8月31日 14:18
  • Azulean さんコメントありがとうございます。

    初心者なので恐縮ですが、コメントいただけると幸いです。

     

    [i]がIdeaの絵文字になってしまうようです。どうもうまく入力出来ていないようです。

    コピーアンドペーストではりつけました。

    配列の渡し方を引数で渡すように変更してみました。

    それと問題に関連しないと思われる部分を削除してみました。

    見苦しいかもしれませんが、よろしくお願いします。

     

    Code Snippet

    #include <stdio.h>

    #define imax 20
    #define jmax 10
    #define i1 8
    #define i2 12
    #define jbox 4
    #define psi_max 1.0

    init_value(float psi[imax][jmax])
    {
     int ii, j;
     
     for (ii=0;ii<= imax;ii++){
      for (j=0;j<= jmax;j++){
       psi[ii][j]=0.0;
      }
     }
    }
    bound_value(float psi[imax][jmax])
    {
     int ii,j;
     float ds,s;

     for (ii=0;ii <= imax;ii++){
      psi[ii][0] = 0.0;
     }
     for (j=0;j<= jbox;j++){
      psi[i1][j] = 0.0;
     }
     for (ii=i1;ii<= i2;ii++){
      psi[ii][jbox] = 0.0;
     }
     for (j=0;j<= jbox;j++){
      psi[i2][j] = 0.0;
     }
     for (ii=0;ii<= imax;ii++){
      psi[ii][jmax] = psi_max;
     }

     ds = (float) psi_max / jmax;
     for (j=0;j<= jmax;j++){
      s = j*ds;
      psi[0][j] = s;
      psi[imax][j] = s;
     }
    }

    out_result(float psi[imax][jmax]){
     int ii,j;
     FILE *outfile;

        outfile = fopen("calc2.dat","w");

     for (ii=0;ii<= imax;ii++){
      for (j=0;j<= jmax;j++){
       fprintf(outfile,"%f %f %f\n",(float) ii,(float) j,psi[ii][j]);
      }
      fprintf(outfile,"\n");
     }
     fclose(outfile);
    }

    main(){
     float psi[imax][jmax];
     init_value(psi);
     bound_value(psi);

     out_result(psi);
    }

     

     

    しかし出力は psi[1][0],psi[2][0],...,psi[19][0] が0.0でなく1.0になってしまいます。

    終了時にエラーが出るようになりました。 

    Run-Time Check Failure #2 - Stack around the variable 'psi' was corrupted.

    以下に結果の出力を示します。

     

    0.000000 0.000000 0.000000
    0.000000 1.000000 0.100000
    0.000000 2.000000 0.200000
    0.000000 3.000000 0.300000
    0.000000 4.000000 0.400000
    0.000000 5.000000 0.500000
    0.000000 6.000000 0.600000
    0.000000 7.000000 0.700000
    0.000000 8.000000 0.800000
    0.000000 9.000000 0.900000
    0.000000 10.000000 1.000000

    1.000000 0.000000 1.000000
    1.000000 1.000000 0.000000
    1.000000 2.000000 0.000000
    1.000000 3.000000 0.000000
    1.000000 4.000000 0.000000
    1.000000 5.000000 0.000000
    1.000000 6.000000 0.000000
    1.000000 7.000000 0.000000
    1.000000 8.000000 0.000000
    1.000000 9.000000 0.000000
    1.000000 10.000000 1.000000

    2.000000 0.000000 1.000000
    2.000000 1.000000 0.000000
    2.000000 2.000000 0.000000
    2.000000 3.000000 0.000000
    2.000000 4.000000 0.000000
    2.000000 5.000000 0.000000
    2.000000 6.000000 0.000000
    2.000000 7.000000 0.000000
    2.000000 8.000000 0.000000
    2.000000 9.000000 0.000000
    2.000000 10.000000 1.000000

    3.000000 0.000000 1.000000
    3.000000 1.000000 0.000000
    3.000000 2.000000 0.000000
    3.000000 3.000000 0.000000
    3.000000 4.000000 0.000000
    3.000000 5.000000 0.000000
    3.000000 6.000000 0.000000
    3.000000 7.000000 0.000000
    3.000000 8.000000 0.000000
    3.000000 9.000000 0.000000
    3.000000 10.000000 1.000000

    4.000000 0.000000 1.000000
    4.000000 1.000000 0.000000
    4.000000 2.000000 0.000000
    4.000000 3.000000 0.000000
    4.000000 4.000000 0.000000
    4.000000 5.000000 0.000000
    4.000000 6.000000 0.000000
    4.000000 7.000000 0.000000
    4.000000 8.000000 0.000000
    4.000000 9.000000 0.000000
    4.000000 10.000000 1.000000

    5.000000 0.000000 1.000000
    5.000000 1.000000 0.000000
    5.000000 2.000000 0.000000
    5.000000 3.000000 0.000000
    5.000000 4.000000 0.000000
    5.000000 5.000000 0.000000
    5.000000 6.000000 0.000000
    5.000000 7.000000 0.000000
    5.000000 8.000000 0.000000
    5.000000 9.000000 0.000000
    5.000000 10.000000 1.000000

    6.000000 0.000000 1.000000
    6.000000 1.000000 0.000000
    6.000000 2.000000 0.000000
    6.000000 3.000000 0.000000
    6.000000 4.000000 0.000000
    6.000000 5.000000 0.000000
    6.000000 6.000000 0.000000
    6.000000 7.000000 0.000000
    6.000000 8.000000 0.000000
    6.000000 9.000000 0.000000
    6.000000 10.000000 1.000000

    7.000000 0.000000 1.000000
    7.000000 1.000000 0.000000
    7.000000 2.000000 0.000000
    7.000000 3.000000 0.000000
    7.000000 4.000000 0.000000
    7.000000 5.000000 0.000000
    7.000000 6.000000 0.000000
    7.000000 7.000000 0.000000
    7.000000 8.000000 0.000000
    7.000000 9.000000 0.000000
    7.000000 10.000000 1.000000

    8.000000 0.000000 1.000000
    8.000000 1.000000 0.000000
    8.000000 2.000000 0.000000
    8.000000 3.000000 0.000000
    8.000000 4.000000 0.000000
    8.000000 5.000000 0.000000
    8.000000 6.000000 0.000000
    8.000000 7.000000 0.000000
    8.000000 8.000000 0.000000
    8.000000 9.000000 0.000000
    8.000000 10.000000 1.000000

    9.000000 0.000000 1.000000
    9.000000 1.000000 0.000000
    9.000000 2.000000 0.000000
    9.000000 3.000000 0.000000
    9.000000 4.000000 0.000000
    9.000000 5.000000 0.000000
    9.000000 6.000000 0.000000
    9.000000 7.000000 0.000000
    9.000000 8.000000 0.000000
    9.000000 9.000000 0.000000
    9.000000 10.000000 1.000000

    10.000000 0.000000 1.000000
    10.000000 1.000000 0.000000
    10.000000 2.000000 0.000000
    10.000000 3.000000 0.000000
    10.000000 4.000000 0.000000
    10.000000 5.000000 0.000000
    10.000000 6.000000 0.000000
    10.000000 7.000000 0.000000
    10.000000 8.000000 0.000000
    10.000000 9.000000 0.000000
    10.000000 10.000000 1.000000

    11.000000 0.000000 1.000000
    11.000000 1.000000 0.000000
    11.000000 2.000000 0.000000
    11.000000 3.000000 0.000000
    11.000000 4.000000 0.000000
    11.000000 5.000000 0.000000
    11.000000 6.000000 0.000000
    11.000000 7.000000 0.000000
    11.000000 8.000000 0.000000
    11.000000 9.000000 0.000000
    11.000000 10.000000 1.000000

    12.000000 0.000000 1.000000
    12.000000 1.000000 0.000000
    12.000000 2.000000 0.000000
    12.000000 3.000000 0.000000
    12.000000 4.000000 0.000000
    12.000000 5.000000 0.000000
    12.000000 6.000000 0.000000
    12.000000 7.000000 0.000000
    12.000000 8.000000 0.000000
    12.000000 9.000000 0.000000
    12.000000 10.000000 1.000000

    13.000000 0.000000 1.000000
    13.000000 1.000000 0.000000
    13.000000 2.000000 0.000000
    13.000000 3.000000 0.000000
    13.000000 4.000000 0.000000
    13.000000 5.000000 0.000000
    13.000000 6.000000 0.000000
    13.000000 7.000000 0.000000
    13.000000 8.000000 0.000000
    13.000000 9.000000 0.000000
    13.000000 10.000000 1.000000

    14.000000 0.000000 1.000000
    14.000000 1.000000 0.000000
    14.000000 2.000000 0.000000
    14.000000 3.000000 0.000000
    14.000000 4.000000 0.000000
    14.000000 5.000000 0.000000
    14.000000 6.000000 0.000000
    14.000000 7.000000 0.000000
    14.000000 8.000000 0.000000
    14.000000 9.000000 0.000000
    14.000000 10.000000 1.000000

    15.000000 0.000000 1.000000
    15.000000 1.000000 0.000000
    15.000000 2.000000 0.000000
    15.000000 3.000000 0.000000
    15.000000 4.000000 0.000000
    15.000000 5.000000 0.000000
    15.000000 6.000000 0.000000
    15.000000 7.000000 0.000000
    15.000000 8.000000 0.000000
    15.000000 9.000000 0.000000
    15.000000 10.000000 1.000000

    16.000000 0.000000 1.000000
    16.000000 1.000000 0.000000
    16.000000 2.000000 0.000000
    16.000000 3.000000 0.000000
    16.000000 4.000000 0.000000
    16.000000 5.000000 0.000000
    16.000000 6.000000 0.000000
    16.000000 7.000000 0.000000
    16.000000 8.000000 0.000000
    16.000000 9.000000 0.000000
    16.000000 10.000000 1.000000

    17.000000 0.000000 1.000000
    17.000000 1.000000 0.000000
    17.000000 2.000000 0.000000
    17.000000 3.000000 0.000000
    17.000000 4.000000 0.000000
    17.000000 5.000000 0.000000
    17.000000 6.000000 0.000000
    17.000000 7.000000 0.000000
    17.000000 8.000000 0.000000
    17.000000 9.000000 0.000000
    17.000000 10.000000 1.000000

    18.000000 0.000000 1.000000
    18.000000 1.000000 0.000000
    18.000000 2.000000 0.000000
    18.000000 3.000000 0.000000
    18.000000 4.000000 0.000000
    18.000000 5.000000 0.000000
    18.000000 6.000000 0.000000
    18.000000 7.000000 0.000000
    18.000000 8.000000 0.000000
    18.000000 9.000000 0.000000
    18.000000 10.000000 1.000000

    19.000000 0.000000 1.000000
    19.000000 1.000000 0.000000
    19.000000 2.000000 0.000000
    19.000000 3.000000 0.000000
    19.000000 4.000000 0.000000
    19.000000 5.000000 0.000000
    19.000000 6.000000 0.000000
    19.000000 7.000000 0.000000
    19.000000 8.000000 0.000000
    19.000000 9.000000 0.000000
    19.000000 10.000000 0.000000

    20.000000 0.000000 0.000000
    20.000000 1.000000 0.100000
    20.000000 2.000000 0.200000
    20.000000 3.000000 0.300000
    20.000000 4.000000 0.400000
    20.000000 5.000000 0.500000
    20.000000 6.000000 0.600000
    20.000000 7.000000 0.700000
    20.000000 8.000000 0.800000
    20.000000 9.000000 0.900000
    20.000000 10.000000 1.000000

     

    以上です。 最後までお読みいただきありがとうございます。
    2008年8月31日 14:30
  • Abstract様コメントありがとうございます。

     

    iがインクリメントされてimaxより大きくなるとforのループから抜けるので

    問題がないと考えています。

    いろいろ問題があるかも知れませんが

    ご教示いただけると幸いです。

    Azuleanさまのコメントの回答に

    問題を少し要約したコードをのせてみました。

    ご検討いただけると幸いです。

     

    2008年8月31日 14:34
  •  WaterlilyFlower さんからの引用

    iがインクリメントされてimaxより大きくなるとforのループから抜けるので

    問題がないと考えています。

    問題大ありです。

    配列の宣言で[ imax ]と書いた場合、imax個の配列が用意されますが、その要素、インデックスは0 ~ imax - 1ですよ?

    imax番目の要素にアクセスしてはいけません。

     

    下記のようにランタイムチェックでちゃんと検出されてるじゃないですか。

     WaterlilyFlower さんからの引用

    Run-Time Check Failure #2 - Stack around the variable 'psi' was corrupted.

     

    先にC言語の基礎を見直ししてください。

    それが一番の近道だと思いますよ、急がば回れと言いますから。

    似たような問題が引き続き起きる可能性があるので、個別に回答を待っていては時間がかかります。

    2008年8月31日 14:56
    モデレータ
  • 外池様,azulean様、abstract様コメントありがとうございました。

    float psi[5][5] で宣言して

    psi[1][5]をアクセスしようとするとpsi[2][0]をアクセスしてしまうようです。

    配列の範囲は0~4、0~4だということがわかりました。5×5で25要素

    自分は0~5、0~5の6×6の36要素と考えていました。

    宣言の中の数字は最大の数ではなく、要素の数だということがわかりました。

    基本的なミスでした。ありがとうございました。

     

    2008年8月31日 16:00