Transcript PPT

오류메시지 101
강윤섭
2008년 4월 4일
목차
오류 메시지 해석하기
오류 유형 – 문법 틀림
오류 유형 – 정의되지 않은 값
오류 유형 – 타입 틀림
– 사칙연산 실수
– 함수 적용 실수
– If-then-else 문 오류
• 오류 유형 – 인자 개수 초과
•
•
•
•
2
전형적인 오류 메시지의 예
3
오류 메시지 해석하기
31
14 16
int
float
31
let x = 3. *. 25 +. 1.;;
14 16
4
오류 메시지 해석하기
편집기 화면 아래쪽에 행/열이 표시됨.
5
오류 메시지 해석하기
31
14 16
int
float
31
let x = 3. *. 25 +. 1.;;
14 16
6
오류 메시지 해석하기
31
14 16
int
float
31
let x = 3. *. 25 +. 1.;;
14 16
7
목차
오류 메시지 해석하기
오류 유형 – 문법 틀림
오류 유형 – 정의되지 않은 값
오류 유형 – 타입 틀림
– 사칙연산 실수
– 함수 적용 실수
– If-then-else 문 오류
• 오류 유형 – 인자 개수 초과
•
•
•
•
8
문법 틀림
• 오류 메시지:
Syntax error:
• 여러가지 원인이 있을 수 있음.
– 단순한 오타
– 괄호 개수 안 맞음.
• let x f(f(f(f(f 2)));
9
목차
오류 메시지 해석하기
오류 유형 – 문법 틀림
오류 유형 – 정의되지 않은 값
오류 유형 – 타입 틀림
– 사칙연산 실수
– 함수 적용 실수
– If-then-else 문 오류
• 오류 유형 – 인자 개수 초과
•
•
•
•
10
정의되지 않은 값
• 오류 메시지:
unbound value X
(X 대신 실제로 정의되지 않은 값 이름이 나타남)
• 뜻
– X라는 이름의 변수가 정의되지 않은 상태에서 X라는
이름을 연산식에 사용했음.
11
정의되지 않은 값 - 원인
• 변수 이름에 오타
– let maxvalue = 1;;
let x = maxval -1;;
• 문자열을 “”로 묶지 않음.
– print_string (Hello^“world”);;
• 자기호출 함수를 정의할 때 rec를 빼먹음.
– let sum x = if x <= 0 then 0 else sum (x-1);;
• 지역변수 정의에서 in을 빼먹음.
– let rec dec2bin x =
let g z = if z mod 2 = 0 then "0" else "1"
if x < 2 then g x else g x ^ (dec2bin (x/2));;
12
목차
오류 메시지 해석하기
오류 유형 – 문법 틀림
오류 유형 – 정의되지 않은 값
오류 유형 – 타입 틀림
– 사칙연산 실수
– 함수 적용 실수
– If-then-else 문 오류
• 오류 유형 – 인자 개수 초과
•
•
•
•
13
타입 틀림.
• 오류 메시지:
This expression has type X
but is here used with type Y.
(X, Y 대신에 타입 이름이 들어감)
• 뜻
– 오류가 난 부분만을 보면, 타입이 X이나, 오류가 난 부분에
들어갈 연산식은 타입이 Y여야 함.
14
타입 틀림 - 원인
• 타입 틀림은 대단히 많은 경우에서 발생한다.
– 사칙연산 식의 오타
– 함수 적용 실수
– If – then – else 문에서의 오류
– 패턴 검사 실패
15
타입 틀림 – 사칙연산 실수
• 연산자는 맞았는데 숫자를 잘못 넣은 경우.
– 3.14 *. 9
• 값은 알맞게 넣었는데, 연산자가 틀린 경우.
연산자는 맞았는데 숫자를 잘못 넣은 경우.
– 3.14 * 9.
– 연산자가 틀렸어도 숫자가 틀렸다는 오류
메시지가 나옴.
16
타입 틀림 – 함수 적용 실수
• 함수에 틀린 타입의 인자를 넣음.
– let half x = x *. 0.5;;
half 32
• 괄호를 빼먹음.
– sum -1;;
17
타입 틀림 – if-then-else 문 오류
• If와 then 사이의 연산식의 타입이 불린이 아님.
– If x+1 then 1 else 0;;
• else 이전과 이후의 연산식들의 타입이 다름.
– if x mod 2 = 0 then 1 else true;;
– 어느 쪽이 틀렸더라도, Ocaml은 else 이후의 문장이
틀렸다고 보고한다.
• else 이후를 빼먹음.
– let sum x= if x > 0 then sum (x-1);;
– else 이후를 적지 않았을 경우에는 then 이후 부분이 unit
type이어야 한다고 오류 메시지가 나온다.
18
타입 틀림 – 패턴 검사 실패
• 등호 왼쪽과 오른쪽이 모양이 맞지 않는 경우.
– let (x,y,z) = (1,(2,3));;
– let (x,y) = (1,2,3);;
• 어느 쪽이 틀렸든 Ocaml은 등호 오른쪽에 오류가
있다고 한다
19
목차
오류 메시지 해석하기
오류 유형 – 문법 틀림
오류 유형 – 정의되지 않은 값
오류 유형 – 타입 틀림
– 사칙연산 실수
– 함수 적용 실수
– If-then-else 문 오류
• 오류 유형 – 인자 개수 초과
•
•
•
•
20
인자 개수 초과
• 오류 메시지:
This function is applied to too
many arguments.
• 뜻
– 함수가 받는 인자 개수보다 더 많은 인자가 주어짐.
• 원인
– 함수의 타입을 착각함.
– 함수에 다른 함수의 결과를 인자로 줄 때 괄호를 빼먹음.
• 예시
– let f x y = x + y;; f 1 f 2 3;;
21
기타 사항
•
오류 메시지가 출력되지 않고 컴파일이 제대로
되어도 프로그램이 의도대로 작동하지 않을 수 있음.
– log2 1/2 는 log2 (1/2)가 아니고, (log2 1)/2 와
같다.
22
실습
•
아래 주소에서 오류가 있는 소스 코드를 내려 받을
수 있음.
–
–
•
http://www/~gla/cs101/slide/error.ml
혹은 과목 홈페이지-강의계획에서 다운로드.
error.ml이 성공적으로 컴파일되면 성공.
23
컴파일 복습
1. 명령 프롬프트 창을 띄운다.
–
시작->실행->cmd
2. cd [소스 파일이 있는 폴더 위치]
–
예: cd "C:\documents and settings\user103\바탕 화면"
3. ocamlc -o [만들 파일 이름] [소스 파일 이름]
–
예: ocamlc –o hw3.exe hw3.ml
4. 만든 프로그램을 실행시켜 본다.
–
예: hw3.exe
24