Как мне сделать указатель на многомерный массив, который имеет неизвестный размер? - PullRequest
1 голос
/ 09 февраля 2009

как мне сделать указатель на многомерный массив, который имеет неизвестный размер? Я пробовал это:

int **triangles;

triangles = new int[numTriangles][3];

Но я получаю эту ошибку:

cannot convert 'int (*)[3]' to 'int**' in assignment

Ответы [ 4 ]

4 голосов
/ 09 февраля 2009

Для этого вам придется перебрать одно измерение и выделить место для другого измерения:

int** triangles;
triangles = new int*[NUMROWS];

for (int i = 0; i < NUMROWS; i++) {
   triangles[i] = new int[NUMCOLS];
}

Но будьте осторожны при этом, вам придется сделать то же самое, чтобы освободить память.

for (int i = 0; i < NUMROWS; i++) {
   delete [] triangles[i];
   triangles[i] = 0;
}
delete [] triangles;
triangles = 0;
4 голосов
/ 09 февраля 2009

Что ж, в сообщении об ошибке говорится это :) Если вы создаете новый массив, то new возвращает указатель на его первый элемент.

Многомерный массив - это просто еще одно имя для массива массивов. Вы обновили массив int[3], и точно их количество. Итак, что нового делает, это возвращает указатель на int[3]. Переменная, которой вы присваиваете результат, должна иметь этот тип, который является указателем на массив из 3 целых чисел:

int (*triangles)[3];
triangles = new int[numTriangles][3];
triangles[triangleIndex][vertexIndex] = 42;

Конечно, здесь также помогают typedefs:

typedef int triangles_t[3];
triangles_t * triangles = new int[numTriangles][3];

Скобки необходимы из-за правил приоритета C ++. Они сообщают компилятору, что он создает не массив из трех указателей на целые числа, а указатель на массив из трех целых чисел. Это похоже на более распространенное использование указателей на функции ("void (*funptr)()") ...

4 голосов
/ 09 февраля 2009
triangles = new int[numTriangles*3];

Затем получите к нему доступ:

triangles[numTriangles*triangleIndex+vertexIndex] = blah;

Но это утомительно и подвержено ошибкам, поэтому я предлагаю вместо этого использовать boost.multi_array или использовать свое собственное (действительно простое):

template<class T>
class Matrix {
public:
    Matrix(int _w, int _h) : data(_w*_h), w(_w), h(_h) {
    }

    T      & operator()(int x, int y)       { return data[y * w + x]; }
    T const& operator()(int x, int y) const { return data[y * w + x]; }

private:
    std::vector<T> data;
    int w, h;
};

// usage:
int main() {
    Matrix<float> triangles(numTriangles, 3);
    triangles(triangleIndex, vertexIndex) = blah;
}

Если, с другой стороны, вам нужен массив треугольников, а не двумерный массив, просто используйте vector<Triangle>, где Triangle - это класс:)

1 голос
/ 09 февраля 2009

Многомерные массивы в C ++ - просто синтаксический сахар.

int a[n][m];

эквивалентно

int a[n*m];

так что вам просто нужен обычный указатель - т.е.

int *triangles;
triangles = new int[numTriangles*3];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...