Visual Studio Codeにおいて、C言語のdouble型の配列の最大要素数が分かりません。具体的にはdouble Tv[85010]のところなどをTv[100010]などで実行したいのですが、確認した限りでは90010からはプログラムが実行されずに終わってしまいます。改善案もしくは最大要素数が知りたいです。よろしくお願いします。

RR 20 評価のポイント
2024-12-02T08:18:47.59+00:00

/その他の設定/

long i=0;

long j=0;

double Tv[85010];

        Tv[0]=22;/初期のVO2 の温度/

double TV[85010];//温度絶対温度

double dTv;/二酸化バナジウムの温度の変化量/

double dTg;/グリスの温度の変化量/

double Ta=22; /外気温度/

double Tgr[85010];/グリス温度/

        Tgr[0]=22;/初期のグリスの温度/

double C4;/C2+C3/

double C_4;/C_2+C_3/

double s=0.0000000567;//ステファンボルツマン

double hu;//輻射の影響

for(i=0;i<85010;i++)

    if(Tv[i]<65)

    {

        //輻射による

        TV[i]=Tv[i]+273.15;

        hu=AsTV[i]*TV[i]*TV[i]*TV[i];

        hu=a*hu;

        Q=Q1-hu;

        /*printf("hu = %f\n",hu);

        printf("Tv%f\n",Tv[i]);

        printf("Tgr%f\n",Tgr[i]);*/

        dTg=Q/Cg-(Tgr[i]-Tv[i])/(Rv_1*Cg);

        dTv=(Tgr[i]-Tv[i])/(Rv_1C_1)-(Tv[i]-Ta)/(RaC_1);

        Tgr[i+1]=Tgr[i]+dTg;

        Tv[i+1]=Tv[i]+dTv;

    }

    else

    {

        //輻射による

        TV[i]=Tv[i]+273.15;

        hu=AsTV[i]*TV[i]*TV[i]*TV[i];

        hu=a*hu;

        Q=Q1-hu;

        /*printf("hu = %f\n",hu);

        printf("Tv%f\n",Tv[i]);

        printf("Tgr%f\n",Tgr[i]);*/

        C4=C2+C3;

        C_4=C_2+C_3;

        dTg=Q/Cg-(Tgr[i]-Tv[i])/(Rv_2*Cg);

        dTv=(Tgr[i]-Tv[i])/(Rv_2C_4)-(Tv[i]-Ta)/(RaC_4);

        Tgr[i+1]=Tgr[i]+dTg;

        Tv[i+1]=Tv[i]+dTv;

        if(C_3>0)

        {

            C_3=C_3-(Q-C_2*dTv);

            if(C_3<0)

            {

                C_3=0;

            }

        }

        j=i;

        //if(dTg<=0.0002)i=100001;

    }

Visual Studio
Visual Studio
Windows、Web、モバイル デバイス用のアプリケーションを構築するための統合開発ツールの Microsoft スイートのファミリ。
103 件の質問
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. gekka 10,566 評価のポイント MVP
    2024-12-02T09:43:34.4066667+00:00

    Visual Studio Codeの制限ではなく、コンパイラとリンカで設定されたスタックメモリの大きさ上限に引っかかっていると考えられます。

    スタックメモリは呼び出されている関数の引数や、それらの関数内で宣言して使用されている変数を保持するためのメモリを消費します。(関数を抜ければ解放される)

    そのため、固定サイズの配列を関数内で宣言して使用すると、配列の1要素の大きさ×配列の大きさのメモリを消費します。

    double型では8バイトなので、85010の大きさだと680,080バイト消費します。
    提示されているコードだけでも3個配列があるので、これらだけで2MBも消費します。
    (提示されていない変数宣言もあるようなので、実際はもっと消費されているはず)

    つまり、許容されているスタックメモリの大きさが2~3MBくらいしか確保されていない設定で、空きメモリが足らなくなって、メモリ確保失敗でエラーになりプログラムは強制終了されるでしょう。

    改善するには、

    1. スタックをできるだけ使わないようにする
    2. スタックを大きくする

    のどちらかにする必要があります。

    スタックを使わないようにするには、

    • 大きな配列をグローバル変数として宣言する。
    • 関数内でmalloc,freeを使用してヒープメモリに配列を確保する
    • メモリを使わずファイルなどに逐次読み書きする

    などの手段があるので、好きな方法に変更してください。

    スタックの大きさの変更は、どのコンパイラ,リンカを使用しているのかが書かれていないので具体的な方法は提示できません。
    MicrosoftC++コンパイラ,リンカを使用しているのであれば、標準のスタックの大きさは1MBとされています。リンカーの/STACK オプションを大きくしてビルドしてください。
    それ以外のリンカなら、そのリンカの説明を調べて変更してください。

    1 人がこの回答が役に立ったと思いました。

0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。