2012-04-30 3 views
2

런타임에 배열 요소를 읽는 프로그램을 작성한 후 일부 구성에 따라 열을 변경합니다. 아래의 코드를 고려포인터 할당에 대한 경고 메시지 2 차원 배열 포인터

pointer.c:73: error: incompatible types in assignment 

, 어떻게이 경고를 제거 할 수 있습니다

나는 GCC의 Cygwin에서 컴파일러에서 다음과 같은 경고 메시지가?

오류를 일으키는 라인은 다음과 같다 당신의 도움

typedef struct INPUT_ST 
{ 
    float a; 
    float b; 
    float c; 
}INPUT; 
const INPUT lookup[3][3]; 
main() 
{ 
    INPUT *ptr; 
    /*typedef INPUT (st[3][3]);*/ 
    INPUT (*ptr1)[3][3]; 
    int i, j; 
    ptr = (INPUT *)&lookup; 
    (*ptr1)[3][3] = &lookup[0][0]; 

    for(i=0; i<3; i++) 
    { 
     for(j=0; j<3; j++) 
     { 
      printf("Row %d and column %d:\n", i, j); 
      printf("%f\n", (*ptr1)[i][j].a); 
      printf("%f\n", (*ptr1)[i][j].b); 
      printf("%f\n\n", (*ptr1)[i][j].c); 
     } 
     printf("\n"); 
    } 
} 
+3

73 행에 무엇이 있는지 먼저 알려 드리겠습니다. – MByD

+0

제공된 예제 코드의 15 번째 줄입니다. –

답변

1

을위한 미리 감사합니다 :

(*ptr1)[3][3] = &lookup[0][0]; 

그 이유는 왼쪽 측면과 오른쪽 - 측면 할당의 형식이 호환되지 않습니다.

ptr1INPUT (*)[3][3] (3x3 배열 INPUT에 대한 포인터)입니다. (*ptr1)[3][3]은 유형이 INPUT이고 (초기화되지 않은) 포인터를 역 참조 한 다음 (범위를 벗어난) 요소 [3][3]에 액세스합니다. 오른쪽의 lookupconst INPUT [3][3] (3x3 배열 const INPUT)입니다. 따라서 &lookup[0][0]const INPUT * (요소의 주소는 [0][0])이어야합니다. 따라서 유형이 서로 충돌합니다 : INPUTconst INPUT *.

실제로하려고하는 것은 ptr1 포인터가 배열 lookup을 가리키는 것입니다. 다음과 같이 그래서 당신은 포인터 선언에 const을 추가 한 다음 초기화해야합니다

const INPUT (*ptr1)[3][3]; 
// ... 
ptr1 = &lookup; 

당신이 정기적 포인터 (단일 차원) 때문에 작동하지 않습니다 ptr와 함께, 그래서 당신이 접근 할 수없는 부분적인 해결책 ptr[i][j], 이는 포인터가 아닌 INPUT을 역 참조하는 것을 의미합니다 (그러나 ptr[i][j] 대신 액세스 ptr[i*3+j] 일 수 있음). 그런데 ptr처럼 const을 캐스팅하는 대신 ptrconst INPUT *ptr;으로 지정해야합니다.