2013-04-24 69 views
0

我是C的新手,但幾個星期前我在pascal編程。在帕斯卡中,如果您想更改陣列數據,則通過引用來輸入var myArray。我無法弄清楚如何在C中做到這一點。我已經閱讀了很多問題,但似乎沒有任何工作。這是迄今爲止我所擁有的。改變陣列數據的功能 - 數據不變。 C

void set_up_elements(char (*array_to_populate)[20]) 
{ 
    char* buffer; 
    FILE *f; 
    f=fopen("elementList.txt","r"); 
    char copied_text[118][20]; 
    int i=0; 
    while (!feof(f)) 
    { 
     fgets(copied_text[i],80,f); 
     ++i; 
    } 
    //Close the file to free up memory and prevent leaks 
    fclose(f); 
    f = NULL; 
} 

這裏是我的代碼來填充該數組,我到陣列copied_text讀取元素週期表中的元素的列表。這部分工作,它成功地填充INSIDE函數的數組。

int main() 
{ 
    char element_array[118][20]; 
    set_up_elements(element_array); 
<..> 
} 

這就是我試圖稱呼它。數組element_array的內容不變。有誰知道如何解決這一問題?謝謝。

+3

set_up_elements(element_array); – 2013-04-24 16:10:34

+1

另外我認爲copied_text應該是[118] [80],因爲你想複製80個字符,而不是20個字符。 – David 2013-04-24 16:11:50

+0

可能相關:http://stackoverflow.com/questions/9446707/correct-way-of-passing-2-dimensional-array-into-a-function – Arun 2013-04-24 16:16:27

回答

1

應用左右讀取規則來理解問題。 ...

char element_array[118][20]意味着element_array是由120個字符的118個塊組成的數組。

另一方面,在char (*array_to_populate)[20] array_to_populate是一個指向由20個字符組成的數組的指針。

您可以使用char (&array_to_populate)[118][20]這意味着array_to_populate是對120個字符的118個塊的引用。

這就是說,最大的問題是在你的函數中,你正在讀入一個臨時數組,你永遠不會複製到傳入的數組中。另外,您的文件讀取大小錯誤。以下應把工作做好......

#define DIM1 118 
#define DIM2 20 

void set_up_elements(char (&array_to_populate)[DIM1][DIM2]) 
{ 
    int i=0; 
    FILE *f=fopen("elementList.txt","r"); 

    for (i = 0; f && !feof(f) && i < DIM1; i++) 
    { 
     fgets(array_to_populate[i],sizeof(array_to_populate[0]),f); 
    } 

    //Close the file to free up memory and prevent leaks 
    fclose(f); 
} 
+0

啊,這部分'fgets(array_to_populate'我完全忽略了......我不敢相信,我翻遍了我的代碼50次,並沒有意識到我沒有參考這個參數......我感覺(char(* array_to_populate)[20])'和'(char(&array_to_populate)[DIM1] [DIM2])'',然後它們都可以工作,我知道*是一個指針的符號,但究竟是什麼&?它本質上被用作'傳遞引用'符號(如pascals'var arrayToPopulate'? – Anteara 2013-04-24 16:32:54

+1

正確... '&'意思是按引用傳遞,你把它看作是原始變量而不是指向它的指針,它還允許你定義原型中數組的所有維度,這樣你就不能通過 – 2013-04-24 16:50:22

+0

好的,謝謝你的幫助。 – Anteara 2013-04-24 16:55:37

3

1)下面的行是錯誤

fgets(copied_text[i],80,f); 

一個元件串的串的陣列中的尺寸是20。你把作爲最大chrachter在fgets()函數讀取80

所以將其更改爲:

fgets(copied_text[i],sizeof(copied_text[0]),f); 

2),你可以更改此代碼:

while (!feof(f)) 
    { 
     fgets(copied_text[i],80,f); 
     ++i; 
    } 

while (i<118 && fgets(copied_text[i++],80,f)); 

3)你的功能的輸入參數

void set_up_elements(char (*array_to_populate)[20]) 

未在您的功能中使用。看起來你想填寫你的函數,但事實並非如此,你正在使用調用者看不到的另一個數組(本地數組)

+0

謝謝,我的原始文章中有一些錯誤,將fgets第一個參數從'copied_text'改爲'array_to_populate'修復了它。謝謝。 – Anteara 2013-04-24 16:44:07

1
void set_up_elements(char (*array_to_populate)[20]) 
{ 
    char* buffer;//unuse var 
    FILE *f; 
    f=fopen("elementList.txt","r"); 
    int i=0; 
    while (!feof(f))//caution 
    { 
     fgets(&(*array_to_populate[i]),20,f); 
     ++i; 
    } 
    //Close the file to free up memory and prevent leaks 
    fclose(f); 
    f = NULL; 
} 
+0

沒有投票並刪除我的評論,因爲不適用。 – 2013-04-24 16:31:46

+0

謝謝你禮貌。 – BLUEPIXY 2013-04-24 16:33:26

+0

我原來的帖子是壞的代碼,現在是凌晨2:30,我忽略了一個重要的部分,那就是我將錯誤的變量傳遞給fgets,因此爲什麼數據在函數之外沒有改變。 但是,我確實刪除了未使用的緩衝區變量,並且在閱讀您的'//警告'註釋時......是因爲在閱讀最後一行時EOF不會被設置,即使您在最後一行,導致最後一行被讀取兩次? – Anteara 2013-04-24 16:42:03