在C中传递非全局数组变量

时间:2013-12-04 21:02:04

标签: c arrays pointers long-integer unsigned

对我来说,C语言是一种相当新的语言,我的大部分编程知识都是基于Java或基于网络的语言 - 所以如果我遇到这个问题的完整菜鸟,请保持温和!

我有一个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的返回对象,它也是一个数组。

与往常一样,非常感谢您的帮助!

2 个答案:

答案 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]也可以正常工作,正如另一个答案的评论所指出的那样。