gpt4 book ai didi

c - 在 C 中传递一个数组数组

转载 作者:太空宇宙 更新时间:2023-11-04 05:06:21 25 4
gpt4 key购买 nike

我需要一个函数,它接受一个二维数组并生成随机位,因此结果是一个随机二进制字符串数组。

我有以下代码,

#define pop_size 50
#define chrom_length 50
main() {
int population[pop_size][chrom_length];
init_pop(&population);
}
int init_pop(int *population[][]) {
for(i = 0; i < pop_size; i++) {
for(j = 0; j < chrom_length; j++) {
*population[i][j] = rand() % 2;
}
}
return 0;
}

在编译时,我收到以下错误消息:

array type has incomplete element type

有什么建议吗?

最佳答案

通常的高谈阔论时间...

当数组表达式出现在大多数上下文中时,其类型从“T 的 N 元素数组”隐式转换为“指向 T 的指针”,并将其值设置为指向数组的第一个元素。此规则的异常(exception)情况是当数组表达式是 sizeof 或一元 & 运算符的操作数时,或者它是在声明。

在您的代码上下文中,这一切意味着什么?

population 表达式的类型是“pop_size-chrome_length 的元素数组-int 的元素数组”。按照上面的规则,在大多数情况下,表达式 population 将隐式转换为类型“指向 chrome_length 的指针 - int 元素数组”,或 int (* )[chrome_length]

然而,表达式 &population 的类型是“指向 pop_size 的指针 - chrome_length 的元素数组 - int 的元素数组”,或 int (*)[pop_length][chrome_size],因为 population 是一元 & 运算符的操作数。

请注意,这两个表达式具有相同的(数组第一个元素的地址),但类型不同。

根据您编写的代码,您将函数调用为

init_pop(&population);

对应的函数定义应该是

int init_pop(int (*population)[pop_size][chrome_length]) // note that both dimensions
// must be specified

并且您将访问每个元素作为

(*population)[i][j] = initial_value;

请注意,这意味着 init_pop 可以处理pop_size x chrome_length 数组;你不能在不同大小的数组上使用它。

如果您将函数调用为

init_pop(population); // note no & operator

那么相应的函数定义就必须是

int init_pop(int (*population)[chrome_length]) // or population[][chrome_length],
// which is equivalent

并且您将访问每个元素作为

 population[i][j] = initial_value;

请注意,在这种情况下,您不必显式取消引用 population。现在您可以处理具有不同种群大小的阵列,但您仍然受制于固定的染色体长度。

第三种方法是将指向数组第一个元素的指针作为指向 int 的简单指针显式传递,并将其视为一维数组,根据数组维度手动计算偏移量(作为单独的参数传递):

init_pop(&population[0][0], pop_size, chrome_length);
...
int init_pop(int *population, size_t pop_size, size_t chrome_length)
{
size_t i, j;
...
population[i*chrome_length+j] = initial_value;
...
}

现在 init_pop 可用于不同大小的 int 二维数组:

int pop1[10][10];
int pop2[15][20];
int pop3[100][10];
...
init_pop(&pop1[0][0], 10, 10);
init_pop(&pop2[0][0], 15, 20);
init_pop(&pop3[0][0], 100, 10);
...

编辑:请注意,上述技巧仅适用于连续分配 二维数组;它不适用于主要维度和次要维度分别分配的动态分配数组。

这是一个方便的表格,假设定义了 int a[N][M]:

Expression     Type           Implicitly converted to----------     ----           -----------------------a              int [N][M]     int (*)[M]a[i]           int [M]        int *a[i][j]        int            &a             int (*)[N][M]   

关于c - 在 C 中传递一个数组数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1874604/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com