メインプログラムの次のコードがあります。私が基本的に持っているのは、Pulsar
いくつかのメソッドを持つ class であり、それらのリストにはstd::vector<Pulsar>
. 次に、ベクトルを関数に渡そうとしています。関数は、パルサーのいくつかのメンバー値をランダム化する必要があります。その関数 ( pulsarGrid::generateSchedule
and pulsarGrid::randomizeData
) で、ベクトルのサイズを変更し、メンバー値を初期化します。
#include "linalg.hh"
#include "signal-model.hh"
#include "signal-sampling.hh"
#include "signal-vectors.hh"
#include "pulsar.hh"
#include <vector>
#include <iostream>
#include <fstream>
int main() {
unsigned int pulsarNumber = 6;
std::vector<double> range (6);
range[0] = 50, range[0] = 100;
range[1] = 0, range[0] = M_PI;
range[2] = -M_PI, range[0] = M_PI;
// Define some variables for bigger timescales
double week = 7 * 3600 * 24,
year = 52 * week,
t_final = 5 * year,
dt_min = 2 * week,
dt_max = 2 * week;
std::vector<double> t_init (pulsarNumber, 0);
std::vector<Pulsar> pulsars;
// Randomize the pulsar structure and generate a schedule
pulsarGrid::generateSchedule (pulsars, t_init, t_final, dt_min, dt_max);
pulsarGrid::randomizeData (pulsars, pulsarNumber, range, 0.00005);
// Add a single source
std::vector<std::vector<double> > sources (1);
sources[0].resize(8);
sources[0][0] = 1;
sources[0][1] = 1e31;
sources[0][2] = 0;
sources[0][3] = 0;
sources[0][4] = 0;
sources[0][5] = 0.3;
sources[0][6] = 0.5;
sources[0][7] = 1e-8;
// Generate a residual vector
std::vector<double> r = generateSample (pulsars, sources);
// Output the stuff
// FIXME
return 0;
}
pulsar.hh
ファイルの関連部分(ご参考までに、Pulsar
クラスには空のイニシャライザしかなく、値の一部をゼロに設定しています):
namespace pulsarGrid {
void randomizeData (std::vector<Pulsar>& Grid, unsigned int N, dvec range, double wnoise);
void generateSchedule (std::vector<Pulsar> &Grid, std::vector<double> initialTimes, double tFinal, double tMin, double tMax);
}
エラー ログは次のとおりです (これは表示されなくなりました。以下を参照してください)。
ia277@calx015> make ~/repo/pta-roq/c++
Building obj/data_generator.o
g++ obj/linalg.o obj/pulsar.o obj/signal-model.o obj/signal-vectors.o obj/signal-sampling.o obj/random-helper.o obj/data_generator.o -Wall -L /usr/lib64/atlas -lcblas -lgsl -o data_generator
obj/data_generator.o: In function `main':
/home/ia277/repo/pta-roq/c++/src/data_generator.cc:33: undefined reference to `pulsarGrid::generateSchedule(std::vector<Pulsar, std::allocator<Pulsar> >&, std::vector<double, std::allocator<double> >&, double, double, double)'
/home/ia277/repo/pta-roq/c++/src/data_generator.cc:34: undefined reference to `pulsarGrid::randomizeData(std::vector<Pulsar, std::allocator<Pulsar> >&, unsigned int, std::vector<double, std::allocator<double> >&, double)'
collect2: error: ld returned 1 exit status
make: *** [data_generator] Error 1
質問
不足しているstd::allocator
エラーが表示されるのはなぜですか? それを取り除く方法は?
編集:関数の定義は次のとおりです。
namespace pulsarGrid {
void randomizeData (std::vector<Pulsar>& Grid, unsigned int N, dvec range, double wnoise) {
for (unsigned int i = 0; i < N; i++) {
Pulsar tmp;
// Randomize angles in some range
tmp.setAngles(random_uniform(range[2], range[3]), // random \theta
random_uniform(range[4], range[5])); // random \phi
// As well as the distance
tmp.setDistance(random_uniform(range[0], range[1]));
// Randomize the noise values, such that all pulsars have different noises.
tmp.setWhiteNoise(random_uniform(0,wnoise));
Grid.push_back(tmp);
}
random_uniform_free();
}
void generateSchedule (std::vector<Pulsar> &Grid, std::vector<double> initialTimes, double tFinal, double tMin, double tMax) {
unsigned int N = initialTimes.size();
std::vector<double> Times;
// Copy the structure of the array for the time log
std::vector<std::vector<double> > dates (N);
// Iterate over each pulsar
for (unsigned int i = 0; i < N; i++) {
// Reset the time
double t = initialTimes[i];
// Generate a time series
while (t < tFinal) {
Times.push_back(t);
// Advance in time
t += random_uniform(tMin, tMax);
}
Grid[i].setSchedule(Times);
}
random_uniform_free();
}
}
を実行した後、バイナリmake clean
をmake
コンパイルすると、セグメンテーション違反が発生します。したがって、エラーは異なる場合があります。gdb からの出力は次のとおりです。
std::vector<double, std::allocator<double> >::operator= (this=0x50, __x=...) at /data/ioasoft/software/gcc/4.7.2/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/vector.tcc:182
182 const size_type __xlen = __x.size();
編集:私は愚かでした、私の問題は解決しました。生成関数の順序を変更する必要がありました。
助けようとしたすべての人に感謝します。そして、デバッグプロセスで名前空間を再入力したため、技術的には最初の答えが正しかったと思います。それを受け入れます。