C++ C++;时间库和倍频程.oct文件

C++ C++;时间库和倍频程.oct文件,c++,datetime,octave,tzdata,C++,Datetime,Octave,Tzdata,我试图编写一个八度的C++。OCT函数使用了,但是我不能从/Ur/Stuts/ZoNeFiels/to工作得到基本的TZDATA加载。到目前为止,我的简单测试函数是 #include <octave/oct.h> #include <Time.h> // the linasm-1.13 library DEFUN_DLD ( tz, args, nargout, "-*- texinfo -*-\n\ @deftypefn {Function File} {} tz (

我试图编写一个八度的C++。OCT函数使用了,但是我不能从/Ur/Stuts/ZoNeFiels/to工作得到基本的TZDATA加载。到目前为止,我的简单测试函数是

#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 ;
我的理解是,ny_时间不是一个可以识别的对象,但我已经尝试将ny_时间转换为字符串文字,如中所述

我这样做是因为根据的LoadTimeZone的输入应该是“到tzfile的路径,它描述了所需的时区。”我哪里出错了

我认为您还必须
#包括“source.cc”
文件,而不仅仅是
#包括“header.h”
文件。在您的情况下,我想您应该添加:
#包括“Time.cc”
或类似的内容。我不知道为什么,但这对我工作的时候起作用,但我只有4个文件,它一定是令人难以置信的乏味与大量的文件

这就是我所做的(这是Rafat及其库提供的测试代码的修改版本)

#包括“wavemin.h”
#包括“waveaux.h”
#包括“wavemin.cc”
#包括“waveaux.cc”
#包括
双ensayo();
双absmax(双*数组,整数N);
DEFUN_DLD(helloctave2,argv,“用法:hello()”){
波浪物体;
wt_对象wt;
双*输入,*输出,*差异;
int N,i,J;
char*name=“db4”;
obj=wave_init(name);//初始化小波
N=14;//信号长度
inp=(double*)malloc(sizeof(double)*N);//输入信号
out=(双*)malloc(sizeof(双)*N);
diff=(双*)malloc(sizeof(双)*N);
//wmean=平均值(温度,N);
对于(i=0;ioutput vector访问DWT输出。使用wt_summary了解如何提取appx和细节系数
对于(i=0;ioutlength;++i){
倍频程标准输出[i];
倍频程(标准符号长度;++i){
diff[i]=out[i]-inp[i];
}
倍频程(标准长度);
倍频程(最大值){
max=fabs(数组[i]);
}
}
返回最大值;
}
我认为您还必须
#包括“source.cc”
文件,而不仅仅是
#包括“header.h”
文件。在您的情况下,我想您应该添加:
#包括“Time.cc”
或类似的内容。我不知道为什么,但这对我工作的时候起作用,但我只有4个文件,它一定是令人难以置信的乏味与大量的文件

这就是我所做的(这是Rafat及其库提供的测试代码的修改版本)

#包括“wavemin.h”
#包括“waveaux.h”
#包括“wavemin.cc”
#包括“waveaux.cc”
#包括
双ensayo();
双absmax(双*数组,整数N);
DEFUN_DLD(helloctave2,argv,“用法:hello()”){
波浪物体;
wt_对象wt;
双*输入,*输出,*差异;
int N,i,J;
char*name=“db4”;
obj=wave_init(name);//初始化小波
N=14;//信号长度
inp=(double*)malloc(sizeof(double)*N);//输入信号
out=(双*)malloc(sizeof(双)*N);
diff=(双*)malloc(sizeof(双)*N);
//wmean=平均值(温度,N);
对于(i=0;ioutput vector访问DWT输出。使用wt_summary了解如何提取appx和细节系数
对于(i=0;ioutlength;++i){
倍频程标准输出[i];
倍频程(标准符号长度;++i){
diff[i]=out[i]-inp[i];
}
倍频程(标准长度);
倍频程(最大值){
max=fabs(数组[i]);
}
}
返回最大值;
}

从错误消息中可以看出,您需要首先构造一个
Time
对象,然后在该对象上调用
LoadTimeZone
。因此,您可能还需要在
Time
类周围提供一个倍频程包装器,然后需要倍频程代码来提供它。顺便说一句,在大多数情况下,我更喜欢使用Swig而不是手动编写绑定,因为Swig为您处理了许多繁琐的细节(并且它确实支持生成倍频程绑定)。如果您使用的是C++11或更高版本,这里有一个可供选择的时区库,您可能会考虑:它具有出色的文档和支持。在帮助邮件列表上,从错误消息中可以看出,您需要首先构造一个
Time
对象,然后在该对象上调用
LoadTimeZone
。因此,您可能还需要在
Time
类周围提供一个倍频程包装器,然后需要倍频程代码来提供它。顺便说一句,在大多数情况下,我更喜欢使用Swig而不是手动编写绑定,因为Swig为您处理了许多繁琐的细节(并且它确实支持生成倍频程绑定)。如果您使用的是C++11或更高版本,这里有一个可供选择的时区库,您可以考虑:它具有优秀的文档和支持。帮助邮件列表中的线程
>> 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
#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;
}