Lớp 07DB_A/B

Hướng dẫn thực hành: Nhập môn lập trình

Người soạn: Nguyễn Hải Minh

Email: nhminh@fit.hcmuns.edu.vn

CHỦ ĐỀ: CÁC LỖI THƯỜNG GẶP KHI BIÊN DỊCH

CHƯƠNG TRÌNH TRÊN VC++ 6.0

---oOo---

I. GIỚI THIỆU

Khi biên dịch chương trình (F7), chú ý cửa sổ Build ở dưới, các thông tin về lỗi (errors) và

cảnh báo (warnings) nếu có sẽ được liệt kê chi tiết ở đây:

Ví dụ trong hình: dòng màu vàng là lỗi, màu xanh là cảnh báo. Con số phía trước mỗi

lỗi/cảnh báo cho biết số thứ tự dòng code xuất hiện lỗi/cảnh báo (ở đây là dòng thứ 9). Dựa

vào những ký hiệu cũng như thông tin về lỗi/cảnh báo này, bạn có thể tìm ra nhanh chóng lỗi

của mình nằm ở đâu và cách sửa như thế nào.

Các bước cần làm khi biên dịch chương trình có lỗi:

1) Xem có bao nhiêu lỗi, bấm F4 để nhảy đến dòng chứa lỗi đầu tiên

2) Đọc xem thông báo lỗi là gì, sửa lỗi đó

Trang 1

3) Biên dịch lại project (F7) rồi quay lại bước 1

Lớp 07DB_A/B

Hướng dẫn thực hành: Nhập môn lập trình

II. MỘT SỐ LỖI THƯỜNG GẶP

C2143: Syntax error : missing before

(cid:170) Lỗi cú pháp (syntax error), thường là thiếu dấu đóng ngoặc, chấm phẩy

Ví dụ: (9) missing ‘;’ before ‘return’ => Thiếu dấu ‘;’ trước câu lệnh return ở dòng 9. Rà soát

lại trước dòng 9, phát hiện thiếu dấu ‘;’ sau câu lệnh printf(“Hello World!”)

C1010: unexpected end of file while looking for precompiled header directive

(cid:170) Lỗi này xuất hiện khi bạn không tạo Empty project mà tạo một project có sẵn (Hello World)

với 2 file được tạo sẵn là StdAfx.h và StdAfx.cpp. Với loại project này, bạn phải #include

StdAfx.h ngay đầu file .cpp chứa hàm main của bạn. Nếu không trình biên dịch sẽ báo lỗi như

trên. Cách giải quyết:

(cid:190) Cách 1: Thêm dòng #include “StdAfx.h” vào ngay đầu file .cpp chứa code chương

Trang 2

trình của bạn

Lớp 07DB_A/B

Hướng dẫn thực hành: Nhập môn lập trình

(cid:190) Cách 2: Vào Project (cid:198) Settings (cid:198) chuyển sang tab C/C++, chọn Precompiled

Headers trong Category, check vào ô Not Using Precompile Header

C2001: newline in constant

(cid:170) Lỗi này thường gặp khi một chuỗi hay ký tự khai báo mà quên đóng ngoặc kép ’ hay ”

Trang 3

(cid:170) Ví dụ: chuỗi đưa vào lệnh printf (dòng thứ 8) thiếu dấu đóng ngoặc kép ”

Lớp 07DB_A/B

Hướng dẫn thực hành: Nhập môn lập trình

C2065: '' : undeclared identifier

(cid:170) Lỗi này là do bạn đã sử dụng một biến hay hàm con mà chưa khai báo biến/hàm đó trong

phạm vi sử dụng.

(cid:170) Ví dụ:

Dòng 8 sử dụng biến giatri chưa được khai báo

Dòng 9 sử dụng hàm abs chưa được khai báo

Dòng 10 sử dụng hàm Xuat chưa được khai báo

Trang 4

(cid:170) Cách giải quyết: thêm vào các khai báo thích hợp (khai báo hàm abs được đặt trong math.h)

Lớp 07DB_A/B

Hướng dẫn thực hành: Nhập môn lập trình

C2447: missing function header (old-style formal list?)

(cid:170) Lỗi này thường gặp khi sử dụng dấu ; trước dấu { trong thân hàm.

(cid:170) Ví dụ:

void Function(int a, int b);

{

a = a + b;

}

C2556: '' : overloaded functions only differs only by return type

C2371: '' : redefinition; different basic types

(cid:170) Hai lỗi này thường gặp khi có sự không khớp nhau giữa kiểu của hàm trong khai báo hàm

và trong định nghĩa hàm

(cid:170) Ví dụ:

Khai báo hàm: int Function(int a, int b);

Cài đặt: void Function(int a, int b)

{

a = b * 2.3;

return a;

Trang 5

}

Lớp 07DB_A/B

Hướng dẫn thực hành: Nhập môn lập trình

C2601: '' : local function definitions are illegal

(cid:170) Lỗi này xảy ra khi bạn định nghĩa một hàm bên trong thân một hàm khác, thường gặp khi

bạn quên đóng dấu ngoặc nhọn } để kết thúc một hàm bên trên. Lỗi này thường đi kèm với lỗi

C1004: unexpected end of file found

