Объявление в заголовке динамически размещаемого 2-мерного массива, не зная его размеров

Мне нужно объявить динамически размещенный двумерный массив в заголовке, не зная его размеров, который будет установлен внутри функции.

В шапке я хочу разместить:

#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 ?

… и поскольку я инициализирую его внутри функции, он будет действительно глобальным.

Может ли кто-нибудь научить меня правильный способ сделать это? Заранее спасибо !!

1

Решение

Если вы создаете новый экземпляр с тем же именем массива внутри функции, он переопределяет и скрывает верхний. Вы можете выделить внешний массив, но не создавайте новую переменную с тем же именем.

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 );

Этот фрагмент был скопирован оттуда: матрица int с указателями в C — путаница в распределении памяти

Использование:

в шапке:

#define MAX_BARS_ALLOWED 2000
extern int** Gregorian;

в cpp:

Gregorian = read_matrix(NumLastItem+1,MAX_LINES_ALLOWED);
0

В вашем заголовочном файле есть специальное определение для источника реализации. Как это:

#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;
}
-1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector