2008-11-12 28 views
5

Tôi đang xem nhúng Lua trong một ứng dụng C++ tôi đang phát triển. Ý định của tôi là sử dụng Lua để viết các hoạt động được sắp xếp theo thứ tự nào để thực hiện cho một số đầu vào cụ thể, tức là. nhận một mục công việc mới trong chương trình C++, chuyển chi tiết tới Lua backend, Lua gọi lại vào C++ để thực hiện công việc cần thiết, trả về kết quả đã hoàn thành.Làm thế nào để vượt qua lớn cấu trúc qua lại giữa giữa C + + và Lua

Cấu trúc dữ liệu chính có liên quan là lớn (khoảng 80+ thành viên) struct. Tôi (rất) mới với Lua và không chắc chắn làm thế nào tôi có thể vượt qua nó đến và đi từ ứng dụng máy chủ của tôi và trạng thái Lua nhúng.

Như vậy đến nay tôi thấy các tùy chọn của tôi là:

a) Đẩy/Popping tất cả các thành viên dữ liệu cá nhân vào stack khi qua đến/từ C++ và Lua (âm thanh lộn xộn).

b) Xây dựng một bảng và điền bằng các giá trị, sau đó đặt nó vào/tắt ngăn xếp (một chút dọn dẹp).

c) Chuyển nó thành userdata (ánh sáng/nặng?) (Tôi phác thảo về điều này và không chắc chắn liệu/sau đó tôi có thể truy cập từ phía Lua để truy vấn những thao tác cần thiết).

Mọi hướng dẫn sẽ được đánh giá cao.

Trả lời

4

Nếu tôi nhớ chính xác, userdata ánh sáng thực sự chỉ là một con trỏ. Họ đều chia sẻ cùng một metatable. Chúng chủ yếu được sử dụng để truyền xung quanh các địa chỉ của dữ liệu C.
Toàn bộ userdata có thể gần hơn với những gì bạn cần nếu bạn phải truy cập nó từ phía Lua. Tính khả thi của họ sẽ cho phép bạn truy cập nó giống như nó là một bảng Lua thông thường, chẳng hạn.

Bạn cũng có thể quan tâm đến Roberto's library for converting data to and from C structs for Lua 5.1. Hay không. Phụ thuộc vào nhu cầu của bạn ... :-)

+0

Tôi có thể truyền từ dữ liệu bộ chuyển đổi ánh sáng đến đối tượng mục tiêu-c. Tôi tưởng tượng nó sẽ làm việc tương tự cho một cấu trúc. –

3

Tôi chưa tự làm điều này (đã nhiều năm kể từ khi tôi sử dụng Lua và tôi chưa bao giờ sử dụng trong thời trang nhúng), nhưng tôi nghĩ bạn nên xem xét metatables và loại userdata. Tài liệu hướng dẫn này nói về giá trị userdata:

Loại này tương ứng với một bộ nhớ thô và không được xác định trước trong Lua, ngoại trừ bài tập phân định và nhận dạng. Tuy nhiên, bằng cách sử dụng các metatables, lập trình viên có thể xác định các hoạt động cho các giá trị userdata (xem §2.8). Không thể tạo hoặc sửa đổi các giá trị Userdata trong Lua, chỉ thông qua C API

Âm thanh phù hợp.

1

Hiển thị toàn bộ biểu diễn cho Lua có thể không phải là thứ bạn muốn. Có thể bạn chỉ phơi bày một vài thao tác? Sau đó sử dụng một con trỏ đến cấu trúc như userdata ánh sáng. Nó không thể có một metatable, do đó bạn phải sử dụng các hàm rõ ràng.

Nếu bạn muốn phơi bày mọi thứ, đặt cược tốt nhất của bạn có thể là đẩy một userdata đầy đủ chỉ chứa một con trỏ tới cấu trúc. Điều này có nghĩa là một mức độ thêm của sự lạc hướng --- bị mất trong tiếng ồn từ một quan điểm thực hiện, nhưng dễ dàng để có được sai, vì vậy duy trì một điểm duy nhất của sự thật, nơi bạn vượt qua ranh giới C++/Lua.

Với đầy đủ userdata, bạn có thể sử dụng macro (kinh dị!) Để đặt các hàm gettter và setter cho từng trường. Đây là rất nhiều công việc để làm bằng tay, và bạn có thể muốn kiểm tra tolua ++ mặc dù nó đi kèm với rất nhiều hành lý.

Đi tới danh sách gửi thư Lua!

0

Nếu tôi ở đâu, tôi sẽ chuyển một tham chiếu đến cấu trúc và sau đó để Lua gọi hàm C để sửa đổi nó. Điều này cũng có nghĩa là bạn có thể nâng cấp hệ thống với ít rắc rối hơn nếu Lua phải biết tất cả các chi tiết của hệ thống cơ bản.

Các vấn đề liên quan