2015-02-11 62 views
1

我使用了clang ++來編譯程序,我需要在clang ++中編譯它時沒有錯誤。我沒有與其他編譯器錯誤。隱式轉換更改簽名'int'到'unsigned int'

在代碼中的錯誤行

memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants); 

的整體功能是這樣的:

Ocean::Ocean(int num_boats, int x_quadrants, int y_quadrants) 
{ 
    grid_ = new int[x_quadrants * y_quadrants]; 
    memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants); 
    x_quadrants_ = x_quadrants; 
    y_quadrants_ = y_quadrants; 
    boats_ = new Boat[num_boats]; 
    num_boats_ = num_boats; 

    stats_.hits = 0; 
    stats_.misses = 0; 
    stats_.duplicates = 0; 
    stats_.sunk = 0; 
} 

我用memset所以我不會讓垃圾量輸出測試時使用不同的驅動程序。沒有必要爲叮噹聲提供命令行,因爲我不允許改變它。

+0

什麼是錯誤?錯誤在哪裏?在構造函數中提到的'Ocean'成員變量的類型是什麼?當你說「沒有其他編譯器出錯」時,你是什麼意思?那裏有什麼彙編選項? clang有哪些選項?你的問題缺少很多重要的信息。 – Pradhan 2015-02-11 05:58:36

回答

4

更換

grid_ = new int[x_quadrants * y_quadrants]; 
memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants); 

只有

grid_ = new int[x_quadrants * y_quadrants](); 

注意括號,告訴編譯器,你想這個零初始化(或真正的值初始化,這在這裏簡化爲零初始化)。

更好的是,使用std::vector而不是這個危險的DIY方案。

+0

謝謝,錯誤現在已消失。順便說一下,我們實際上還沒有涉及STL的任何內容。所以我不知道如何使用std :: vector來擺脫這一點。 – TommyLan 2015-02-11 07:15:32

0

sizeof返回未簽名的std::size_t。您正在乘以(簽名)int變量,因此如果在叮噹中啓用-Wsign-conversion,則會發出警告。

您可以static_cast爲無符號的尺寸以避免警告 - 如果需要,請針對負值添加警戒(例如,assert)。

(您的代碼可能受益於使用member initializer list

+0

感謝您的建議。也許我沒有說清楚,但實際上我不允許通過改變命令行來擺脫警告。但是,謝謝。 – TommyLan 2015-02-11 07:17:03

+0

我沒有告訴你改變命令行,我告訴你如何修復代碼以避免警告。 (但是在這種情況下,Cheers的答案更適合。) – Mat 2015-02-11 08:18:14

相關問題