0

メインプログラムの次のコードがあります。私が基本的に持っているのは、Pulsarいくつかのメソッドを持つ class であり、それらのリストにはstd::vector<Pulsar>. 次に、ベクトルを関数に渡そうとしています。関数は、パルサーのいくつかのメンバー値をランダム化する必要があります。その関数 ( pulsarGrid::generateScheduleand 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 cleanmakeコンパイルすると、セグメンテーション違反が発生します。したがって、エラーは異なる場合があります。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();

編集:私は愚かでした、私の問題は解決しました。生成関数の順序を変更する必要がありました。

助けようとしたすべての人に感謝します。そして、デバッグプロセスで名前空間を再入力したため、技術的には最初の答えが正しかったと思います。それを受け入れます。

4

1 に答える 1