C++ 关于二维阵列

C++ 关于二维阵列,c++,multidimensional-array,C++,Multidimensional Array,我在使用二维数组时遇到了一些问题 static const int PATTERNS[20][4]; static void init_PATTERN() { // problem #1 int (&patterns)[20][4] = const_cast<int[20][4]>(PATTERNS); ... } extern void UsePattern(int a, const int** patterns, int patterns_siz

我在使用二维数组时遇到了一些问题

static const int PATTERNS[20][4];

static void init_PATTERN()
{
   // problem #1
   int (&patterns)[20][4] = const_cast<int[20][4]>(PATTERNS);  
   ...
}

extern void UsePattern(int a, const int** patterns, int patterns_size);

// problem #2
UsePattern(10, PATTERNS, sizeof(PATTERNS)/sizeof(PATTERNS[0]));
在第一条语句中,我需要将常量从二维数组模式中去掉。原因是init函数只被调用一次,在剩下的代码中,模式是严格只读的

在第二条语句中,我需要将PATTERNS数组传递给int**参数。直接传递导致编译错误

我已经解决了这个问题,就在@Andrey发布答案的同时。是int[][]不能强制转换为int**

可以通过&PATTERNS[0][0]将其强制转换为int*,并且必须使用行大小和行中元素的数量修改函数原型。该数组可以通过引用语法进行常量转换

当您将模式声明为常量时,编译器可能会将其设置在只读内存中。除非该项最初声明时没有const,否则无法安全地丢弃const

我猜您的编译器错误是无法将参数“2”的“int*[4]”转换为“int**”转换为“void usepatternit,int**,int”?

当您将模式声明为常量时,编译器可能会将其设置在只读内存中。除非该项最初声明时没有const,否则无法安全地丢弃const


< P>我猜测你的编译器错误不能将int’*[4 ]转换为int **,用于参数“2”到“无效UpAtTeTynt,int **,int’,

< p>第一,C++中没有CasktoStor类型或函数类型。然而,这正是你试图做的。如果您想从某个对象中去掉常量,则必须转换为指针或引用类型。在您的例子中,在转换的接收端有一个引用,因此转换本身也必须是引用类型

int (&patterns)[20][4] = const_cast<int (&)[20][4]>(PATTERNS); 
当然,正如比尔已经指出的,从一个常量对象中去掉常量,然后试图修改该对象会导致未定义的行为


其次,二维数组不能作为int**指针传递到任何地方。如果您想在某个地方传递模式,可以将其作为常量int&[20][4]、常量int*[20][4]、常量int[][4]、常量int*[4]或类似的形式传递,但不能作为int**。对SO进行搜索和/或阅读一些关于数组的内容以了解原因。这已经被解释了很多次了。

< p>首先,C++中不存在抛出数组类型或函数类型的事情。然而,这正是你试图做的。如果您想从某个对象中去掉常量,则必须转换为指针或引用类型。在您的例子中,在转换的接收端有一个引用,因此转换本身也必须是引用类型

int (&patterns)[20][4] = const_cast<int (&)[20][4]>(PATTERNS); 
当然,正如比尔已经指出的,从一个常量对象中去掉常量,然后试图修改该对象会导致未定义的行为


其次,二维数组不能作为int**指针传递到任何地方。如果您想在某个地方传递模式,可以将其作为常量int&[20][4]、常量int*[20][4]、常量int[][4]、常量int*[4]或类似的形式传递,但不能作为int**。对SO进行搜索和/或阅读一些关于数组的内容以了解原因。这已经解释了太多次,不能再重复了。

AndreyT的答案是完美的。我只想补充一点,我认为最好使用一个类,该类在构造函数中执行init_模式,并重写操作符[],以提供对数组元素的只读访问


当然,这是假设您可以更改UsePattern函数以获得对此类的引用,而不是指向int数组的指针。

AndreyT的答案是完美的。我只想补充一点,我认为最好使用一个类,该类在构造函数中执行init_模式,并重写操作符[],以提供对数组元素的只读访问


当然,这是假设您可以更改UsePattern函数以获得对此类的引用,而不是指向int数组的指针。

C++数组很复杂。你不能把它们扔在一边,期望它们像在某些语言中一样工作。从另一个数组初始化数组的唯一方法是导航for循环并分别复制每个项。这对于二维数组来说是双重的,这意味着您需要两个for循环

看起来你想让事情变得比实际需要的更复杂。例如,如果每次运行程序时要分配给模式的值集都相同,则可以如下初始化二维变量:

static const int foo[2][3] = {{11,12,13},{21,22,23}};

如果分配给模式的一组值在一次执行到下一次执行时有所不同,那么您可能应该尝试找到一种不同的方法来解决问题。我可能会将数据包装在一个类中,特别是如果您打算在代码的其他地方使用大小类似的二维数组

C++数组很复杂。你不能把它们扔在一边,期望它们像在某些语言中一样工作。初始化arr的唯一方法 来自另一个数组的方法是导航for循环并分别复制每个项。这对于二维数组来说是双重的,这意味着您需要两个for循环

看起来你想让事情变得比实际需要的更复杂。例如,如果每次运行程序时要分配给模式的值集都相同,则可以如下初始化二维变量:

static const int foo[2][3] = {{11,12,13},{21,22,23}};

如果分配给模式的一组值在一次执行到下一次执行时有所不同,那么您可能应该尝试找到一种不同的方法来解决问题。我可能会将数据包装在一个类中,特别是如果您打算在代码的其他地方使用大小类似的二维数组

什么是编译器错误?想和大家分享吗?为什么你不能在数组中使用初始化列表呢?你的“解决问题”评论只是一堆黑客。他们甚至都没有办法接近有效的C++编程,即使它们看起来是第一次工作。编译器错误是什么?想和大家分享吗?为什么你不能在数组中使用初始化列表呢?你的“解决问题”评论只是一堆黑客。他们甚至没有远程接近有效的C++编程,即使它们看起来似乎是第一次工作。