2012-04-04 8 views
6

Tôi không thể biết đây có phải là lỗi hay không.Làm cách nào để chuyển một mảng từ perl sang inline C++?

Các mã sau đây làm việc với Inline::C nhưng không Inline::CPP

#!/usr/bin/perl 
use warnings; 
use Inline C; 

my @array = (1..10); 
print findAvLen(\@array), "\n"; 

__END__ 
__C__ 

int findAvLen(AV* arrayIn) { 
    return av_len(arrayIn); 
} 

Máy chạy trên tốt, nhưng thay thế C với CPP, và tôi nhận được lỗi Can't locate auto/main/findAvLen.al in @INC...

tôi có thể nhận inline khác C++ mã để làm việc . Ví dụ, có thể chuyển danh sách các biến sang mã nội tuyến bằng dấu chấm lửng như chúng in this example, nhưng tôi tự hỏi tại sao AV * không hoạt động! Ví dụ, tôi sẽ muốn sử dụng một chương trình con để chuyển đổi các mảng perl được chuyển tới C++ thành các vectơ, ví dụ: void perl2vector(AV* ar, std::vector<T> &v) {...}, thay vì chèn mã để thực hiện chuyển đổi như vậy vào mọi hàm C++ mà tôi viết có tham số mảng. Làm thế nào tôi có thể sử dụng cú pháp của ví dụ đó để chuyển mảng perl đến một trình chuyển đổi như vậy?


này dường như là một lỗi, nhưng trong khi chờ đợi, uesp đã tìm thấy một workaround:

int findAvLen(SV* arrRef) { 
    AV * arr = MUTABLE_AV(SvRV(arrRef)); 
    return av_len(arr); 
} 

arr tại là tương đương với arrayIn mong muốn trong các mã ví dụ trên.

+2

Hoạt động tốt cho tôi: Perl 5.14.0 i686-linux-thread-đa, Nội tuyến 0,5, Nội tuyến :: CPP 0,38. Nó có vẻ như một lỗi đã được sửa chữa, như uesp nói, mặc dù có vẻ như tất cả những gì bạn phải làm là nâng cấp Inline :: CPP (không phải Perl) lên phiên bản 0.29 hoặc cao hơn. – ikegami

+0

hrmm, tôi đang chạy perl v5.12.3 với Inline :: CPP v0.38. Tôi sẽ cố gắng và cập nhật perl và xem nếu điều đó giúp. – flies

+0

Tôi có một hộp khác với perl v5.12.4 và tôi gặp lỗi tương tự. Đang nói chuyện với sysadmin ... – flies

Trả lời

4

Điều này có vẻ giống hệt với this Perl bug tồn tại trong 5.10.0 và phải được sửa trong bản phát hành 5.10.29. Nếu bạn đang chạy 5.10.0-28, hãy thử cập nhật. Nếu bạn không chạy các phiên bản này và vẫn gặp lỗi, bạn có thể thử thực hiện những gì được đề cập trong this forum post bằng cách thay đổi AV thành SV.

+0

Tôi hiện đang chạy perl v5.12.3 – flies

+0

Thử thực hiện kiểm tra bằng cách sử dụng 'SV' và xem điều đó có phù hợp với bạn hay không. Nếu không, hoặc các hàm C++ thử nghiệm tầm thường khác dẫn đến lỗi tương tự, thì đó là một vấn đề khác. – uesp

+0

'int f (SV * arrayIn) {return 1; } 'công trình, nhưng tôi không chắc làm thế nào tôi có thể sử dụng SV để truy cập một mảng (tôi đã sử dụng Inline :: C trước đây, nhưng không bao giờ xs, vì vậy kinh nghiệm của tôi bị giới hạn). Đang đọc hiểu biết ... – flies