2015-10-07 16 views
5

chỉ cần sao chép từ doc:cách nào đúng để sử dụng pointer_from_objref() và Ref()?

pointer_from_objref (object_instance):

Sự tồn tại của kết quả PTR sẽ không bảo vệ các đối tượng từ thu gom rác thải, vì vậy bạn phải đảm bảo rằng các đối tượng vẫn còn tham chiếu cho toàn bộ thời gian mà Ptr sẽ được sử dụng.

Ref {T}:

Một đối tượng đó một cách an toàn tham chiếu dữ liệu kiểu T. Đây là loại được đảm bảo để trỏ đến giá trị, Julia phân bổ bộ nhớ của đúng loại. Các dữ liệu cơ bản được bảo vệ khỏi giải phóng bởi bộ thu gom rác miễn là bản thân Ref được tham chiếu.

Khi được thông qua dưới dạng đối số ccall (hoặc là loại Ptr hoặc Ref), đối tượng Ref sẽ được chuyển thành con trỏ gốc thành dữ liệu mà nó tham chiếu.

Không có tham chiếu không hợp lệ (NULL).

tôi muốn chuyển con trỏ tới hàm c. theo doc, nó có vẻ như sử dụng pointer_from_objref không phải lúc nào cũng an toàn, vì vậy tôi cố gắng sử dụng Ref thay vì:

# test 1 
bufferID = convert(GLuint, 0) 
glGenBuffers(1, pointer_from_objref(bufferID)) 
@show bufferID 

out => bufferID = 0x00000001 # ok 

# test 2 
bufferID = convert(GLuint, 0) 
glGenBuffers(1, Ref(bufferID)) 
@show bufferID 

out => bufferID = 0x00000000 # unexpected result 

# test 3 
bufferID = GLuint[0] 
glGenBuffers(1, Ref(bufferID)) 
@show bufferID[] 

out => bufferID[] = 0x00000001 # ok 

kết quả cho thấy test 2 đưa ra một kết quả bất ngờ mà không cần bất kỳ lỗi, nhưng test 3 hoạt động tốt khi tôi chuyển đổi bufferID thành một mảng.

câu hỏi của tôi là lý do tại sao test 2 sẽ cho kết quả không mong muốn mà không xảy ra lỗi. vì mục đích an toàn, có phải luôn luôn sử dụng Ref() thay vì pointer_from_objref()? nếu có, có bất kỳ tác dụng phụ nào (ví dụ: hiệu suất) không?

Tôi đang sử dụng julia v"0.4.0-rc1".

Trả lời

1

Kiểm tra phần này: http://docs.julialang.org/en/latest/manual/calling-c-and-fortran-code/#passing-pointers-for-modifying-inputs

Để thực hiện theo mô hình đó, hãy thử những điều sau đây, mà làm việc cho tôi trên ccall khác() mã. Tôi nghĩ Ref {T} là một phần quan trọng trong việc cấp phát bộ nhớ và dereferencing bởi var [].

# test 4 
bufferID = Ref{GLuint}(0) 
glGenBuffers(1, bufferID) 
@show bufferID[] 
+0

cảm ơn! test2 là một mẫu sai. từ phần [cập nhật] (http://docs.julialang.org/en/latest/manual/calling-c-and-fortran-code/#when-to-use-t-ptr-t-and-ref- t), 'Ref' là đề nghị. – Gnimuc

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