2016-03-18 56 views
0

我目前正在研究一個程序,它會根據輸入提取輸入(通過main)並繪製不同的分形。 我保存解析並轉換(對數)的用戶輸入,在結構中:有無論如何知道變量是否已經在C中初始化?

typedef struct 
{ 
     unsigned int xcord,ycord; 
}point_t; 

typedef struct 
{ 
     int fractalType; 
     double lstart,lend,lconstant; 
     double leftangle,rightangle; 
     point_t drawStart; 

}input_data_t; 

我有是,某些分形不使用包含在結構中的所有變量的問題,如果一個特定的分形被稱爲一個變量,它不會使用我必須顯示一個錯誤。

反正現在要解決這個問題了,我知道當DECLARED「拾起」垃圾的時候,變量在事先分配的內存位置。有沒有什麼辦法可以知道一個變量在運行時是否已經初始化,以確保解析後沒有使用不必要的變量? (如果是這樣我需要一個跨平臺的解決方案)

+2

這是不可能的。建議將您的結構初始化爲已知值。 –

+2

只有通過初始化您的結構,才能測試容易識別的金絲雀值。 – user4581301

回答

2

不,沒有辦法直接找到它。從未初始化的變量讀取調用未定義的行爲,並且無法從中恢復。但是,您有幾個選項可以防止發生這種情況。

如果您的變量具有有意義的默認值,那麼在對它們進行任何其他操作之前,將它們初始化爲默認值即可。你仍然無法區分一個默認的變量和恰好具有相同的值的變量,但如果你的邏輯沒有這些知識,那麼這就完全沒問題了。 (例如,如果你要繪製的正弦函數˚F X)  =   一個   +   b   SIN(ç   X   +   d),這將是自然爲默認一個 d 0且 bç爲1)

如果您的參數未跨越數據類型的整個值範圍,可以將它們初始化爲一些標記值,然後在使用它們之前檢查它們。例如,對於浮點值,您可以使用NAN,對於不能爲負數的任何類型的數量,您可以使用− 1。許多人不喜歡這個解決方案,因爲它很容易忘記檢查價值,並使用標記就好像它是一個合適的值,從而計算垃圾。我相信每種技術都有一個時間和地點,但這個可能確實被過度使用。

如果一切都失敗了,可以爲每個變量添加一個標誌,指出它是否有值。爲了使其可用,我建議您創建一個合理名稱的數據類型,例如這個。

struct optional_float 
{ 
    bool initialized; // always safe to read, set appropriately 
    float value;  // only safe to read if initialized == true 
}; 

在C++中,使用新的std::experimental::optional<T>可以做得更好。但我意識到C++標籤已從您的問題中刪除。

最後,請務必通過調試器(如Valgrind)運行您的代碼,或使用sanitizer來檢測未初始化變量的意外讀取。

+0

謝謝你想避免使用標誌,但顯然沒有其他選擇。感謝提示! –

0

我不認爲有方法來檢查變量是否initialiez或不。 由於c中的默認變量在初始化之前有一個隨機值或0。

如果您想知道變量是否已初始化,您可以爲此變量設置一個合法的值範圍。在使用它之前,您可以檢查該值是否在示波器內。

如果您要使用變量,使用變量安全的最佳方法是自己檢查它。

0

爲什麼不只是用一些無效值初始化該結構,那麼問題就成爲該值是否無效。

相關問題