2016-02-01 29 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