2012-11-03 108 views
3

我真的是C編程語言的初學者,我已經開始學習指針了......我在操縱它們時遇到了一些問題。 我想要做的是用2個函數讀寫一個矩陣,而不使用全局變量(只是指針)......所以我沒有成功完成這個任務。我已經搜索了很多關於指針的信息,並試圖瞭解如何使用它們,但是我無法讀取和寫入矩陣我做錯了什麼...請請幫助我(即使有些有用的鏈接關於2DArray &指針)...謝謝!C:指針和函數2DArray

#include <stdio.h> 
#include <stdlib.h> 

void readM(int (*x)[100][100], int *row, int *column) 
{ 
int i,j; 
printf("Row no: "); 
scanf("%d",row); 
printf("Column no: "); 
scanf("%d",column); 
printf("Matrix elemnts: \n");  
for(i=0;i<(*row);i++) 
{ 
    for(j=0;j<(*column);j++) 
    { 
     printf("[%d][%d]=",i,j); 
     scanf("%d",x[i][j]); 
    } 
} 
} 

void writeM(int (*x)[][100], int *row, int *column) 
{ 
int i,j; 
printf("\nMatrix is: \n"); 
for(i=0;i<(*row);i++){ 
    for (j=0;j<(*column);j++){ 
    printf("%d",(*x)[i][j]); 
    } 
    printf("\n"); 
    } 
} 

int main() 
{ 

char choice; 
int a[100][100],m,n; 
do 
{ 
    printf("\nChose an option\n\n" 
     "1) read matrix \n" 
     "2) write matrix\n" 
     "3) display matrix in spiral\n" 
     "4) return max and min\n" 
     ///...etc 
    scanf("%c", &choice); 
    while (choice<'0'|| choice>'4') 
     { 
      printf("\nInvalid option! Chose again! \n\n"); 
      scanf("%c",&choice); 
     } 
    switch (choice) 
    { 
     case '0': exit(0); 
     case '1': readM(&a,&m,&n); break; 
     case '2': writeM(&a,&m,&n);break; /// ... etc 
} while (choice !=5); 
getch(); 
} 
+2

有很多混亂的代碼,它甚至不編譯,有大括號不匹配。另外,你已經使用了只有你明白的語言(對不起)。如果它不是英文,請將其從您的代碼中移除並粘貼到有問題的部分。 – fayyazkl

+0

是的,這不是英文...對不起... – user1797060

+1

閱讀[comp.lang.c常見問題](http://www.c-faq.com)的第6部分。 –

回答

2

有可能會超過一個錯誤

使用與%s的scanf單個字符變量。如果你想輸入一個字符,使用%c(更好,使用getc或getchar),因爲scanf有它自己的問題。或者將一個char數組傳遞給%s。但你不能串用字符就像你在

choice<'0' 

沒有同時刪除之前的scanf的「\ n」進行比較。在printf \ n刷新緩衝區並移至下一行。在scanf的情況下,在%c或%s之後添加它仍然有意義(因爲您指明瞭終結符),但肯定不會在它之前。

這裏沒有函數指針。它們用於傳遞函數作爲參數。你只是傳遞一個數組,默認通過引用傳遞。所以,簡單地在函數定義參數使用

int x[100][100] or int x[][100] 

和把X作爲像

x[a][b] rather than *x[a][b] 

另外的陣列從主傳遞數組時簡單地傳遞「一個」,這是受通過陣列的名稱參考本身。傳遞數組的地址是沒有意義的。

+0

好的......謝謝......我的編譯器不會在該行發回任何錯誤或警告,所以我沒有看到這是錯誤的。但我的問題是readM和writeM函數。 – user1797060

+1

我也指出了他們的問題。重新加載答案。將錯誤或警告視爲某種錯誤的唯一手段對於c語言來說非常危險,因爲它允許自由做很多事情。不要寫一行代碼,除非你明白它的真實含義 – fayyazkl

+0

謝謝......我認爲問題在於我不會忽視老師的話。她要求我在該函數中使用指針....並且這是我無法管理的部分...我還必須製作一些更多的函數,它們會返回一些金額並對我的矩陣進行其他修改......它將起作用? – user1797060

2

另一個問題是,當你讀數組時,首先跟着指針(* x),然後添加數組offset [i] [j]:這可能會讓你到某個內存位置甚至無法訪問。由於你所傳遞的是指針的數組,你首先會看數字位置(x [i] [j]),然後按照指針。

編輯:以前的用戶更新了他的答案,以反映我給我的第二個建議,所以我刪除了它。

+0

是的,我後來看到了你的答案。我一直在編輯他的代碼和我的答案。自從你首先提到它以來,就進行了投票。 – fayyazkl