Hướng dẫn thực hành Nhập môn lập trình - Chủ đề: Các lỗi thường gặp khi biên dịch chương trình trên VC++6.0

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

ª 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)

pdf8 trang | Chia sẻ: tieuaka001 | Lượt xem: 513 | Lượt tải: 0download
Nội dung tài liệu Hướng dẫn thực hành Nhập môn lập trình - Chủ đề: Các lỗi thường gặp khi biên dịch chương trình trên VC++6.0, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B 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 đó 3) Biên dịch lại project (F7) rồi quay lại bước 1 Trang 1 Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B II. MỘT SỐ LỖI THƯỜNG GẶP C2143: Syntax error : missing before ª 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 ª 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: ¾ Cách 1: Thêm dòng #include “StdAfx.h” vào ngay đầu file .cpp chứa code chương trình của bạn Trang 2 Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B ¾ Cách 2: Vào Project Æ Settings Æ chuyển sang tab C/C++, chọn Precompiled Headers trong Category, check vào ô Not Using Precompile Header C2001: newline in constant ª 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 ” ª Ví dụ: chuỗi đưa vào lệnh printf (dòng thứ 8) thiếu dấu đóng ngoặc kép ” Trang 3 Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B C2065: '' : undeclared identifier ª 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. ª 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 ª 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) Trang 4 Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B C2447: missing function header (old-style formal list?) ª Lỗi này thường gặp khi sử dụng dấu ; trước dấu { trong thân hàm. ª 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 ª 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 ª 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 Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B C2601: '' : local function definitions are illegal ª 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 ª 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 ª 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. ª 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 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. Trang 6 Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B LNK2001: unresolved external symbol _main ª Lỗi này xảy ra khi project của bạn không có hàm main() ª 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) Ö Đố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ụ: STT Lỗi Ý nghĩa Sửa 1 error C2628: ‘SINHVIEN’ followed by ‘void’ is illegal (did you forget a ‘;’?) void đi sau SINHVIEN là không hợp lệ, có thể bạn đã quên dấu ‘;’ sau SINHVIEN Thêm dấu ‘;’ vào cuối khai báo struct như sau: struct SINHVIEN { char ten[20]; char mssv[7]; float diem; }; 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 ¾ Số lượng sinh viên: 4 ¾ Sinh viên 1: Nguyen Van An – 07DB999 – 10 ¾ Sinh viên 2: Nguyen Thanh Son – 07DB998 – 5 ¾ Sinh viên 3: Nguyen Van An – 07DB997 – 4.5 ¾ 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 hàm TimSVTrungTen và TimSVTrungDiem Trang 7 Hướng dẫn thực hành: Nhập môn lập trình Lớp 07DB_A/B 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. # 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) # Thời hạn: 1 tuần [từ ngày 22/02/2008 đến 23h55’ ngày 29/02/2008] # Đ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) # Đ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ỳ. Trang 8

Các file đính kèm theo tài liệu này:

  • pdfnmlt_cac_loi_thuong_gap_trong_vc6_4468.pdf
Tài liệu liên quan