我有一個常數整數,steps,它是使用其他兩個常數變數的商的底函式計算的。但是,當我嘗試將其用作陣列的長度時,Visual Studio 告訴我它必須是一個常量值,并且當前值不能用作常量。如何使其成為可用作陣列長度的“真實”常量?地板功能是問題嗎?我可以使用其他替代方法嗎?
const int simlength = 3.154*pow(10,7);
const float timestep = 100;
const int steps = floor(simlength / timestep);
struct body bodies[bcount];
struct body {
string name;
double mass;
double position[2];
double velocity[2];
double radius;
double trace[2][steps];
};
uj5u.com熱心網友回復:
標準庫的std::powandstd::floor函式是不可能的,因為它們不是constexpr-qualified。
您可能可以std::pow用my_pow標記為的手寫實作替換constexpr。既然你只是想利用整數的力量,那應該不會太難。如果您只使用 10 的冪,浮點文字也可以用科學記數法撰寫,例如1e7,這使得pow呼叫變得不必要。
該floor呼叫沒有必要的,因為float/double來int轉換已經沒有隱含地板。或者更準確地說,它會截斷,對于正非負值,這相當于地板。
然后你還應該在變數宣告中替換constwithconstexpr以確保變數在常量運算式中可用:
constexpr int simlength = 3.154*my_pow(10,7); // or `3.154e7`
constexpr float timestep = 100;
constexpr int steps = simlength / timestep;
理論上只float需要這種改變,因為const整數型別有一個特殊的例外,但這種方式似乎更一致。
另外,我感覺你的變數型別有問題。甲長度和步驟不應由浮點運算和型別,但由整數單獨型別和操作來確定。浮點運算不是精確的,并且相對于對實數的數學精確計算會引入錯誤。這樣很容易出現意外的錯誤或更嚴重的錯誤。
uj5u.com熱心網友回復:
在定義類之前,您不能定義型別別的陣列。
解決方案:先定義body再定義bodies。
此外,您不能使用未定義的名稱。
解決方案:bcount在使用之前定義它作為陣列的大小。
地板功能是問題嗎?我可以使用其他替代方法嗎?
std::floor是一個問題。有一個簡單的解決方案:不要使用它。將浮點數轉換為整數隱式執行類似的操作(在負數的情況下行為不同)。
std::pow是另一個問題。一般來說,它不能被簡單地替換,但在這種情況下,我們可以使用科學計數法中的浮點文字來代替。
最后,非 constexpr 浮點變數不是編譯時間常數。解決方案:使用constexpr.
這是一個有效的解決方案:
constexpr int simlength = 3.154e7;
constexpr float timestep = 100;
constexpr int steps = simlength / timestep;
PStrace是一個非常大的陣列。我建議不要使用這么大的成員變數,因為類的用戶很容易不會注意到這些細節,而且他們很可能會在自動存盤中創建類的實體。這是一個問題,因為自動存盤中這么大的物件很容易導致堆疊溢位錯誤。使用std::vector而不是陣列是一個簡單的解決方案。如果你確實使用了std::vector,那么作為副作用,編譯時常量大小的要求消失了,你將不再有使用std::pow等問題。
uj5u.com熱心網友回復:
因為simlength是3.154*10-to-the-7th,并且因為timestep是 10 的平方,所以steps變數的值可以寫成:
3.154e7 / 1e2 == 3.154e5
并且,添加一個型別轉換,您應該能夠將陣列撰寫為:
double trace[2][(int)(3.154e5)];
請注意,這是非常不規則的,并且應該有廣泛的評論來描述您為什么這樣做。
嘗試切換到constexpr:
constexpr int simlength = 3.154e7;
constexpr float timestep = 1e2;
constexpr int steps = simlength / timestep;
struct body {
string name;
double mass;
double position[2];
double velocity[2];
double radius;
double trace[2][steps];
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405243.html
標籤:
上一篇:創建新變數,然后根據新變數過濾
