Страница 1 из 1

О многомерных массивах

Добавлено: 01 мар 2005, 17:02
buletz
Хочу написать функцию перемножения матриц переменных размерностей (т.е. заранее размерность входных матриц неизвестна) :
C = A*B ,

A=матрица i x j , B = матрица j x k , соотв-но C = матрица i x k

если у меня есть на входе только указатель на массив A и B ,
как можно определить сколько в них столбцов и сколько строк ?

есть ли такие функции в языке C ?

sizeof(A) / sizeof(A[0]) даст полное кол-во элементов, а мне нужно кол-во строк и столбцов.
помогите плз

Добавлено: 01 мар 2005, 17:12
Kolinus
sizeof(A) / sizeof(A[0]) даст тебе скорее всего единицу потому как размер указателя интового 4 байта а размер инта тоже 4 байта :)
в С таких функций нет, так что тебе придется передавать размеры дополнительно

Добавлено: 01 мар 2005, 17:19
buletz
ясно
спасибо

Добавлено: 01 мар 2005, 17:24
Kolinus
Можно конечно поступить следующим образом (в С++) - поочередно обращаться к элементам массива пока не вылетит исключение - это признак того что ты вышел за границу - но способ очень надуманный и лично я бы его не использовал - это так из разряда "очень хоцца"

Добавлено: 01 мар 2005, 17:55
WinMain
Я бы вообще не советовал этой фигнёй страдать. В интернете полно готовых реализаций на С++ объектов типа Matrix в виде классов и шаблонов со встроенными алгоритмами перемножения, транспонирования, вычисления определителей...

Добавлено: 01 мар 2005, 18:02
Kolinus
WinMain ты как всегда - есть готовое :)
согласен и поддерживаю !!!
только вопрос звучит "хочу написать", а не "млин горит помогите срочно надо..."
человек еще и удовлетворение пытается от программирования получать

Добавлено: 01 мар 2005, 18:09
Absurd
А зачем такое надо? В 3-х мерной графике например в основном используются матрицы 4x4. Очень хорошо в такой ситуации использовать не двухменый а одномерый массив и индексацию типа _arr[ (y<<2) | x ]. Циклы размером в четыре итерации компилятор Intel совершенно чудно разворачивает. Зачем делать функцию на все случаи жизни?
Язык С++ статичен по своей идеологии и писать на нем в полностью динамическом стиле (т.е чтобы все функции были широкого назначения и не знали свойств тех данных с которыми им придется работать вплоть до выполнения) несколько неразумно.
поочередно обращаться к элементам массива пока не вылетит исключение
Исключения предназначены только для исключительных ситуаций. Выход из цикла по исключению будет раз в тысячу медленней чем через break.[/quote]

Добавлено: 01 мар 2005, 18:12
Kolinus
да но фишка в том что при таком подходе мы знаем что достигли границы массива (имелся ввиду случай что она не задана)