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

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
buletz
Сообщения: 22
Зарегистрирован: 01 мар 2005, 16:54

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

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

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

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

sizeof(A) / sizeof(A[0]) даст полное кол-во элементов, а мне нужно кол-во строк и столбцов.
помогите плз
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

sizeof(A) / sizeof(A[0]) даст тебе скорее всего единицу потому как размер указателя интового 4 байта а размер инта тоже 4 байта :)
в С таких функций нет, так что тебе придется передавать размеры дополнительно
В SAD - все в SAD.
buletz
Сообщения: 22
Зарегистрирован: 01 мар 2005, 16:54

ясно
спасибо
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

Можно конечно поступить следующим образом (в С++) - поочередно обращаться к элементам массива пока не вылетит исключение - это признак того что ты вышел за границу - но способ очень надуманный и лично я бы его не использовал - это так из разряда "очень хоцца"
В SAD - все в SAD.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Я бы вообще не советовал этой фигнёй страдать. В интернете полно готовых реализаций на С++ объектов типа Matrix в виде классов и шаблонов со встроенными алгоритмами перемножения, транспонирования, вычисления определителей...
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

WinMain ты как всегда - есть готовое :)
согласен и поддерживаю !!!
только вопрос звучит "хочу написать", а не "млин горит помогите срочно надо..."
человек еще и удовлетворение пытается от программирования получать
В SAD - все в SAD.
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

А зачем такое надо? В 3-х мерной графике например в основном используются матрицы 4x4. Очень хорошо в такой ситуации использовать не двухменый а одномерый массив и индексацию типа _arr[ (y<<2) | x ]. Циклы размером в четыре итерации компилятор Intel совершенно чудно разворачивает. Зачем делать функцию на все случаи жизни?
Язык С++ статичен по своей идеологии и писать на нем в полностью динамическом стиле (т.е чтобы все функции были широкого назначения и не знали свойств тех данных с которыми им придется работать вплоть до выполнения) несколько неразумно.
поочередно обращаться к элементам массива пока не вылетит исключение
Исключения предназначены только для исключительных ситуаций. Выход из цикла по исключению будет раз в тысячу медленней чем через break.[/quote]
2B OR NOT(2B) = FF
Kolinus
Сообщения: 449
Зарегистрирован: 23 авг 2004, 14:02
Откуда: Минск

да но фишка в том что при таком подходе мы знаем что достигли границы массива (имелся ввиду случай что она не задана)
В SAD - все в SAD.
Ответить