在C ++源文件之间共享动态分配的数组

时间:2014-09-24 20:07:36

标签: c++ arrays

我正在尝试使用两个(实际上,但这并不重要)源代码编译代码。在其中一个中,我声明了一个可变大小的数组:

const int number_of_equidistant = spike_location[number_of_spikes-1];
point_type* equidistant = NULL;
equidistant = new point_type[number_of_equidistant];

只要我在我声明它的同一源文件中使用它,它就可以正常工作。但是,我想在其他地方访问它(此时只是为了打印内容以检查它是否应该执行的操作)以及动态大小导致问题的地方(我尝试声明大小)作为extern const int但是没有用)。有没有一种解决方法,或者这是一种特别愚蠢的方法,应该以某种方式以不同方式完成吗?

特定的错误报告是:

debug.cpp: In function ‘void debug_initialization()’:
debug.cpp:71:56: error: storage size of ‘equidistant’ isn’t constant
extern point_type equidistant[number_of_equidistant];

在debug.cpp中,数组和大小声明如下:

extern const int number_of_equidistant;
extern point_type equidistant[number_of_equidistant];

我当然可以将其更改为列表(或堆或类似的东西),但我宁愿能够通过索引轻松访问数据。我不知道任何其他方法,所以我欢迎任何建议:)

2 个答案:

答案 0 :(得分:1)

你必须保持一致:

point_type* equidistant = NULL;

这表示equidistant是指针。

extern point_type equidistant[number_of_equidistant];

这表示equidistant是一个数组。选择一个并坚持下去。

答案 1 :(得分:0)

当您使用new分配时,在此之后总是使用指针,您正在使用

extern point_type equidistant[number_of_equidistant];

你应该在哪里使用

extern point_type* equidistant;

a.cpp:

#include <iostream>

extern const int number_of_equidistant;
extern double* equidistant;
extern void debuginit();

int main()
{
    debuginit();
    for(size_t ii=0; ii<number_of_equidistant; ii++) {
        std::cerr << ii << std::endl;
    }
}

b.cpp:

extern const int number_of_equidistant = 100;
double equidistant[number_of_equidistant];

void debuginit()
{
    for(int ii=0; ii<number_of_equidistant; ii++) 
        equidistant[ii] = ii;
}

我建议你改用矢量。将长度和指针存储在一起才有意义,特别是对于全局:

我在a.cpp:

#include <vector>

const int number_of_equidistant = 100;
std::vector<double> equidistant(number_of_equidistant);

void debuginit()
{
    for(int ii=0; ii<equidistant.size(); ii++) 
        equidistant[ii] = ii;
}

和b.cpp:

#include <vector>
#include <iostream>

extern std::vector<double> equidistant;
extern void debuginit();

int main()
{
    debuginit();
    for(size_t ii=0; ii<equidistant.size(); ii++) {
        std::cerr << ii << std::endl;
    }
}

最好在main()中声明你的变量然后根据需要传递它,因为如果你知道它来自哪个变量(参数列表)而不是某个全局变量,那么查看变量就不那么容易了。不知道是否有其他人修改过。