2012-06-19 20 views
9

Tôi đang cố gắng Sử dụng Octave với Visual C++.Octave C++ và VS2010

Tôi đã tải xuống octave-3.6.1-vs2010-setup-1.exe. Đã tạo một dự án mới, đã thêm octave include thư mục để bao gồm đường dẫn, octinterp.liboctave.lib vào đường dẫn lib và tôi đã thêm thư mục Octave bin làm thư mục đang chạy.

Chương trình biên dịch và chạy tốt trừ feval chức năng gây ra ngoại lệ:

Microsoft C++ ngoại lệ: octave_execution_exception tại vị trí bộ nhớ 0x0012faef

và Octave phụ:

Thao tác thay đổi kích thước không hợp lệ hoặc gán không rõ ràng cho phần tử mảng ngoài giới hạn.

Tôi đang làm gì sai?


Mã cho một standalone program:

#include <octave/octave.h> 
#include <octave/oct.h> 
#include <octave/parse.h> 

int main(int argc, char **argv) 
{ 
    if (octave_main (argc, argv, true)) 
    { 
     ColumnVector NumRands(2); 
     NumRands(0) = 10; 
     NumRands(1) = 1; 
     octave_value_list f_arg, f_ret; 
     f_arg(0) = octave_value(NumRands); 
     f_ret = feval("rand",f_arg,1); 
     Matrix unis(f_ret(0).matrix_value()); 
    } 
    else 
    { 
     error ("Octave interpreter initialization failed"); 
    } 
    return 0; 
} 

Cảm ơn trước.

Trả lời

7

Tôi đã thử bản thân và sự cố dường như bắt nguồn từ dòng feval.

Bây giờ tôi không giải thích tại sao, nhưng sự cố đã được giải quyết bằng cách chuyển sang cấu hình "Release" thay vì cấu hình "Debug".

Tôi đang sử dụng bản dựng Octave3.6.1_vs2010, với VS2010 trên WinXP.

Đây là mã tôi thử nghiệm:

#include <iostream> 
#include <octave/oct.h> 
#include <octave/octave.h> 
#include <octave/parse.h> 

int main(int argc, char **argv) 
{ 
    // Init Octave interpreter 
    if (!octave_main(argc, argv, true)) { 
     error("Octave interpreter initialization failed"); 
    } 

    // x = rand(10,1) 
    ColumnVector sz(2); 
    sz(0) = 10; sz(1) = 1; 
    octave_value_list in = octave_value(sz); 
    octave_value_list out = feval("rand", in, 1); 

    // print random numbers 
    if (!error_state && out.length() > 0) { 
     Matrix x(out(0).matrix_value()); 
     std::cout << "x = \n" << x << std::endl; 
    } 

    return 0; 
} 

với sản lượng:

x = 
0.165897 
0.0239711 
0.957456 
0.830028 
0.859441 
0.513797 
0.870601 
0.0643697 
0.0605021 
0.153486 
+1

Tôi đã hỏi trong danh sách gửi thư của họ có vẻ như Octave chỉ cho phép liên kết thời gian chạy với cờ \ MD. – user629926

1

Tôi đoán rằng nó thực sự dừng lại chỉ tay vào dòng tiếp theo và các lỗi thực sự nằm ở dòng này:

f_arg(0) = octave_value(NumRands); 

Bạn đang cố gắng để có được một giá trị (mà giá trị?) Từ một vector và sau đó gán nó cho phần tử 0 của một vectơ chưa được xác định là một vectơ.

Tôi thực sự không biết ... Tôi chưa bao giờ thử viết mã octave như thế. Tôi chỉ cố gắng làm việc bằng cách dịch mã thành mã MATLAB chuẩn/quãng tám và dòng đó dường như thực sự lạ với tôi ...

+1

Tôi đã kiểm tra rằng nó không phải là nó. Ngoài ra tôi thấy rằng eval_string luôn ném std :: bad_aloc exception. Chỉ trong trường hợp tôi đã cố gắng chạy mẫu thứ hai từ http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html và nó ném vào 'argv (0) = "nhúng", vì vậy tôi đã thử 'const std :: string a = "embedded"; argv.append (a) 'và nó cũng ném và trình gỡ lỗi hiển thị đôi khi như một số thư rác đôi khi là BadPtr mà tất cả đều rất lạ. Tôi mới đến c + +, có lẽ tôi đang thiếu một cái gì đó hiển nhiên. – user629926

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