const int QwMatrixWidth = 20;
const int QwMatrixHeight = 20;
QwMatrixElement QwMatrix[QwMatrixHeight][QwMatrixWidth];
void QwDrawMatrix(QwMatrixElement** matrix, int n, int m) {
//Производятся операции над элементами матрицы
}
Сегодня просто какой-то парад уникумов на ЛОРе. Ты знаешь, что статически аллоцированный T[][] и динамически аллоцированный Т** по-разному лежат в памяти?
Может я не правильно задал вопрос. Смысл в том, чтобы задавать размер матрицы (например из GUI, const надо убрать), и чтобы функция принимала этот новый размер и учитывала при операциях с матрицей внутри своего тела.
Нет под рукой компилятора, тогда попробуй объявить QwMatrixElement** matrix и динамически выделить,все равно придется делать, это приколы компилятора, явное преобразование типов работало вроде как всегда.
Смысл в том, чтобы задавать размер матрицы (например из GUI, const надо убрать)
В том виде, в котором оно сейчас, массив по размерам, идущим из GUI, ты не создашь, и убирание const тут не спасёт.
Память тебе надо выделять динамически, как вариант - сначала под массив указателей, потом заполнить его указателями уже на массивы объектов. Получим тот же самый T** (в данном случае - QwMatrixElement**).
Чтобы не таскать за этим указателем ещё две переменных, число строк и столбцов соответственно, для этого дела можно написать простейший шаблонный класс с перегруженным оператором [].
Прочитай хоть какую-нибудь более менне приличную книжку по С++.
У реального двухмерного массива адреса в памяти нет, то бишь указателя ?
зы. у меня браузер рисует Т и два квадратика - это реально ..., там что под квадратами ?
это скобки что ли ?
как обычно, tailgunner единственный, кто не упоротым заходит в dev.
Ты должен передать размерности. Как это принято в Си++ - не знаю, но можно набыдлить элементарную обертку:
Всё правильно, если готового класса нет, то так и его велосипедят. Си++ — он же весь про то, как в очередной раз навелосипедить класс строк и класс матрицы.
Но можно и не париться и просто передать вектор векторов, да (jagged array). Если именно физическое расположение в памяти не критично и требования производительности не заставлябют из этого куска кода выжиматьв сё до последнего такта.
Разве доступ к элементу i,j в Т*[] не работает как *(base + i*rows + j)?
Всё-таки C++ как электрон — неисчерпаемый источник лулзов знаний.
rows у тебя компилятор волшебным образом должен угадать?
Попробуй скомпилировать
int f(int* v[])
{
return v[0][0];
}
и подумать: если этот пример скомпилировался, то что этот факт может значить? Можно кончено просто спецификацию языка почитать, но раз присутствующие её не читали, то уже поздно. Так что думаем своей головой.
Какой нафиг «размер строки»? Весь пойнт использования T** в том, чтобы размер строки не таскать.
Обращение arr[ i][j] к T *arr[] - это (*(arr+i) + j), заметь косвенность, которой у тебя нет ни в примере, ни в хотфиксе. Почитай уже приличный учебник по Си. Блин, да хоть какой-нибудь почитай.