0

我有以下主程序的代码。我基本上拥有的是一个类Pulsar,它有一些方法,我正在使用它们的列表std::vector<Pulsar>。然后我试图将向量传递给一个函数,该函数应该随机化 Pulsar 的一些成员值。在该函数 (pulsarGrid::generateSchedulepulsarGrid::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

0

您缺少的不是,std::allocator而是定义。很可能不会将 .o 链接到他们实现的位置,或者忘记将定义放入 .cpp 实现中的命名空间。pulsarGrid::generateSchedulepulsarGrid::randomizeDat

于 2013-07-05T18:03:04.750 回答