2012-04-28 5 views
4

このC++コードをvs2010でコンパイル(および実行)するときに、スタックオーバーフロー例外が発生する前に、スタックオーバーフロー例外が発生し、コンソールに「開始」を書き込むことができます。main()

私が使用するすべてのヘッダーファイルはstdafx.hに含まれていますが、明らかに問題はありません(ヘッダーファイルを直接インクルードする場合と同じ問題です)。

スタックトレースは次のとおりです。

> msvcr100d.dll!__set_flsgetvalue() Zeile 145 + 0xc Bytes C 
    msvcr100d.dll!_getptd_noexit() Zeile 500 C 
    msvcr100d.dll!_getptd() Zeile 523 + 0x5 Bytes C 
    msvcr100d.dll!_LocaleUpdate::_LocaleUpdate(localeinfo_struct * plocinfo) Zeile 243 + 0x5 Bytes C++ 
    003efe3c() 
    TerrainGenerator.exe!pre_cpp_init() Zeile 298 + 0x21 Bytes C 

任意の助けをいただければ幸いあなたは、コード・スタイルで表示されて、私は、Cの++での絶対的な初心者だけど、私は取り除くために、正確にすべてのものを試してみました1つの追加機能などを宣言していないなど、この厄介な問題の...私を助けてください、あなたが追加情報が必要かどうか尋ねることを躊躇しないでください。 ありがとうございます。

#include "stdafx.h" 

int main(int argc, char* argv[]) 
{ 
    puts("Start"); 

    const int res = 4096; 
    srand(time(NULL)); 

    uint16_t data[(res+1)*(res+1)]; 

    uint16_t variance = 2000; 
    int seed = 1337; 

    data[0] = ((seed>>1)+(int)(rand()/(RAND_MAX*(seed+(seed>>1))))); 
    data[res] = ((seed>>1)+(int)(rand()/(RAND_MAX*(seed+(seed>>1))))); 
    data[res*res] = ((seed>>1)+(int)(rand()/(RAND_MAX*(seed+(seed>>1))))); 
    data[res*(res+1)] = ((seed>>1)+(int)(rand()/(RAND_MAX*(seed+(seed>>1))))); 

    int count = 0; 
    for(int size=res;size>=1;size=size>>1,variance=variance>>1) 
    { 
     count++; 
     for(int x=size;x<res;x+=size<<1) 
     { 
      for(int y=size;y<res;y+=size<<1) 
      { 
       data[x*res+y] = data[(x-size)*res+(y-size)] + data[(x-size)*res+(y+size)] + data[(x+size)*res+(y-size)] + data[(x+size)*res+(y+size)]; 
       data[x*res+y] /= 4; 
       data[x*res+y] += (variance>data[x*res+y])?(-(data[x*res+y]^2/variance)+(int)(rand()/(RAND_MAX*(data[x*res+y]^2/variance)))):(-variance+(int)(rand()/(RAND_MAX*variance*2))); 
      } 
     } 

     for(int x=0;x<res;x+=size) 
     { 
      for(int y=0;y<res;y+=size) 
      { 
       if(x!=res-1) 
       { 
        data[(x+(size>>1))*res+y] = data[x*res+y] + data[(x+size)*res+y] + ((y!=res-1)?data[(x+(size>>1))*res+(y+(size>>1))]:0) + ((y!=0)?data[(x+(size>>1))*res+(y-(size>>1))]:0); 
        data[(x+(size>>1))*res+y] /= (y!=res-1&&y!=0)?4:3; 
        data[(x+(size>>1))*res+y] += (variance>data[(x+(size>>1))*res+y])?((-(data[(x+(size>>1))*res+y]^2/variance)+(int)(rand()/(RAND_MAX*(data[(x+(size>>1))*res+y]^2/variance))))):(-variance+(int)(rand()/(RAND_MAX*variance*2))); 
       } 
       if(y!=res-1) 
       { 
        data[x*res+(y+(size>>1))] = data[x*res+y] + data[x*res+(y+size)] + ((x!=res-1)?data[(x+(size>>1))*res+(y+(size>>1))]:0) + ((x!=0)?data[(x-(size>>1))*res+(y+(size>>1))]:0); 
        data[x*res+(y+(size>>1))] /= (x!=res-1&&x!=0)?4:3; 
        data[x*res+(y+(size>>1))] += (variance>data[x*res+(y+(size>>1))])?((-(data[x*res+(y+(size>>1))]^2/variance)+(int)(rand()/(RAND_MAX*(data[x*res+(y+(size>>1))]^2/variance))))):(-variance+(int)(rand()/(RAND_MAX*variance*2))); 
       } 
      } 
     } 
    } 

    size_t Count = res*res; 
    uint16_t* Block = data; 
    char* Path = "export.raw"; 

    if(!Block) return false; 
    FILE * filePointer = NULL; 
    errno_t error = fopen_s(&filePointer, Path, "wb"); 
    if(error) return false; 
    fwrite(Block, sizeof(uint16_t), Count, filePointer); 
    fclose(filePointer); 
    return true; 

    return 0; 
} 
+0

@ user384706:どのように状況が改善されますか? –

+1

スタックオーバーフローのように見えます! –

答えて

10

問題は、それがスタック(通常は1 MB)に収まるには大きすぎる16メガバイトの+のローカル配列である

uint16_t data[(res+1)*(res+1)]; 

です - あなたがヒープでそれを作成する必要がありますnew声明:

uint16_t* data = new uint16_t[(res+1)*(res+1)]; 

、その後、あなたが任意のより多くのそれを必要としないときdelete声明でそれを割り当て解除することを忘れないでください:

delete[] data; 
+5

または、好ましくはstd :: vector を使用します。 –

+0

phew、ありがとう、それはそれを解決しました。君たちは最高です! – 3lm

+1

@SteveFallows:初心者としては、テンプレートライブラリにジャンプする前に、 'new'と' delete'の作業がうまくいくかもしれないと感じるかもしれません。テンプレートライブラリの前にC/C++の方法で始めました。利用可能です。 – MiMo

関連する問題