2017-11-03 8 views
1

linasm-1.13 libraryを使用するOctave C++の.oct関数を作成しようとしていますが、/ usr/share/zoneinfo /からのtzdataの基本的な読み込みも機能しません。私の簡単なテスト機能は、これまでの私の理解では、ny_timeが認識されているオブジェクトではありませんが、私が試したことですmkoctfileでコンパイルするには、このエラーを与え、C++タイムライブラリとOctave .octファイル

#include <octave/oct.h> 
#include <Time.h> // the linasm-1.13 library 

DEFUN_DLD (tz, args, nargout, 
"-*- texinfo -*-\n\ 
@deftypefn {Function File} {} tz (@var{YYYYMMDDHHMMSS})\n\ 
\n\ 
@end deftypefn") 

{ 
octave_value_list retval_list ; 
unsigned int tz ; 

const char *ny_time = "/usr/share/zoneinfo/America/New_York" ; 

tz = Time::LoadTimeZone(ny_time) ; 

return retval_list ; 

>> mkoctfile tz.cc 
tz.cc: In function ‘octave_value_list Ftz(const octave_value_list&, int)’: 
tz.cc:24:34: error: cannot call member function ‘unsigned int Time::LoadTimeZone(const char*)’ without object 
tz = Time::LoadTimeZone(ny_time) ; 
          ^
warning: mkoctfile: building exited with failure status 

ですthis accepted SO answerで説明されているように、ny_timeを文字列リテラルとしてキャストします。

linasm pageのLoadTimeZoneの入力は、「必要な時間帯を記述するtzfileへのパス」である必要があるため、私はこのようにしています。どこが間違っていますか?

+0

エラーメッセージから、まず 'Time'オブジェクトを作成し、そのオブジェクトで' LoadTimeZone'を呼び出す必要があるようです。したがって、 'Time'クラスの周りにOctaveラッパーを用意し、それを提供するためにOctaveコードを必要とするかもしれません。 –

+0

ちなみに、ほとんどの場合、Swigは手作業でバインディングを書くよりもSwigを使うほうが好きです。Swigは、あなたの面倒な詳細を大量に処理します(Octaveバインディングの生成もサポートしています)。 –

+0

C++ 11以降を使用している場合、考慮する可能性のある別のタイムゾーンライブラリがあります。https://howardhinnant.github.io/date/tz.html優れたドキュメントとサポートがあります。 –

答えて

0

ファイルもありますが、#include "header.h"ファイルだけではありません。あなたの場合、私はあなたが追加する必要があります:#include "Time.cc"またはそのようなものだと思います。なぜ私はRafat's Hussain wavemin libraryで作業していたのですが、私は4つのファイルしか持っていませんでした。なぜなら、たくさんのファイルで信じられないほど退屈でなければなりません。

これは私が行ったことです(これは、Rafatがライブラリで提供したテストコードの修正版です)。

#include "wavemin.h" 
#include "waveaux.h" 
#include "wavemin.cc" 
#include "waveaux.cc" 
#include <octave/oct.h> 

double ensayo(); 
double absmax(double *array, int N); 

DEFUN_DLD(helloctave2, argv, , "Usage: hello()"){ 

    wave_object obj; 
    wt_object wt; 
    double *inp, *out, *diff; 
    int N, i, J; 
    char *name = "db4"; 
    obj = wave_init(name);// Initialize the wavelet 
    N = 14; //Length of Signal 
    inp = (double*)malloc(sizeof(double)* N); //Input signal 
    out = (double*)malloc(sizeof(double)* N); 
    diff = (double*)malloc(sizeof(double)* N); 
    //wmean = mean(temp, N); 
    for (i = 0; i < N; ++i) { 
     inp[i] = i; 
    } 
    J = 1; //Decomposition Levels 
    wt = wt_init(obj, "dwt", N, J);// Initialize the wavelet transform object 
    setDWTExtension(wt, "sym");// Options are "per" and "sym". Symmetric is the default option 
    setWTConv(wt, "direct"); 
    dwt(wt, inp);// Perform DWT 
    //DWT output can be accessed using wt->output vector. Use wt_summary to find out how to extract appx and detail coefficients 
    for (i = 0; i < wt->outlength; ++i) { 
    octave_stdout << wt->output[i]; 
    octave_stdout << "\n"; 
    } 

    idwt(wt, out);// Perform IDWT (if needed) 
    // Test Reconstruction 
    for (i = 0; i < wt->siglength; ++i) { 
     diff[i] = out[i] - inp[i]; 
    } 

    octave_stdout << absmax(diff, wt->siglength); 
    octave_stdout << "\n"; 

    octave_value_list retval;    

    return retval;        
}  

double 
absmax(double *array, int N) { 
    double max; 
    int i; 
    max = 0.0; 
    for (i = 0; i < N; ++i) { 
     if (fabs(array[i]) >= max) { 
      max = fabs(array[i]); 
     } 
    } 
    return max; 
}