Tôi đang tạo ứng dụng khách/máy chủ và muốn tự động gọi các hàm. tôi có tạo ra các cấu trúc sau:Các phần tử không xác định trong mảng cấu trúc
typedef struct _cmd cmd;
struct _cmd
{
const char *name;
void (*func)(int s,int ac, char **av);
};
Khi client gửi một lệnh đến máy chủ server sẽ duyệt qua một loạt các lệnh:
cmd cmds[] = {
{ "CREATE", cmd_create },
{ "EXIT" , cmd_exit },
{ "LIST", cmd_list },
{ "READ", cmd_read },
{ "DELETE", cmd_delete },
{ "UPDATE", cmd_update }
};
cmd *find_cmd(const char *name) {
cmd *c;
for (c = cmds; c->name; c++) {
if (stricmp(name, c->name) == 0)
return c;
}
return NULL;
}
Xin lưu ý rằng
stricmp()
không phải là một lỗi đánh máy, nó là một phiên bản không phân biệt dạng chữ của strcmp.
Tôi hiện là sự cố sau. Khi tôi gọi find_cmd() và vượt qua một commmand không hợp lệ, ứng dụng của tôi bị treo. thông báo gỡ lỗi của tôi cho thấy như sau:
Browsing Command: CREATE
Browsing Command: EXIT
Browsing Command: LIST
Browsing Command: READ
Browsing Command: DELETE
Browsing Command: UPDATE
Browsing Command: �p�
Browsing Command: �(�
Sau đó tôi nhận được segfault. Điều này nhìn tôi như thể có một số yếu tố không xác định trong mảng structm nhưng nơi nào họ đến từ đâu? Tôi đang nhìn gì? Cảm ơn trước cho bất kỳ con trỏ.
Bạn cần một [sentinel value] (http://en.wikipedia.org/wiki/Sentinel_value) để chấm dứt lệnh list của bạn. Vì đây là một cấu trúc, lệnh null và con trỏ hàm null sẽ hoạt động. – Joe
Không phải là câu trả lời mà chỉ cần lưu ý. Không sử dụng số nhận dạng bắt đầu bằng '_' vì nó được dành riêng để triển khai. – Jack
Cảm ơn các gợi ý, điều này hoạt động tốt, xem bình luận của tôi dưới đây :) –