Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中作为参数传递多维数组_C_Arrays_Pointers_Multidimensional Array - Fatal编程技术网

在C中作为参数传递多维数组

在C中作为参数传递多维数组,c,arrays,pointers,multidimensional-array,C,Arrays,Pointers,Multidimensional Array,C新手,我需要一些帮助:有人能向我解释并提供解决方法吗 int n=1024; int32_t data[n]; void synthesize_signal(int32_t *data) { ...//do something with data} 让我改变函数中的数据;但事实并非如此 int n=1024; int number=1024*16; int32_t data[n][2][number]; void synthesize_signal(int32_t *data)

C新手,我需要一些帮助:有人能向我解释并提供解决方法吗

int n=1024;
int32_t data[n];
void synthesize_signal(int32_t *data) {
       ...//do something with data}
让我改变函数中的数据;但事实并非如此

int n=1024;
int number=1024*16;
int32_t data[n][2][number];
void synthesize_signal(int32_t *data) {
       ...//do something with data}
编译器错误消息与预期的int32_t*类似,但得到的却是int32_t*[2][sizetypenumber]。请重试

synthesize_signal(int32_t** data)
{

}

您的函数还需要知道数据是多维的。还应该考虑重新命名数据数组。我怀疑它是一个全局变量,在函数中使用相同的名称可能会导致问题。

调用该函数时,请执行以下操作:

synthesize_signal(&data[0][0][0]);
void synthesize_signal(int32_t data[][2][number]) { ...

首先,在C中通过引用传递数组。因此,您可以传递某种类型的指针,函数可以修改数组中的数据。您不必担心向数组传递指针。事实上,在C语言中,恰好指向数组存在的指针与数组本身之间没有真正的区别

在你的第一个版本中。创建一维数组数据[n],并将其传递给函数。在数组中,您可以这样使用它,比如data[i]。这将直接转换为data+i sizeofint32\t。它使用数组中元素的大小来查找内存位置,即我在数组开头前面的位置

int n=1024; 整数=1024*16; int32_t数据[n][2][number]; 无效合成信号INT32\u t*数据

在第二种情况下,您正在案例中设置多维数组3D。您的设置正确。问题是,当您将它传递给函数时,唯一传递给它的是数组的存在地址。当它在函数中使用时,您将执行以下操作

data[i][1][x] = 5;
在内部,C正在计算该位置从数组开始的距离。为了做到这一点,它需要知道数组的维度。与一些较新的语言不同,C存储有关数组长度、大小或任何内容的任何额外数据。您只需要更改函数签名,以便它知道预期的数组的形状/大小。由于这种方式,它计算数组位置,不需要第一个维度

在这种情况下,将函数签名更改为如下所示:

synthesize_signal(&data[0][0][0]);
void synthesize_signal(int32_t data[][2][number]) { ...
按照与上面第二个相同的方式设置阵列,只需按预期调用即可:

synthesize_signal(data);
这会帮你解决一切


注释中提到了一些关于使用更具描述性的变量名以及全局变量与局部变量的有用信息。请记住所有有效的评论。我刚刚谈到了在多维数组方面存在的代码问题。

没有,现在它抱怨它需要int32\u t**但得到了int32\u t*[2][sizetypenumber]instead@Eric,不,你需要空合成信号输入32*data[2][number]哦,我没有看到第三维度谢谢你的回答,但如果我现在不事先打电话,我怎么能做到这一点呢?我也可以将其作为参数传递吗?@wa4557函数中的代码需要知道数组的维度才能访问它。给定一个一维整数数组,可以像处理任何形状一样处理它,但必须将其强制为该形状和/或自己进行偏移计算。为了做到这一点,你需要知道尺寸,所以你还没有真正做到。如果您需要更大的灵活性,那么更改处理数据的方式通常会更容易。例如,使用1d结构数组。事实上,这与您如何处理数据和上下文有关。