[英]C/C++ ISO compliant casting void ptr to multidimensional arrays
我在 C++ 中有一個 function 看起來像:
//ellipsis are irrelevant variables. Not variadic
lint find_max(const void* ptr, ... , const vector<lint> &nums, ...)
{
const mm (*arr)[nums.size()] = (const mm (*)[nums.size()]) ptr;
//or
const mm (*arr1)[nums.size()] = reinterpret_cast<const mm (*)[nums.size()]>
(ptr);
}
這兩個演員產生了一個錯誤,幾乎沒有詳細說明原因。
error: cannot convert ‘const mm (*)[(<anonymous> + 1)]’ {aka ‘const min_and_max (*)[(<anonymous> + 1)]’} to ‘const mm (*)[(<anonymous> + 1)]’ {aka ‘const min_and_max (*)[(<anonymous> + 1)]’} in initialization
42 | const mm (*arr)[nums.size()] = (const mm(*)[nums.size()])ptr;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| const mm (*)[(<anonymous> + 1)] {aka const min_and_max (*)[(<anonymous> + 1)]}
如果我沒記錯的話,左值類型和相應的轉換都是相似的。 為了將來參考,我應該有超過 2 個維度,我該如何添加它們? 我仍然是指針操作的業余愛好者,所以這將有很大幫助。
編輯這不會在 g++ 中產生任何錯誤:
typedef long long int lint;
lint pInf = ~((unsigned long long int)0) >> 1;
lint nInf = ~pInf;
typedef struct min_and_max
{
lint min{pInf};
lint max{nInf};
}mm;
const lint find_max(const void* ptr, int i, int j, const vector<lint> &nums,
const vector<char> &ops)
{
const int dim = nums.size();
const mm (*arr)[dim] = reinterpret_cast<const mm (*)[dim]>
(ptr);
//algorithm which I haven't figured out yet.
some_lint_value = arr[i][j].max + arr[i-232414][j+46846].min;
return some_lint_value;
}
void caller(vector<lint> &nums, vector<char> &ops)
{
mm arr[ops.size()][nums.size()]; //ISO variable size forbid warn
for (int i = 1; i <= ops.size(); i++)
{
for (int j = 1; j <= nums.size(); j++)
//looped logic for solving the max/min value for an expression problem
arr[i][j].max = find_max(arr, i, j, nums, ops);
}
}
在標准 C++ 中,數組邊界必須是常量表達式。 你的兩個例子都是不正確的。
您觀察到的編譯器行為差異與您的編譯器提供的非標准擴展有關,該擴展顯然將這兩種情況區別對待; 如果您想進一步了解 go,那么查閱編譯器的文檔可能是一種繼續方式。
當然,我的建議是使用標准構造,然后它將適用於每個編譯器,並且行為是有據可查的。
“創建具有可變維度的連續二維數組並通過引用傳遞函數”的要求的最簡單解決方案實際上是創建一個向量並忍受使用x + y*COLS
而不是[x][y]
的輕微不便[x][y]
用於訪問它。
代碼可能看起來像(偽代碼):
lint find_max(vector<mm> &arr2, vector<lint> const& nums, ....otherstuff)
{
mm& item_at_x_y = arr2[x + y * nums.size()];
}
與來電者:
void caller()
{
vector<mm> arr2( nums.size() * ops.size() );
// populate arr2...
find_max(arr2, nums, ops...);
}
可以編寫一個類似矩陣的 class ,它允許[x][y]
訪問語法,例如參見此處或 google 以獲取更多示例。
您可以制作一個使用括號語法的訪問器,例如:
auto arr = [&](size_t y, size_t x) { return arr2[x + y * nums.size()]; };
arr(3, 4) = 5;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.