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