2012-06-19 23 views
9

Visual C++ ile Octave kullanıyorum.Octave C++ ve VS2010

octave-3.6.1-vs2010-setup-1.exe yüklüyorum. Yeni bir proje oluşturdu, lib yolunave octave.lib yolunu eklemek için octave include klasörünü ekledim ve dizin çalıştırırken Octave bin klasörünü ekledim.

programı derler ve duruma neden olur feval fonksiyonu dışında gayet çalıştırır:

:

Microsoft C++ istisna: hafıza konumu 0x0012faef

de ve Octave tarafında octave_execution_exception Geçersiz yeniden boyutlandırma işlemi veya sınırlar dışındaki dizi öğelerine belirsiz bir atama.

Neyi yanlış yapıyorum? Bir standalone program için


Kodu: önceden

#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; 
} 

teşekkürler.

cevap

7

Kendim denedim ve sorun feval satırından kaynaklanıyor gibi görünüyor.

Şimdi neden diye bir açıklamam yok, ancak sorun,yapılandırması yerine "Release" yapılandırmasına geçerek çözüldü.

WinXP'de VS2010 ile Octave3.6.1_vs2010 derlemesini kullanıyorum. bir çıkış ile

#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; 
} 

:

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

Posta listesinden sorduğumda, Octave sadece çalışma zamanının \ MD bayrağıyla bağlanmasına izin veriyor gibi görünüyor. – user629926

1

Aslında gelecek çizgisinde işaret durdu ve hata aslında bu hat yatıyor onun olduğunu tahmin ediyorum:

f_arg(0) = octave_value(NumRands); 

Bir vektör bir değer (? Hangi değer) elde etmek için çalışırken gibi görünüyor ve daha sonra bir vektör olarak tanımlanmamış bir vektörün elemanına 0 atanması.

Gerçekten bilmiyorum ... Asla böyle bir kod yazmayı denemedim. Ben sadece standart matlab/oktav koduna çevirerek çalışıyorum ve bu satır bana çok garip geliyor ...

+1

buna olmadığını kontrol İşte

ben test kodudur. Ayrıca, eval_string'in her zaman std :: bad_aloc istisnasını attığını buldum. Sadece http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html adresinden ikinci örneği çalıştırmayı denedim ve 'argv (0) = "katıştırılmış"' a atıyorum. 'const std :: string a =' embedded 'denedi; argv.append (a) 've aynı zamanda atar ve hata ayıklayıcı, bazen çok tuhaf olan BadPtr gibi bazen kimi zaman önemsiz gösterir. Ben C++ için yeniyim, belki açık bir şey eksik. – user629926