2016-02-01 30 views
0

我想一些帮助,指针:在主功能 我已初始化的变量应该指向数组:2D分配的数组(固定的列数),为函数的返回值

int main() { 

int n; 
double (*array)[3]; 
array = fillArray(&n); 

功能接收一个整数参数,它计算行数。该函数的返回值应该是一个指向新创建的数组,其将保存在主函数变量“阵列”:

double (*)[3] fillArray(int * n) { 
    double (*array)[3] = NULL; 
    int allocated = 0; 
    *n = 0; 

    while (1) 
    { 
     /*scanning input*/ 

     if (allocated <= *n) 
     { 
     allocated += 10; 
     array = (double(*)[3]) realloc (array, sizeof(*array) * allocated) 
     } 
     array[*n][0] = value1; 
     array[*n][1] = value2; 
     array[*n][2] = value3; 
     (*n)++; 
    } 
    return array; 
} 

然而,返回值的类型是不正确的,我我有点失落。任何人都可以告诉我这段代码有什么问题吗?

预先感谢您:)

+0

解释“的返回值的类型是不正确的”,什么样的错误你好吗? –

+0

编译错误:在''''之前期望的非限定标识符)和错误:'fillArray'之前的预期初始化程序 – mireille

+0

你认为'double(*)[3]'是什么类型? – e0k

回答

1

你的代码中有一个不相关的语法错误和一些未声明的变量,但你问的问题大概有功能fillArray()声明的形式来做。这种替代方法适用于我:

double (*fillArray(int * n))[3] { 
    double (*array)[3] = NULL; 

    /* ... */ 

    return array; 
} 

请注意形式与相同类型的变量声明的相似性。

的问题是,虽然double (*)[3]是使用一个完全有效的类型标志,也就是说,在投,这是不正确的,你试图做的非常用它来声明对象的类型。

+0

我明白了,所以我应该将整个数组作为参数传递给函数?这是更好的解决方案吗?你发布的代码不适用于我..我真的不明白你如何解除引用..一个函数?对不起,我仍然是C的新手..所以.. – mireille

+0

@mireille,你可以读取声明为“fillValue是接受一个类型为int *'的参数的函数;取消引用*它的返回值*产生一个3的数组'double's“。正如我所指出的那样,该表单与您的变量声明的表单完全平行。 –

+0

@mireille,因为在你的函数内部(重新)为指向的指针分配空间,所以仅仅将你的指针作为参数是不够的。您需要将指针传递给指针,原因与您现在传递指向“int”的指针相同。我认为你已经在处理足够的类型复杂性了 - 对于一个自称为新手的人来说,如果我可以这样说的话,这是非常令人赞赏的。确保你已经正确地复制了我的声明,并且如果你仍然遇到错误,那么确保它们不要引用其他东西。 –

1

给出了一些关于问题中未提及的项目的猜测。

我想这就是你要找的。

注意检查呼叫的成功realloc()

通知的magic号码中的#define

#include <stdlib.h> // realloc(), exit(), EXIT_FAILURE 

#define ALLOCATION_INCREMENT (10) 
#define NUM_DOUBLES (3) 

struct tagArray 
{ 
    double arrayEntry[ NUM_DOUBLES ]; 
}; 

struct tagArray *fillArray(int *n); 

int main(void) 
{ 

    int n = 0; 
    struct tagArray *array; 

    if(NULL == (array = fillArray(&n))) 
    { // then array generation failed 
     exit(EXIT_FAILURE); 
    } 

    // implied else, array generation successful 

    .... 

    free(array); 
    return 0;  
} // end function: main 


struct tagArray *fillArray(int *n) 
{ 
    struct tagArray *array = NULL; 
    int allocated =0; 

    while(1) 
    { 
     /* scanning input, 
     * to acquire 'value1, value2, value3' 
     * with some key input causes execution of 'break;' 
     * */ 

     if(allocated <= *n) 
     { 
      allocated += ALLOCATION_INCREMENT; 
      struct tagArray *temp = realloc (array, sizeof(struct tagArray) * allocated); 

      if(!temp) 
      { // then realloc failed 
       free(array); 
       return(NULL); 
      } 

      array = temp; 
     } 

     array[*n][0] = value1; 
     array[*n][1] = value2; 
     array[*n][2] = value3; 
     (*n)++; 
    } 

    return array; 
} // end function: fillArray