1

我需要在头文件中声明一个动态分配的二维数组,而不知道它的维度,这将在函数内部建立。

在我要放置的标题中:

#define MAX_BARS_ALLOWED 20000
extern int Gregorian[][MAX_LINES_ALLOWED];  //it works

.cpp文件中,在函数内部:

int **Gregorian=new int*[NumLastItem+1][MAX_LINES_ALLOWED];  //this does NOT work, why ?

...并且由于我在函数中对其进行了初始化,因此它是否真的是全局的。

任何人都可以教我正确的方法吗?先感谢您 !!

4

3 回答 3

0

这是我最喜欢在堆上声明可变大小矩阵的方法:在每一行的末尾分配一个额外的元素,以便知道边界在哪里(有点像 C 风格的字符串)。

int** read_matrix(int size_x, int size_y)
{
    int** matrix;
    matrix = calloc(size_x, 1+sizeof(int*)); // alloc one extra ptr
    for(int i = 0;i<size_x;i++) {
        matrix[i] = calloc(size_y, sizeof(int));
    }
    matrix[size_x] = NULL; // set the extra ptr to NULL

    /* populate the matrix if needed
    for(int i = 0;i<size_x;i++) {
        for(int j = 0;j<size_y;j++) {
            matrix[i][j] = i*10+j;
        }
    }
    */
    return matrix;
}

// keep looping until you find the NULL one
for( int i=0; first_matrix[i] != NULL; i++ ) {
    free( first_matrix[i] );
}
free( first_matrix );

这个片段是从那里复制的:带有 C 指针的 int 矩阵 - 内存分配混乱

用法:

在标题中:

#define MAX_BARS_ALLOWED 2000
extern int** Gregorian;

在 cpp 中:

Gregorian = read_matrix(NumLastItem+1,MAX_LINES_ALLOWED);
于 2013-05-22T09:36:14.770 回答
0

如果您在函数内创建具有相同名称的数组的新实例,它将覆盖并隐藏上一个。您可以分配外部数组,但不要创建具有相同名称的新变量。

于 2013-05-22T09:36:39.020 回答
-1

在您的头文件中,对实现源有一个特殊的定义。像这样:

#ifndef ARRAY_HEADER_HPP
#define ARRAY_HEADER_HPP 1

#ifdef ARRAY_IMPL
#define extern // remove extern for implementation
#endif

#define MAX_LINES_ALLOWED 20000
extern int **Georgian;

#ifdef ARRAY_IMPL
#undef extern
#endif

#endif // ARRAY_HEADER_HPP

然后在分配数组的地方包含这样的标题

#define ARRAY_IMPL
#include "array_header.hpp"

void alloc_array(){
    Georgian = new int*[var+1];
    for(size_t n = 0; n < (var+1); n++)
        Georgian[n] = new int[MAX_LINES_ALLOWED];
}

void dealloc_array(){
    for(size_t n = 0; n < (var+1); n++)
        delete[] Georgian[n];
    delete[] Georgian;
}
于 2015-06-30T07:11:11.413 回答