2011-06-07 38 views
1

當我嘗試調試我的C程序時,甚至在編譯器開始執行任何行之前,我得到: 「HistsToFields.exe中的0x00468867未處理異常:0xC00000FD:堆棧溢出。C中的堆棧溢出錯誤在執行任何步驟之前

我不知道如何發現問題,因爲程序甚至沒有開始執行任何行(或至少這是我可以從編譯器調試窗口中看到的)。如果我的程序沒有任何行被執行,怎麼知道是什麼導致溢出? 「當調試器打破它指向一條線在chkstk.asm」

我在win7上使用Microsoft Visual Studio 2008。

我設置堆棧保留大小3億

PS:用來執行罰款過,但另一臺機器上的程序。

我有一個csv格式的數據庫(120000 x 60),我需要將其更改爲空格分隔。該程序(我沒有寫我自己)定義輸出文件的結構:

`struct OutputFileContents { 
    char Filename[LINE_LEN]; 
    char Title[LINE_LEN]; 
    int NVar; 
    char VarName[MAX_NVAR][LINE_LEN]; 
    char ZoneTitle[LINE_LEN]; 
    int  NI; 
    int  NJ; 
    int  NK; 
    double Datums[MAX_NVAR]; 
    double Data[MAX_NVAR][MAX_NPOINT];` 

這最後一個數組「數據[] []」就是包含了所有的輸出。因此是巨大的尺寸。 該數組大小「MAX_NPOINT」在項目中的標題源文件中設置,該標題由項目中的多個程序使用。

非常感謝您提前。 艾哈邁德。

+1

+1堆棧溢出引用。 – 2011-06-07 15:43:04

+4

你有一個無限遞歸的地方。 – 2011-06-07 15:43:24

+3

如果你得到一個異常,那麼你的編譯器不僅已經啓動,它已經完成,並且你已經運行了你的程序(失敗了)。 – Arafangion 2011-06-07 15:45:43

回答

3

首先,IDE!=編譯器!=調試器。

其次,無論調試器調試應用程序失敗的原因是什麼 - 一個龐大的數據集,是一個嚴重的設計錯誤。修復設計錯誤,並且您的調試器問題將消失。

至於爲什麼調試器失敗......不知道。內存太少安裝? 32位和64位平臺?無限遞歸構造靜態變量?真的不能說,不看東西,你還沒有給我們,像源,環境的規格等

編輯:如果提示錯過:全局/靜態數據對象之前main()開始建造執行。這些構造函數中的無限(或太深)遞歸可能會觸發堆棧溢出。 (我假設C++代替C,因爲您給出的錯誤消息是「未處理的異常」。)

編輯2:您添加了需要轉換爲空格分隔的「數據庫」。沒有看到代碼的其餘部分:試圖在內存中執行整個轉換並不是一個好主意。讀一條記錄,轉換它,寫下它。重複。如果你需要諸如「最長記錄」之類的東西來確定輸出格式,那麼爲了查找輸出大小而迭代一次只讀輸入,然後再次進行實際轉換。

+0

好吧非常感謝你,我將數組大小從145000改爲32000,它運行良好,但現在我會遇到處理所有數據的問題?對不起,我不擅長這一點。如果不使用陣列那麼大,處理這種大型數據庫的其他選擇是什麼? – hoohaahii 2011-06-07 16:37:16

+0

你想用數據做什麼?令人驚訝的是,您始終需要內存中的全部數據集。你可以逐步計算你想要的任何東西嗎? – asm 2011-06-07 17:05:44

+0

@Andrew Myers:請檢查我的問題的編輯版本。 – hoohaahii 2011-06-07 18:13:02