簡體   English   中英

符合 C/C++ ISO 的將 void ptr 轉換為多維 arrays

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM