Размер матрицы C ++ в зависимости от ввода не компилируется - PullRequest
0 голосов
/ 22 октября 2010

есть тема об этой теме, которая работает с массивами, но я не могу заставить ее работать с матрицами.

(Тема: Размер массива C ++, зависящий от параметра функции, вызывает ошибки компиляции )

В итоге:

  long rows, columns;
  cin >> rows >> columns;
  char *a = new char [rows];    

отлично компилируется в visual studio, но:

  char **a = new char[rows][columns]; 

или

  char *a[] = new char[rows][columns];

или

  char *a[] = new char[rows][columns]();

или

  char **a = new char[rows][columns]();

вообще не компилируется.

Любая помощь? Спасибо

Ответы [ 3 ]

4 голосов
/ 22 октября 2010

Оператор array-new выделяет только одномерные массивы. Существуют разные решения, в зависимости от того, какую структуру массива вы хотите. Для измерений, известных только во время выполнения, вы можете создать массив массивов:

char **a = new char*[rows];
for (int i = 0; i < rows; ++i) {
    a[i] = new char[columns];
}

или массив элементов со связанным массивом указателей на первый элемент каждой строки (требующий только двух попаданий в распределитель памяти):

char *a = new char[rows*columns];
char **a = new char*[rows];
for (int i = 0; i < rows; ++i) {
    a[i] = a + i*columns;
}

Любой из них позволит вам получить доступ к элементам матрицы через a[row][column].

Альтернативное решение - просто использовать одномерный массив и генерировать индексы вручную:

char *a = new char[rows*columns];
...
a[columns*row + column]

Это, вероятно, быстрее, чем двойное косвенное обращение, требуемое в первых двух решениях.

Конечно, вы можете обернуть это в классе, чтобы сохранить подобие синтаксиса двумерного индексирования:

class MatrixWrapper {
    ...
    char& operator()(int row, int column) { return a_[columns*row + column]; }
    ...
};
...
a(row, column)
1 голос
/ 22 октября 2010

n-мерный массив не может быть выделен напрямую, как вы пытаетесь. Вот способ сделать это.

int main(){
    unsigned int **p;
    unsigned int rows = 10;
    unsigned int cols = 20;

    p = new unsigned int* [rows];

    for(size_t row = 0; row < rows; row++){
        p[row] = new unsigned int [cols];
    }

    for(size_t row = 0; row < rows; row++){
        delete [] p[row];
    }

    delete [] p;
}
0 голосов
/ 22 октября 2010

Если вы собираетесь использовать c-массивы в c ++ (вместо std :: vector), вы застряли, делая что-то вроде этого:

long rows    = 0;
long columns = 0;
cin >> rows >> columns;

// declaration
long** a = new long* [rows];
for(long i = 0; i < rows; ++i)
{
    a[i] = new long[cols];
}

// initialization
for(long j = 0; j < rows; ++j)
{
    for(long i = 0; i < rows; i++)
    {
        a[i][j] = 0;
    }
}

// delete sub-arrays
for(long i = 0; i < rows; ++i)
{
    delete[] a[i];
}

// delete array
delete[] a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...