2013-07-08 20 views
7

Tôi đã đọc các văn bản trên tường, Tránh Globals. Điều này dẫn đến câu hỏi rõ ràng, cách tốt nhất để làm điều đó?Làm thế nào để không sử dụng các biến toàn cầu trong c

Tôi rõ ràng muốn làm điều đó với một dự án hiện tại. Mục tiêu là để cho một máy tính ở xa gửi "tổ hợp phím" tới các ứng dụng đã có trình đọc stdin. Ý tưởng là để cho các mã hiện có phát hiện không có phím tắt đang chờ xử lý, sau đó kiểm tra xem có một "phím tắt udp" và, nếu có, hãy chèn nó vào để nó có vẻ là đầu vào bàn phím. Tối thiểu xâm lấn và sẽ không đòi hỏi những người yêu thích trang trí của người khác.

Vì vậy, tôi rải sỏi lên một trình đọc socket UDP nhỏ có sử dụng một hàm setup() để mở và gắn vào cổng, sau đó một hàm service() trong một vòng lặp mà sử dụng một nonblocking select() một lần, không có vòng lặp, chỉ cần kiểm tra nếu có bất cứ điều gì để đọc ngay bây giờ. Nếu vậy, đọc dữ liệu từ các ổ cắm và làm điều gì đó với nó, nếu không trả về một 0.

// pseudo c 
char c; 

setup(); 
while (1) 
{ 
    c = check_for_keyboard_entry(); 
    if (c == 0) 
     c = service(); 
    handle_keypress(c); 
    do_a_bunch_of_other_stuff(); 
} 

Các cách rõ ràng để làm điều này là với một vài globals chuyển cảng, thời gian chờ, sockaddr của, vv giữa hai chức năng. Nhưng, các ngươi phải avid globals, phải không?

Vì vậy, cách ưa thích để chuyển sáu hoặc tám vars giữa các chức năng là gì?

Nếu tôi sử dụng các bình tĩnh trong setup(), chúng có thể truy cập được theo thông lệ service() không?

Tôi giả sử một cấu trúc được lấy nét và được truyền xung quanh sẽ hoạt động. Tôi cần phải có một cleanup() để đóng ổ cắm và giải phóng bộ nhớ.

HÃY NHỚ, ĐÂY LÀ CÂU HỎI C. KHÔNG C++!

+2

_''Tôi giả sử một cấu trúc được tạo thành đường viền và được truyền xung quanh sẽ hoạt động '' '- Bạn đã hiểu! –

+0

+1 cho tốc độ thô! Bất kỳ cách tiếp cận nào khác? –

+1

Vui lòng sửa \ 0 thành 0 hoặc '\ 0' –

Trả lời

3

Bạn chỉ có thể đóng gói tất cả thông tin đó vào struct. Cấu trúc có thể được hiển thị cho khách hàng hoặc một loại đục. Một loại mờ có thể là một lựa chọn tốt hơn để bạn có thể ẩn dữ liệu (đóng gói) cho các loại phức tạp.

typedef struct { 
port_t port; 
timeout_t timeout; 
sockaddr_t sockaddr; 
etc_t etc; 
} my_stuff; 

sau đó vượt qua nó xung quanh bằng cách tham khảo:

void Foo(my_stuff*); 

Tôi cho rằng một cấu trúc mà được malloc-ed và thông qua xung quanh sẽ làm việc. Tôi cần phải có một dọn dẹp() để đóng ổ cắm và giải phóng bộ nhớ.

Nói chung, cấu trúc không phải lúc nào cũng cần phải là malloc 'ed. Nhưng có, đây có thể là trường hợp cần thiết.

+0

Nhưng điều đó không làm cho cấu trúc trở thành toàn cầu? Hay bạn có nghĩa là có 'foo()' trả về một con trỏ tới 'my_stuff'? Nếu vậy, làm thế nào 'my_stuff' vẫn tồn tại khi phạm vi' foo() 'đóng? Hoặc bạn sẽ làm cho 'my_stuff' tĩnh trong' foo() '? –

+2

@WesMiller: Bạn có thể đặt nó trên ngăn xếp trong phạm vi bên ngoài. Vì vậy, 'int main() {my_stuff stuff; stuff.port = 80; ...; Foo (& công cụ); ...; trả về 0; } '. Các biến tĩnh trong các hàm thực tế là toàn cầu và chia sẻ các vấn đề tương tự. –

+0

@MaciejPiechotka +1. Một cái tát dope xứng đáng, tự quản lý được áp dụng. Câu trả lời là hiển nhiên khi bạn thấy nó. –