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