2012-04-28 30 views
4

之前發生堆棧溢出異常,在它甚至可以向控制檯寫入「Start」一瞥之前,我會遇到堆棧溢出異常。使用vs2010編譯(並執行)此C++代碼時,在進入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++中絕對的初學者,你可能在代碼風格看,我想每一件事擺脫這個煩人的問題,如甚至沒有宣佈一個額外的功能等...請幫助我,並不要猶豫,問你是否需要額外的信息。 在此先感謝。

#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:這會如何改善情況? – 2012-04-28 19:03:07

+1

看起來像堆棧溢出! – 2012-04-28 19:03:28

回答

10

問題是

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

它的16 MB +是太大,不適合在堆棧(通常爲1 MB)本地陣列 - 你有一個堆創建它new聲明:

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

,然後記得,當你不需要任何更多與delete語句解除分配:

delete[] data; 
+5

或者最好使用std :: vector 。 – 2012-04-28 19:05:27

+0

phew,謝謝,解決了它。你們是最棒的! – 3lm 2012-04-28 19:12:03

+1

@SteveFallows:作爲一個新手,或許可以感受一下,在跳入模板庫之前,'new'和'delete'工作是否可能是好的 - 儘管我不確定,但是在模板庫之前我用C/C++的方式開始了自己可用。 – MiMo 2012-04-28 19:17:12

相關問題