(cid:170) Ví dụ: hàm main được hiểu là hàm bên trong hàm Xuat và điều này không được phép

(illegal). Từ đó dẫn đến file source code không được kết thúc hợp lệ. Trường hợp này chỉ cần

thêm dấu ngoặc nhọn đóng hàm Xuat (hàm ngay phía trên hàm báo lỗi – main) lại.

LNK1168: cannot open Debug\.exe for writing

(cid:170) Lỗi này xảy ra khi bạn đang mở file thực thi trong khi biên dịch lại project của mình. Lúc

này, trình kết nối (link editor) cố gắng ghi thông tin lên một file .exe đang được sử dụng nhưng

không được. File .exe là file thực thi và nó sẽ được gán thuộc tính chống ghi cho đến khi

chương trình mà nó thực thi kết thúc.

(cid:170) Cách giải quyết: Nhìn xuống thanh trạng thái ở dưới cùng của màn hình và tìm xem chương

Trang 6

trình của bạn có đang chạy hay không, nếu có tắt nó đi rồi biên dịch lại.

Lớp 07DB_A/B

Hướng dẫn thực hành: Nhập môn lập trình

LNK2001: unresolved external symbol _main

(cid:170) Lỗi này xảy ra khi project của bạn không có hàm main()

(cid:170) Cách giải quyết: viết hàm main() cho project. (C luôn tìm kiếm hàm main() và chỉ thực thi

hàm main() mà thôi)

(cid:214) Đối với các lỗi không liệt kê trên đây, các bạn có thể vào MSDN để tra cứu cách sửa. Cách

tra: gõ số hiệu lỗi (ví dụ C2556) vào ô Search rồi Enter

III. BÀI TẬP ÁP DỤNG

1. Thống kê tổng số lỗi và chi tiết các lỗi khi biên dịch project MyErrors, cho biết ý

nghĩa và cách sửa từng lỗi. (Lưu ý: có một số lỗi không liệt kê ở trên, các bạn tự tìm

hiểu). Sửa lại các lỗi đó (sau khi sửa có thể phát sinh lỗi mới, cần thống kê cho tới khi

nào biên dịch không còn lỗi). Ví dụ:

Lỗi

STT 1

Ý nghĩa void đi sau SINHVIEN là không hợp lệ, có thể bạn đã quên dấu ‘;’ sau SINHVIEN error C2628: ‘SINHVIEN’ followed by ‘void’ is illegal (did you forget a ‘;’?)

char ten[20]; char mssv[7]; float diem;

Sửa Thêm dấu ‘;’ vào cuối khai báo struct như sau: struct SINHVIEN { }; … 2 …

2. Sau khi chương trình đã hết lỗi, chạy thử chương trình với thông số như sau và ghi lại

kết quả chạy của 2 hàm TimSVTrungTen và TimSVTrungDiem

(cid:190) Số lượng sinh viên: 4

(cid:190) Sinh viên 1: Nguyen Van An – 07DB999 – 10

(cid:190) Sinh viên 2: Nguyen Thanh Son – 07DB998 – 5

(cid:190) Sinh viên 3: Nguyen Van An – 07DB997 – 4.5

(cid:190) Sinh viên 4: Nguyen Van An – 07DB996 – 5

3. Hãy debug chương trình và liệt kê các tham số quan sát trong từng bước Debug của

Trang 7

hàm TimSVTrungTen và TimSVTrungDiem

Lớp 07DB_A/B

Hướng dẫn thực hành: Nhập môn lập trình

Cụ thể:

Debug hàm TimSVTrungTen

flag 0 0 0 …

i 0 0 0 …

j 1 2 3 …

sv_array[i].ten 0x0012ff1c ”a” … … …

sv_array[j].ten 0x0012ff3c “a” … … …

Tương tự cho hàm TimSVTrungDiem

4. Từ bảng liệt kê ở câu 3, hãy cho biết hàm TimSVTrungTen và TimSVTrungDiem

làm gì? (tham số đầu vào là gì? Kết quả đầu ra là gì? Các biến flag, i, j có nghĩa gì?)

5. Câu 2 cho kết quả đúng hay sai? Nếu sai, hãy cho biết lỗi sai nằm ở đâu? Đề xuất cách

sửa nếu có thể.

6. Theo bạn, chương trình còn có thể tiềm ẩn những lỗi nào nữa hay không? Nếu có hãy

nêu ra cụ thể lý do và cách sửa.

(cid:35) Nộp bài: Bài làm bằng file Word, đặt tên file là MSSV.doc (Ví dụ: 07DB333.doc); ghi

rõ họ tên, MSSV, lớp, ca học vào đầu bài làm (Ví dụ ca học: sáng thú 5, PM2), lần lượt trả

lời từng câu hỏi. Nộp bài lên Moodle (chung 1 link duy nhất cho các ca)

(cid:35) Thời hạn: 1 tuần [từ ngày 22/02/2008 đến 23h55’ ngày 29/02/2008]

(cid:35) Điểm cộng: không bắt buộc nộp, bài nộp sẽ tính là bài tập cộng điểm (phải làm ít nhất 5

câu)

Trang 8

(cid:35) Điểm trừ: các bài làm giống nhau (>70%) sẽ được trừ 1 điểm vào bài thi cuối kỳ.