2012-11-03 3 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 FAQ] (http://www.c-faq.com)의 섹션 6을 읽으십시오. –

답변

2

아마 단일 문자 변수 % s의는 scanf를 사용하여 더 이상의 실수

이 될 것입니다. char를 입력하고 싶다면, scanf는 자체적으로 문제가 있기 때문에 % c를 사용하십시오 (getc 나 getchar를 사용하는 것이 더 좋습니다). 또는 문자 배열을 % s에 전달하십시오. 당신은 또한 scanf와 전에 '\ n을'을 (를) 제거

choice<'0' 

에서했던 것처럼하지만 당신은 문자와 문자열을 비교할 수 없습니다. printf \ n에서 버퍼를 비우고 다음 줄로 이동합니다. scanf의 경우, % c 또는 % s가 (종결자를 나타낼 때) 여전히 의미가 있지만 확실히 앞에 추가하지 말고 추가하십시오.

여기에 함수 포인터가 없습니다. 함수를 매개 변수로 전달하는 데 사용됩니다.이라는 참조로 전달 된 배열 을 전달하는 것일뿐입니다. 주에서 배열을 전달 그래서 단순히 함수 정의 파라미터

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

를 사용하며

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

같은 배열로 X를 치료 간단히 통과한다 배열 이름은 'A'를 전달 참조 자체. 배열의 전달 주소는 의미가 없습니다.

+0

ok ... 고맙습니다 ... 제 컴파일러가 제게 그 라인에서 어떤 오류나 경고를 보내지 않았기 때문에 그것이 잘못되었다는 것을 알지 못했습니다. 하지만 내 문제는 readM 및 writeM 함수에서 발생했습니다. – user1797060

+1

나는 그들도 문제를 지적했다.대답을 다시로드하십시오. 또한 오류나 경고가 실수로 인한 것의 유일한 수단으로 취급하는 것은 자유를 많이 허용하기 때문에 언어와 같이 매우 위험합니다. 실제로 무엇을하는지 이해하지 못하면 코드 줄을 쓰지 마십시오 – fayyazkl

+0

고맙습니다 ... 나는 그것이 내가 undscandand 내 선생님이 말하는 것을 문제가 아니라고 생각합니다. 그녀는 저에게 함수에서 포인터를 사용하라고 요청합니다 ... 그리고 그것은 제가 관리 할 수없는 부분입니다 ... 저는 또한 일부 합계를 반환하고 행렬에 다른 수정을하는 몇 가지 더 많은 함수를 만들어야합니다. ? – user1797060

2

또 다른 문제는 배열을 읽을 때 포인터 (* x) 다음에 배열 offset [i] [j]를 추가하는 것입니다. 이렇게하면 메모리가없는 위치로 이동하게됩니다 심지어에 액세스 할 수 있습니다. 전달하려는 것은 포인터의 배열이므로 번호 위치 (x [i] [j])를보고 포인터를 따라갑니다.

편집 : 이전 사용자가 내가 여기에 준 두 번째 조언을 반영하여 답변을 업데이트 했으므로 삭제했습니다.

+0

그래, 나는 당신의 대답을 보았다. 나는 그의 코드와 나의 대답을 편집하고 있었다. 네가 먼저 언급 한 이후로 투표에 투표했다. – fayyazkl