我有一个unsigned long
类型的数组,大小为100000,在main()
中声明。当满足用户输入的特定条件时,会进行record()
函数调用,启动某些硬件以开始录音(对于问题的范围并不重要)。
在record()
函数调用中,只要寄存器中的“就绪”标志被初始化,寄存器的内容就会被复制到一个数组单元 - 这个过程会一直迭代,直到数组的所有100000个单元都有被记录到。
现在需要将record()
函数中的数组返回到main()
中的变量。我通过从方法调用中返回类型unsigned long
的变量来尝试这一点 - 但我似乎无法使其工作。我也尝试使用指针 - 但是当我尝试使用C时,我对C的经验不足。
我使用指针的代码是:
int main(void){
...
unsigned long recordingOne[100000];
unsigned long *ptrOne;
ptrOne = &recordingOne;
...
initiateRecording(ptrOne);
}
void initiateRecording(unsigned long *ptr){
unsigned long returnOne[100000];
for(i = 0; i<100001; i++){
returnOne[i] = AD0DR1 //AD0DR1 corresponds to hardware register
}
*ptr = returnOne;
}
为此我得到两个警告:
(in function main) warning: assignment from incompatible pointer type [enabled by default]
(in function initiateRecording) warning: assignment makes integer from pointer without a cast [enabled by default]
当我在没有指针的情况下尝试此操作时,我尝试将数组作为参数传递,然后返回一个数组。看起来像这样:
int main(void){
...
unsigned long recordingOne[100000];
...
recordingOne = initiateRecording();
}
unsigned long[] initiateRecording(){
unsigned long toReturnOne[100000];
for(i = 0; i<100001; i++){
toReturnOne[i] = AD0DR1 //AD0DR1 corresponds to hardware register
}
return toReturnOne;
}
编译器也不是这个的粉丝 - 我正在努力声明类型为unsigned long
的返回对象,它也是一个数组。
与往常一样,非常感谢您的帮助!
答案 0 :(得分:3)
这是最好的方法:
int main(void)
{
...
unsigned long recordingOne[100000];
unsigned long *ptrOne; // <<<--- Don't need this
ptrOne = &recordingOne; // <<<--- Don't need this
...
initiateRecording(recordingOne); <<<--- Pass address of array directly
}
void initiateRecording(unsigned long *ptr)
{
for(i = 0; i<100000; i++) <<<---- If i == 100000 undefined behavior, such as a segmentation fault, may occur; change 100001 to 100000
ptr[i] = AD0DR1 // <<<--- write directly to array
}
recordingOne
中的可访问元素来自[0]
到[99999]
答案 1 :(得分:0)
两个编译器警告的来源如下:初始化像int array[100];
这样的C数组时,符号array
是指向数组第一个元素的指针。因此,当您编写int *p = &array
之类的内容时,结果是p
不指向array
的开头,而是指向内存中指向{{1}开头的指针的位置}}。你想要的是array
。
编辑:或int *p = &array[0]
也可以正常工作,正如另一个答案的评论所指出的那样。