참고자료

아두이노, 오렌지보드 등의 오픈소스하드웨어를 사용하는데 필요한 것들을 알아봅니다.

컴파일 에러메시지 해결

2014-10-28 15:39:26

개요

컴파일의 사전적 정의는 다음과 같다.
 

고급언어(CHILL, COBOL, FORTRAN 등으로 인간이 구분하기 쉬운 언어)로 작성된 프로그램을
기계어(컴퓨터 등의 기계가 이해할 수 있는 언어)로 번역하는 것

즉 우리가 프로그래밍을 하기 위해 작성하는 코드는 컴퓨터가 보고 듣고 이해할 수 있는 언어가 아니다. 우리가 작성할 때 쓰는 코드는 사람이 프로그래밍하기 쉽게 인위적으로 만들어진 고급언어이다.(반대로 말하면 컴퓨터가 이해하는 기계어쪽으로 갈수록 낮은 수준의 언어라 칭한다.) 우리가 작성한 프로그래밍 코드를 컴퓨터가 이해하고 그대로 실행할 수 있게 언어를 바꿔주는 것을 컴파일이라 한다.
더 쉽게 설명하면 한글을 프로그래밍 언어라고 하고 영어를 컴퓨터가 알아들을 수 있는 언어라 할때 한글을 영어로 번역하는 일을 컴파일이라 말할 수 있다.
 

 

기계어는 위 사진과 같이 우리가 이해할 수 없는 0과 1로 가득하다. 
컴퓨터에서 이루어지는 모든 프로그램, 3D그래픽, 게임, 글자 등 모든 것들은 컴퓨터가 이해할 수 있는 유일한 두가지 숫자 0과 1로 표현된다.
영화 매트릭스를 보게 되면 A.I(인공지능)에 의해 매트릭스라는 프로그램안에서 생성된 가상 현실을 0과 1로 가득한 위 사진과 같은 끝없는 숫자들로 표현한다.


우리가 컴파일을 실행할 때 완벽하게 코드를 작성했다면 문제가 없겠지만 사람이기 때문에 중간에 글자를 빼먹거나 철자를 틀리거나 알고리즘이 틀릴 확률이 매우 높다. 이렇게 코드에 오류가 있을 경우 컴퓨터는 작성된 코드를 제대로 실행할 수 없기 때문에 우리에게 코드에 오류가 있다고 알려주게 된다.
코드길이가 100줄 200줄 이럴 때는 쉽게 어디가 찾을 수 있지만 만약 코드 길이가 1~2만줄 이렇게 방대하다면 정말 백사장에서 머리카락을 찾는 기분이 든다.




다행히도 코드에 오류가 있다고 알려줄 때 어느 부분에서 오류가 있을지 컴퓨터가 예상해서 알려주기 때문에(예상이지만 맞을 확률이 상당히 높다.) 프로그래밍하는 사람 입장에서는 에러메시지를 보고 쉽게 어디가 틀렸는지 고칠 수 있다.(이런 프로그래밍을 하면서 에러가 있는 곳을 찾아 잘못된 점을 고치는 것을 디버깅이라 한다. 디버깅 작업은 상당한 난이도를 필요로 한다.)

이번 장에서는 스케치에서 많이 볼 수 있는 간단한 컴파일 에러를 알아보고 해결 방법을 알아보자.

 

 

컴파일 에러

 

1. 변수의 타입을 적지 않았을 때



변수를 선언할 때 변수 앞에 어떤 타입인지 적지 않았을 경우 볼 수 있는 메시지이다. 
위 사진과 같은 경우에는 led = 8;이라고 선언했지만 led라는 변수가 어떤 종류인지 컴퓨터에게 알려주지 않았다.
8은 숫자(정수)이기 때문에 숫자를 가질 수 있는 변수를 선언할 때 쓰는 int나 float, double, char 정도를 led앞에 적어주어야 한다.
위 소스는 숫자 8은 핀번호를 나타내기 때문에 int가 적당하다.
해결 방법 : led = 8;을 int led = 8;로 변경

 

 

2. 변수에 어울리지 않는 값을 입력했을 때



이번에는 변수는 제대로 선언했으나 입력된 값이 변수랑 어울리지 않을 때, 혹은 입력된 값은 정상이지만 변수의 선언이 어울리지 않을 때 생기는 오류이다.

 

 

'오류가 있는 값' was not declared in this scope

