代码之家  ›  专栏  ›  技术社区  ›  cuteCAT

关于二维阵列

  •  1
  • cuteCAT  · 技术社区  · 14 年前

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

    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]));
    

    const 离开二维阵列 PATTERNS . 原因是init函数只被调用一次,在剩下的代码中, 模式 是严格只读的。

    在第二个陈述中,我需要通过 数组到 int** 争论。直接传递导致编译错误。


    我已经解决了这个问题,就在@Andrey发布答案的时候。是的 int[][] 不能铸造到 内景** .

    int* 通过 &(PATTERNS[0][0]) const_cast 去掉引用语法。

    4 回复  |  直到 13 年前
        1
  •  7
  •   AnT stands with Russia    14 年前

    首先,C++中不存在像数组类型(或函数类型)那样的东西。但这正是你想要做的。如果您想从某个对象中去掉常量,您必须转换为指针或引用类型。在您的例子中,在cast的接收端有一个引用,因此cast本身也必须是to reference类型

    int (&patterns)[20][4] = const_cast<int (&)[20][4]>(PATTERNS); 
    

    当然,正如Bill已经指出的,从常量对象中去掉常量(然后尝试修改对象)会导致未定义的行为。

    第二,二维数组不能作为数组传递到任何地方 int ** PATTERNS 在某个地方,你可以把它当作 const int (&)[20][4] , const int (*)[20][4] , const int [][4] const int (*)[4] 或者类似的,但不是 . 搜索SO和/或阅读一些 FAQ 了解原因。这已经解释了太多次了,不能再重复了。

        2
  •  1
  •   Bill    14 年前

    当你申报时 PATTERNS

    我猜你的编译器错误是 cannot convert 'int (*)[4]' to 'int**' for argument '2' to 'void UsePattern(int, int**, int)' ?

        3
  •  1
  •   goedson    14 年前

    init_PATTERN() 在构造函数中工作并重写 operator[]

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

        4
  •  1
  •   Tim Leaf    14 年前

    C++数组很复杂。你不能把它们扔来扔去,指望它们能像某些语言那样工作。从另一个数组初始化数组的唯一方法是浏览 分别循环和复制每个项目。这对于二维数组来说是双重的(意味着需要两个数组) 对于 循环)。

    你好像想把事情弄得更复杂些。例如,如果每次运行程序时,要分配给模式的一组值都相同,则可以如下初始化二维变量:

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