2012-11-03 107 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