TURBO C++ 으로 컴파일을 하니 에러가 생깁니다.
글쓴이: goldrain1993 / 작성시간: 금, 2016/07/08 - 1:27오전
안녕하세요. 프로그래밍을 공부하는 학생입니다.
비주얼스튜디오 2013으로 공부하다가 터보C++를 써봤습니다.
같은 코드인데 비주얼스튜디오에서는 돌아가는게 터보C++에서 안돌아가서 질문드립니다.
다른 에러들은 다 처리했는데, 이 에러가 도저히 왜 생기는지 모르겠습니다.
line 10에 보시면 struct Signal로 구조체태그를 정의했는데요,
이게 에러가 뜨면서 에러메세지로 ", expected" 가 뜹니다.
확장자는 C++이 아닌 C로 했고 TURBO C++은 3.2.2.0 버전입니다.
여러방면으로 검색을 해봤는데 도저히 모르겠어서 질문글 올립니다. ㅠㅠ..
선배님들의 가르침에 미리 감사드립니다.
아래는 문제의 코드이고, 콘솔화면에 영화 매트릭스의 글자들이 주루룩 내려가는 장면을 숫자로 흉내낸 코드입니다.
내용은 사실 문제가 아니고, 도대체 비주얼스튜디오2013에서는 잘 돌아가는게 왜 터보c++에서는 line 10에서 에러가 나는지 모르겠습니다.
에러메세지 화면도 첨부하겠습니다.
#include <Turboc.h> #define MAX 1024 #define LEFT 75 #define RIGHT 77 #define UP 72 #define DOWN 80 #define ESC 27 struct Signal { BOOL exist; //신호의 존재 여부 char ch; //출력할 문자 int x, y; //현재좌표 int distance; //이동할 거리 int nFrame; //속도 int nStay; //속도에 대한 카운트 }; Signal S[MAX]; void main() { int i; int ch; int freq = 15; int frame = 200; clrscr(); gotoxy(0, 23); printf("매트릭스 흉내내기. 상하:속도 증감, 좌우:빈도 증감, ESC:종료"); randomize(); for (;;){ gotoxy(60, 23); printf("속도:%d, 빈도:%d ", frame, freq); //키 입력 처리 //_kbhit() 함수 : 입력이 있으면 1을 리턴, 없으면 0을 리턴 //getch()함수를 이용하여 방향키를 입력받으면 라는 값이 나오는데, // 이 값은 아스키코드값이지만 아스키코드표에는 나오지 않는다. //그 이유는 일반 아스키코드값은 1byte인 반면 확장키(방향키,펑션키) //는 2byte이기 때문이다. //getch()함수는 1byte만 받을 수 있기 때문에 방향키를 입력받을 때에는 //한번 더 호출해 주어야 한다. if (_kbhit()){ ch = _getch(); if (ch == 0xE0){ ch = _getch(); switch (ch){ case UP: frame = min(frame + 10, 1000); break; case DOWN: frame = max(frame - 10, 10); break; case RIGHT: freq = max(freq - 1, 1); break; case LEFT: freq = min(freq + 1, 30); break; } } else{ if (ch == ESC){ return; } } } //새로운 신호 생성 if (random(freq) == 0){ for (i = 0; i < MAX; i++){ if (S[i].exist == FALSE){ S[i].exist = TRUE; S[i].ch = random('Z' - 'A' + 1) + 'A'; S[i].x = random(80); S[i].y = 0; S[i].distance = random(14) + 9; S[i].nFrame = S[i].nStay = random(15) + 5; break; } } } //주기가 다 된 신호 이동 및 제거 처리 for (i = 0; i < MAX; i++){ if (S[i].exist == FALSE) continue; if (--S[i].nStay == 0){ S[i].nStay = S[i].nFrame; gotoxy(S[i].x, S[i].y); _putch(' '); if (++S[i].y < S[i].distance){ gotoxy(S[i].x, S[i].y); _putch(S[i].ch); } else{ S[i].exist = FALSE; } } } delay(1000 / frame); } }
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 96.16 KB |
Forums:
struct
Signal S[MAX];를 struct Signal S[MAX];로 고치면 될 겁니다. C 언어에서는 구조체 형의 변수를 선언할 때, (
typedef
를 사용하여 해당 구조체 형의 별칭을 만들지 않은 이상)struct
키워드를 반드시 적어주어야 합니다. 아니면, 파일 확장자를CPP
로 변경하여 C++ 소스 코드로 인식하게 할 수도 있을 듯합니다.다만, 터보 C++는 90년대 초반에 제작되었습니다. 그 당시는 C++ 표준이 정해지지 않았던 시절입니다. 따라서, C 언어를 오래된 C89 표준을 중심으로 공부해야 하는 특수한 상황이 아니라면(십중팔구 아닐 겁니다), 터보 C++는 학습용으로 적절하지 않아 보입니다.
늦은 밤에 답변감사합니다. 말씀해주신 방법으로는 이미
늦은 밤에 답변감사합니다.
말씀해주신 방법으로는 이미 시도해보았지만 역시 안되었고 확장자를 CPP로 변경해도 문제는 여전하였습니다.
비주얼스튜디오를 사용하여 공부하고 있는데,
터보c++은 학습 중 따로 컴파일을 통해 확인해보고 싶은 내용이 있을때 옆에 창을 띄워서 따로 컴파일 하려는 용도로 설치하였습니다.
그러나 16비트컴파일러인데다가 생각처럼 호환이 쉽게 되지않아 그냥 비주얼스튜디오를 계속 써야할 것 같습니다.
그러나 의문증은 해결하고싶네요..ㅜㅜ
그러면, 보여주신 코드가 아니라 Turboc.h나
그러면, 보여주신 코드가 아니라 Turboc.h나 다시 그 곳에서 인클루드한 헤더에 (문법?) 오류가 있는 게 아닐까 추측해 봅니다. GitHub Gist 같은 곳에 전체 코드를 올려주시는 게 좋지 않을까 합니다. 그리고, 이미 시도해 본 방법이 있다면, 그 가능성을 배제하고 생각해볼 수 있도록 미리 알려주시면 좋겠습니다.
예 충고 잘 새겨듣겠습니다. 이렇게 저렇게 만지다가
예 충고 잘 새겨듣겠습니다.
이렇게 저렇게 만지다가 밑에 댓글에 답변을 주신 '예전 컴파일러에는 BOOL 이란 타입이 없다'에서 해답을 찾았습니다.
그런데 그리고 나서도 구조체 선언문에서 에러가 떠서
지적하신 구조체 선언부분앞에 다시 struct를 붙여서 컴파일하니 성공하였습니다.
결론적으로 문제는 컴파일러가 지원하는 타입과 C컴파일러와 C++컴파일러의 차이에 대해 잘 몰라서 일어났다는 것을 알게 되었습니다.
그리고 질문하는 요령도 이번 기회에 더 잘 생각해보겠습니다.
댓글 정말 감사드립니다.!
프로그래밍을 공부하신다면 오래된 버전의 도구는
프로그래밍을 공부하신다면 오래된 버전의 도구는 깔끔하게 잊으셔도 됩니다. 아니 첫 단추를 오래된 도구
이번 경험을 계기로 깔끔하게 잊겠습니다..!!
이번 경험을 계기로 깔끔하게 잊겠습니다..!!
BOOL 이 문제 입니다.
#define BOOL int
를 추가하시거나
BOOL 을 int로 바꾸십시오
이전의 컴파이러에는 BOOL 이란 정의가 없습니다.
감사합니다. 문제를 해결했습니다! 이전의 컴파일러에
감사합니다. 문제를 해결했습니다!
이전의 컴파일러에 BOOL이라는 정의가 없다는 것이 문제의 핵심이었습니다.. 절대 안까먹겠습니다.
댓글 달기