Một cách tiếp cận phổ biến là có một số hàm m-file cung cấp giao diện công khai, ví dụ: sysInit.m, sysRefresh.m, v.v.
Mỗi tệp m này gọi hàm mex với một loại xử lý nào đó, một chuỗi (hoặc số) xác định hàm cần gọi, và bất kỳ số arg bổ sung nào. Ví dụ, sysRefresh.m có thể trông giống như:
function sysRefresh(handle)
return sysMex(handle, 'refresh')
Trong chức năng sysMex mex của bạn, bạn có thể có tay cầm là một con trỏ đống thô (dễ dàng, nhưng không phải là rất an toàn), hoặc bạn có thể duy trì một ánh xạ trong C/C++ từ ID xử lý đến các con trỏ đối tượng thực tế. Giải pháp này đòi hỏi một chút công việc phụ, nhưng nó an toàn hơn nhiều. Bằng cách này, một người nào đó không thể vô tình vượt qua một số tùy ý như một tay cầm, hoạt động như một con trỏ lơ lửng. Ngoài ra, bạn có thể làm những điều quan trọng hơn như sử dụng chức năng onCleanup để giải phóng tất cả bộ nhớ và tài nguyên khi bạn bỏ chức năng mex (ví dụ: do đó bạn không phải khởi động lại matlab khi bạn biên dịch lại hàm mex).
Bạn có thể tiến xa hơn một chút nếu bạn thích và ẩn tay cầm đằng sau lớp Matlab. Đọc các tính năng OO cho Matlab trong tài liệu nếu bạn quan tâm. Nếu bạn đang sử dụng phiên bản gần đây, bạn có thể tận dụng các đối tượng xử lý sạch hơn của họ.
Nguồn
2009-07-27 11:46:38
Cảm ơn ông Fooz. Tôi đã thực hiện với xử lý (trực tiếp như con trỏ) và nó có vẻ là làm việc. Đây là một chút ngạc nhiên đối với tôi rằng đối tượng lớp được cấp phát trong heap, không bị xóa khi hàm mex trả về. Đây có phải là hành vi bình thường mà tôi có thể dựa vào Windows (XP, Vista và 7) không? Cảm ơn rất nhiều lần nữa. – Paul
Nếu bạn phân bổ các đối tượng bằng cách sử dụng cấp phát của Matlab, chúng sẽ tự động bị xóa khi trở về từ hàm mex. Nếu bạn sử dụng malloc hoặc mới, sau đó Matlab không biết về chúng và do đó không de-phân bổ. –