Я пытаюсь написать функцию Octave C ++ .oct, которая использует библиотека linasm-1.13 но я не могу заставить работать даже базовую загрузку tzdata из / usr / share / zoneinfo /. Моя простая тестовая функция до сих пор
#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 выдает эту ошибку
>> 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 не является распознаваемым объектом, но я попытался привести ny_time в качестве строкового литерала, как подробно описано в этот принятый так ответ.
Я делаю так, потому что вход для LoadTimeZone в соответствии с строчная страница должен быть «путь к tzfile, который описывает необходимый часовой пояс». Куда я иду не так?
Я думаю, что вы должны #include "source.cc"
файлы, а не только #include "header.h"
файлы. В вашем случае, я думаю, вы должны добавить: #include "Time.cc"
или что-то типа того. Я не знаю почему, но это сработало для меня при работе с Волфмин библиотека Рафата Хуссейна, но у меня было только 4 файла, это должно быть невероятно утомительно с большим количеством файлов.
Это то, что я сделал (это модифицированная версия тестового кода, предоставленного Рафатом с его библиотекой).
#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;
}
Других решений пока нет …