2017-11-03 1 views
1

linasm-1.13 library을 사용하는 Octave C++ .oct 함수를 작성하려고하지만,/usr/share/zoneinfo /에서 tzdata를 기본로드하는 것조차도 작동하지 않습니다. 내 간단한 테스트 기능은 지금까지 mkoctfile로 컴파일에,이 오류를 제공,C++ 시간 라이브러리 및 옥타브 .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 

이의 나의 이해는 그 ny_time가 인식 객체가 아닌,하지만 난 노력했다 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 "source.cc" 파일도 가지고 있다고 생각합니다. 단지 #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; 
} 
관련 문제