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][(sizetype)(number)]
。
答案 0 :(得分:1)
试
synthesize_signal(int32_t** data)
{
}
您的功能还需要知道数据是多维的。您还应该考虑重命名数据数组。我怀疑它是一个全局变量,在函数中使用相同的名称可能会导致问题。
答案 1 :(得分:1)
调用此函数时,请执行以下操作:
synthesize_signal(&data[0][0][0]);
答案 2 :(得分:1)
首先,在C中传递数组是通过引用。所以你传递了某种指针,该函数可以修改数组中的数据。您不必担心将指针传递给数组。实际上,在C语言中,恰好是数组存在的指针与数组本身之间没有真正的区别。
在你的第一个版本中。你制作一维数组数据[n],然后将它传递给你的函数。在数组中,您将使用它来表达类似数据[i]的内容。这直接转换为(data +(i sizeof(int32_t))。它使用数组中元素的大小来查找位于数组开头前面的i位置的内存位置。
int n = 1024; int number = 1024 * 16; int32_t data [n] [2] [number]; void synthesize_signal(int32_t * data)
在第二种情况下,您需要设置多维数组(在您的情况下为3D)。你设置正确。问题是当你将它传递给函数时,唯一能传递数组存在地址的东西。当它在函数内部使用时,你会做类似
的事情data[i][1][x] = 5;
内部C正在计算从这个位置开始的数组。为了做到这一点,它需要知道数组的尺寸。 (与某些较新的语言不同,C存储有关数组长度或大小或任何内容的任何额外数据)。您只需要更改函数签名,以便它知道所期望的数组的形状/大小。由于这种方式,它计算阵列位置,它不需要第一个维度。
在这种情况下,请将功能签名更改为:
void synthesize_signal(int32_t data[][2][number]) { ...
按照与上面第二个相同的方式设置数组,并且只需要调用它即可:
synthesize_signal(data);
这应该为你解决所有问题。
评论提到了一些有关使用更具描述性的变量名称以及全局变量和局部变量的有用信息。请记住所有有效的评论。我刚刚解决了你在多维数组方面遇到的代码问题。