代码之家  ›  专栏  ›  技术社区  ›  Danny Frencham

目标C中的二维整数数组

  •  0
  • Danny Frencham  · 技术社区  · 16 年前

    我正在使用C样式的二维整数数组。

    这在我的主类文件中很好,我可以通过引用其他类来传递数组。当我尝试检索指向数组的指针并处理它时,我遇到了一些问题。

    我的问题是:没有使用C样式的二维数组,有更好的方法吗?也许是我不知道的可可课程?我注意到了nsmatrix,但它似乎是针对细胞的,而不是简单的整数。

    我这里到处都有这样的电话: items[x][y] 因此,一个引用数组位置的简略方法将是很好的。

    更多详情:

    我将数组设置为实例变量,并尝试这样访问:

    -(void) setItems: (int [15][24])items
    {
        (*pitems)[24] = **items;
    }
    
    -(int) getItems
    {
        return (*pitems)[24];
    }
    

    当我试图用 getItems ,我收到编译器关于创建不带强制转换的引用的警告。

    2 回复  |  直到 13 年前
        1
  •  1
  •   Community CDub    8 年前

    如果知道第一个维度的确切大小,则只能传递二维静态数组:

    // OK, even though we don't know the size of the second dimension
    - (void) doStuff: (int [15][])array { ... }
    ...
    int array[15][24];
    [self doStuff:array];
    
    // ERROR: don't know size of first dimension (second dimension is irrelevant)
    - (void) doStuff: (int [][])array { ... }
    

    当然,您的函数只适用于第一维中的一个特定数组大小。如果直到运行时才知道第一个维度的大小,则必须将数组展平为一维数组,或者使用动态分配的指向一维数组的指针数组,如中所示。 KiwiBastard's answer .

        2
  •  3
  •   JamesSugrue    16 年前

    这里有一个有趣的讨论: http://www.idevapps.com/forum/archive/index.php/t-244.html

    基本上,建议是将二维数组转换为多个一维数组。例如:

    int数组[20][8]变为

    int** array = (int*)malloc(20 * sizeof(int*));
    
    unsigned int i = 0;
    for (i = 0; i < 20; ++i)
    {
        array[i] = (int)malloc(8 * sizeof(int));
    }
    
    and your method returns int** and variable is of type int**. 
    

    这有一个优势,正常的二维数组索引工作如预期。

    链接中没有建议的另一个选项是使用nsmutablerray类型的nsmutablerray。这将比标准的C数组慢,但更容易传递和引用。