2013-05-16 3 views
2

이 코드의 잘못된 점은 무엇입니까?<(> 토큰 전 예상 식별자

#include "stdio.h" 

typedef int type1[10]; 

typedef type1 *type2; 

typedef struct { 
    int field1; 
    type2 field2; 
} type3; 

typedef type3 type4[5]; 

int main() {  
    type4 a; 
    a[0].(*field2[3]) = 99; // Line 16 
    return 0; 
} 

방법 : 을 main.c : 16 : 10 : 오류 : 예상 식별자 전에 <는 (> 토큰

GCC 버전 : GCC (GCC) 4.7.2

+2

첫째, 그것은'#include '이어야한다. 큰 따옴표는 소스 파일과 동일한 디렉토리에있는 헤더 파일을 포함합니다. –

+0

더글러스 B. 스테이플, 설명해 주셔서 감사합니다! –

+1

코드에 어떤 문제가 있습니까? 구문 오류 이외에도 잘못 선택된 이름으로 가득 차 있습니다. 예를 들어, 포인터에 대한 typedef는 보통 나쁜 생각입니다.'type1','type2','type3' 및'type4' 이름은 끔찍합니다. –

답변

0

실제로 책에서 가져온 것이라면 오타입니다. 우리가 malloc을 사용하기 때문에 작업 프로그램이

#include <stdlib.h> 

typedef int type1[10]; 

typedef type1 *type2; 

typedef struct { 
    int field1; 
    type2 field2; 
} type3; 

typedef type3 type4[5]; 

int main(void) { 
    type4 a; 

    a[0].field1 = 99; 
    a[0].field2 = malloc (sizeof(type1)); 
    (*a[0].field2)[3] = 99; 

    return 0; 
} 

<stdlib.h>를 사용하는 것이 int를 할당하는 일부 올바른 표현은

*a[0].field2[3] = 99; 
*(a[0].field2)[3] = 99; 
*(a[0].field2[3]) = 99; 

있습니다.

+0

마지막 코멘트를 쓸 때 대답을 보지 못했습니다. 두 번째 것을 시도했다. 편집은 괜찮습니다. 프로그램이 런타임에 떨어지긴하지만. –

+0

나는이 책의 예제에 잘못된 점이 있다고 생각한다. – Jens

+0

int 배열에 대한 포인터 인 field2가 아무 데나 가리키고 있지 않으므로 프로그램이 충돌합니다. 먼저 메모리를 할당해야합니다. – Jens

6

컴파일러 에러 지시 당신이 뭐가 잘못 정확히 :

expected identifier before <(> token

할 수 있습니다 만 액세스 구조 membe rs (임의의 표현식이 아닌) 식별자 (식별자)를 사용합니다.

+0

이 예제는 "Foundations of Computer Science"책 16, 18 페이지에서 가져 왔습니다. 나는 그것이 옳다고 생각했지만 지금은 혼란 스럽습니다. –

+0

@ user2244092 :이 책의 코드는 C가 아니면 다른 C와 유사한 언어입니까? –

+0

예, 이것은 C입니다. –

1

확인 errata for the book.

p. 18, l. -7 The correct expression is (*a[0].field2)[3] = 99;

Andrew Li 12/31/10

나는이 책이 처음 20 년 전에 발표 된 다스 오류가있는 좋은 또는 나쁜 징조 있는지 확실하지 않습니다 (몇 가지 중요한이!) 마지막 해에 발견 .

이 책은 오래되었지만 Jeff Ullman은 매우 존중받습니다. 나는 수십 년 전에 나의 뇌를 펴고있는 그의 컴파일러 디자인 책을 기억한다 ...