C 对我来说是一门相当新的语言,我的大部分编程知识都是基于 Java 或基于 Web 的语言 - 所以如果我对这个问题感到完全菜鸟,请温柔点!
我有一个 unsigned long
类型的数组,大小为 100000,在 main()
中声明。当满足用户输入的特定条件时,将进行 record()
函数调用,该函数调用启动某些硬件以开始录音(对于问题的范围来说并不重要)。
在 record()
函数调用中,只要寄存器中的“就绪”标志被初始化,寄存器的内容就会被复制到数组单元中 - 此过程会迭代,直到全部 100000 个数组的单元格已被记录到。
现在需要将 record()
函数中的数组返回到 main()
中的变量。我已经尝试通过简单地从方法调用返回一个 unsigned long
类型的变量来实现这一点 - 但我似乎无法完成这项工作。我也尝试过使用指针 - 但当我尝试这个时,我对 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
类型的返回对象,它也是一个数组。
一如既往,非常感谢您的帮助!
最佳答案
这是最好的方法:
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]
关于c - 在C中传递非全局数组变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20385865/