위와 같은 오류는 상당히 자주 볼 수 있다. 변수와 입력하는 값이 틀릴 경우는 자주 겪기 때문에 위와 같은 문구를 본다면 오류메시지에서 알려주는 값을 살펴보는것이 좋다.
여기서는 int led = a; 이 부분에서  'a'가 제대로 선언이 되지 않았다고 오류메시지가 떴다. 이럴 때는 변수의 타입을 바꿔 주거나 a를 변수에 맞는 값으로 바꿔 주면 된다.
해결 방법 : int를 char로 바꾸거나 'a'를 숫자로 변경한다.
 

3. 괄호의 짝이 서로 맞지 않을 경우


3-1 여는 괄호가 부족 할 경우

pinMode(led, OUTPUT);전에 여는 괄호를 없애서 생기는 오류이다. 



첫번째 for문 다음에 여는 괄호를 없애서 생기는 오류이다. 두번째 for문이 적당하지 않다고 오류 메시지를 내보낸다.



두번째 for문의 여는 괄호를 없애서 생기는 오류이다. 

세가지 모두 원인은 여는 괄호가 없기 때문에 오류가 생겼지만 메시지는 각각 다르다. 
하지만 밑의 창을 보면 공통 적인 메시지가 있다.

expected declaration before '}' token

'}' 괄호전에 무언가를 기대하는 메시지를 보낸다. 이 메시지가 떴다면 괄호가 맞는지 확인해 볼 필요가 있다.


3-2 닫는 괄호가 부족 할 경우

void setup()함수를 열고 닫는 괄호를 없애서 생기는 오류이다.



void loop()를 열고 닫는 괄호를 없애서 생기는 오류이다.

닫는 괄호도 마찬가지로 공통메시지가 존재한다.

error: expected '}' at end of input

'}'닫는 괄호를 기대하는 메시지를 보낸다. 이 메시지가 보인다면 닫는 괄호의 개수가 맞는지 확인해 볼 필요가 있다.
 

4. 세미콜론을 빼먹었을 경우


가장 많이 경험할 오류메시지가 아닐까 싶다. 프로그래밍에서는 한 줄이 끝났다는 표시를 ;(세미콜론)으로 표시하는데 이 세미콜론을 빼먹었을 때 생기는 오류이다.
메시지에서는 친절하게 어느 부분에서 놓쳤을 지 예상해서 알려준다.
해결 방법 : 세미콜론을 작성한다.
 

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

컴파일 에러, 기타

임성도 2016-09-18 11:33:24

좋은 정보 정말 감사합니다.

answnsgur 2019-01-20 21:19:58


이 명령어를 입력했는데
#include

int sensorPin = 0;// 사운드 센서를 0번핀에 연결합니다.

void setup() {
Serial.begin(9600); //시리얼 통신을 시작합니다.
Keyboard.begin();
}
void loop() {
int value = analogRead(sensorPin); // 사운드 센서로부터 센서값을 읽어 들입니다.

if(value > 0)
{
Keyboard.write(102);
Keyboard.write(100);
//f = 102
//d = 100
//q = 113
//즐겁게 친구 괴롭히세요
}

delay(10);//10ms 동안 대기
Serial.println(value);//센서값을 시리얼 모니터로 출력하여 현재 센서값을 보여줍니다.
delay(100);//100ms 동안 대기
}
이런에러가나요
In file included from C:\Users\minec\Documents\Arduino\sketch_jan20a\sketch_jan20a.ino:1:0:

C:\Program Files (x86)\Arduino\libraries\Keyboard\src/Keyboard.h:29:2: warning: #warning "Using legacy HID core (non pluggable)" [-Wcpp]

#warning "Using legacy HID core (non pluggable)"

^

sketch_jan20a:24: error: stray '\357' in program

}癤?

^

sketch_jan20a:24: error: stray '\273' in program

sketch_jan20a:24: error: stray '\277' in program

C:\Users\minec\Documents\Arduino\sketch_jan20a\sketch_jan20a.ino: In function 'void setup()':

sketch_jan20a:7: error: 'Keyboard' 가 없습니다. 스케치에서 '#include ' 를 포함했나요?
Keyboard.begin();

^

C:\Users\minec\Documents\Arduino\sketch_jan20a\sketch_jan20a.ino: In function 'void loop()':

sketch_jan20a:14: error: 'Keyboard' 가 없습니다. 스케치에서 '#include ' 를 포함했나요?
Keyboard.write(100);

^

exit status 1
stray '\357' in program

kocoafab 2019-02-08 09:55:23

@answnsgur
맨 윗줄 #include 뒤에 < Keyboard.h > 를 추가하신 후 다시 업로드 해보세요