Tôi đã tham gia một cái nhìn tại the assert()
reference page và tôi đã bị mắc kẹt trong khi tôi đọc những ví dụ đưa ra:Tôi có sử dụng sự hiểu lầm() không?
/* assert example */
#include <stdio.h>
#include <assert.h>
int main()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
assert (datafile);
fclose (datafile);
return 0;
}
Trong ví dụ này, khẳng định được sử dụng để hủy bỏ việc thực hiện chương trình nếu datafile so sánh bằng 0, trong đó xảy ra khi cuộc gọi trước đến fopen không thành công.
Tôi hoàn toàn đồng ý rằng nếu fopen()
không thành công, assert()
sẽ hủy bỏ việc thực thi. Tuy nhiên tôi lo ngại về tính đúng đắn của ví dụ này:
Theo tôi assert()
là có để phát hiện các trường hợp mà bình thường không thể xảy ra (như đi qua một con trỏ NULL
đến một hàm mà tài liệu khẳng định nó bị cấm).
Trong ví dụ này, việc không mở tệp không phải là điều mà thường không thể xảy ra. Trong thực tế, tôi có thể thấy hàng chục lý do tại sao điều này sẽ thất bại. Tệp không thể tồn tại, chương trình có thể chạy mà không có đặc quyền bắt buộc, v.v.
Tôi thà làm một cái gì đó như:
/* not longer an assert example */
#include <stdio.h>
#include <assert.h>
int main()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
if (datafile != NULL)
{
// Do something, whatever.
fclose (datafile);
} else
{
// Report the error somehow.
}
return 0;
}
là hiểu biết của tôi về cách assert()
nên được sử dụng không chính xác?
CHỈNH SỬA VÀ TIN TỨC TỐT!
Có vẻ như trang web được giới thiệu được cai trị bởi những người nghiêm khắc. Đây là thư tôi nhận được từ một trong những người bảo trì trang web:
Xin chào Julien, tôi phải đồng ý, mã ví dụ không được chọn. Nó có hiện đã được viết lại thành một cái gì đó phù hợp hơn.
Rất cám ơn vì đã chỉ ra điều này và xin lỗi về bất kỳ sự bất tiện nào mà điều này có thể gây ra cho bạn.
Trân trọng,
Và ví dụ Cập nhật:
/* assert example */
#include <stdio.h>
#include <assert.h>
void print_number(int* myInt) {
assert (myInt!=NULL);
printf ("%d\n",*myInt);
}
int main()
{
int a=10;
int * b = NULL;
int * c = NULL;
b=&a;
print_number (b);
print_number (c);
return 0;
}
Vui mừng khi thấy rằng một số người làm công việc của họ tốt trên Internet! ;)
+1 Để nhận ra rằng đây là một ví dụ không tốt. +2 Để gửi thư cho các địa chỉ liên lạc trang web. –
Sự hiểu biết của bạn là điểm trên. 'assert' là lỗi lập trình, không phải lỗi người dùng. – GManNickG
Tôi đã xóa thẻ C++, vì không có mẩu tin C++ trong bài đăng. – Puppy