![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| chaoss |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.4.2008 Репутация: нет Всего: нет |
У меня есть большой трехмерный динамический массив:
Есть некоторая функция:
Как видно, эта функция принимает указатель на массив. Функция определенным образом заполняет данный массив. Требуется передать в эту функцию часть от большого массива А для того, чтобы функция изменила эту часть. Например, надо взять элементы массива с индексами A[m][...][n], где m,n - фиксированы, а ... означает все допустимые индексы, кроме первого и последнего (то есть кроме 0 и SIZE2-1) и эти элементы передать в функцию. То есть помимо необходимости "вырезать" один слой встает необходимость от этого слоя "откусить" один элемент слева и один справа и это уже передать в функцию. Сделать это с введением дополнительной переменной не сложно. Просто делается одномерный массив:
К этому массиву применяется функция, а затем цикл заполнения:
Но для этого нужно выделять дополнительную память, тратить время (очень важное для расчета) на перегонку значений массивов. Нельзя ли все же сразу, как я описал выше, передать в функцию нужную часть массива? |
||||||||
|
|||||||||
| Rififi |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1254 Регистрация: 9.3.2008 Репутация: 11 Всего: 36 |
"часть массива" передать нельзя.
можно передать специальную конструкцию, которая будет итерировать массив по определенным правилам (стандартного решения нет, нужно реализовывать самому) |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Почему бы не передать один указатель и просто использовать в функции нужную часть?
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
chaoss,
линеализировать трехмерный массив Добавлено через 55 секунд
потому как сигнатура double *, а не double ** -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Брр...
ы? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
JackYF,
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
MAKCim, понял. Ну, если нет возможности изменить функцию, тогда хуже
|
|||
|
||||
| Dov |
|
||||||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
chaoss, а как ты передаёшь размер массива в функцию? Если размер нужного массива указан в теле функции, то вызываешь так:
Функция должна обработать этот массив до нужного размера. Например так:
Добавлено @ 18:19 Для наглядности приведу пример:
Для динамического массива так же должно быть, имхо. Это сообщение отредактировал(а) Dov - 17.5.2008, 18:21 -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
||||||
|
|||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| chaoss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 29.4.2008 Репутация: нет Всего: нет |
В функцию я передаю размер массива. Я не знаю, знакомы Вы с вычислительной математикой или нет, но там есть такой метод решения систем линейных уравнений, называется "прогонка". Моя функция как раз реализует этот алгоритм. Функция получает на вход три массива коэффициентов (одномерные массивы равного размера), размер массива, массив (в смысле указатель) куда должен записываться результат. На основе коэффициентов ищется решение, которое записывается по переданному указателю. Особенность состоит в том, что мне надо применять этот алгоритм не ко всему массиву, а к вырезанному куску (без краев, если графически это представить), плюс к тому сам массив не одномерный, а трехмерный и мне надо из этого трехмерного массива вырезать одномерные линейные куски и применять к каждому из них алгоритм. Собственно стараюсь добиться максимальной скорости и минимальной необходимой памяти. |
|||
|
||||
| Dov |
|
||||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Что нет?
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
-------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
посмотри, как создается массив у mes кроме того, где в стандарте написано, что многомерные массивы должны линеализироваться именно таким образом? Это сообщение отредактировал(а) MAKCim - 18.5.2008, 10:04 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
Ничего не вижу...
MAKCim, о стандарте в вопросе ничего не сказано. Кто хочет, пусть читает стандарты... Вот вопрос chaoss`а: Можно ли передать указатель на часть массива? Вот мой ответ: Можно. (см. примеры). Всё. Остальное - сплошная болтовня, имхо. -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Dov, это как раз одна из тех конструкций итерации, о которой говорил Riffi
Dov, а на основе этих строчек как теперь с примером? чтоб функция ничего не знала о массиве и получала только его кусок )) Это сообщение отредактировал(а) mes - 18.5.2008, 14:46 |
||||
|
|||||
| Dov |
|
|||
![]() аСинизатор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1721 Регистрация: 10.5.2003 Где: Эрец-Исраэль Репутация: 15 Всего: 88 |
mes, практически любая функция должна знать размер массива, переданный, как параметр или, как глобальная переменная или каким-то другим путём. Иначе функция не сможет правильно работать с этим массивом. А вообще, неплохо было бы взглянуть на эту функцию.. -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
дело в том что функция составлена для одного типа массива, а автор топика хочет применить к другому.. В том виде в каком автор описал, задача решения в лоб не имеет. Для обходного решения подходы в теме озвучены, но для более точного примера требуется более детальное представление о текущей задаче. Например непонятно всегда ли куски массива будут вырезаться из одного измерения или нет, а также доподлино неизвестана возможность перепроектировки функции. Так что без дальнейшей информации, Это сообщение отредактировал(а) mes - 18.5.2008, 14:48 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| dizzy1984 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 3 Всего: 25 |
Существует 2 варианта решения проблемы : 1. Переписывается тело функции так, чтобы она реализовывала логику выборки непоследовательно расположенных в памяти элементов исходного массива. 2. Для каждого вызова функции создается отдельный массив с линейным расположением элементов. Я бы посоветовал первый.
Dov имеет в виду динамический массив с последовательным расположением элементов. Для него, действительно, будет так же. Она не линейна у топикстартера, у Dov'а она линейна.
Где создается массив у mes я тоже не вкурил. Видимо, это простая невнимательность и имеется в виду chaoss. А на счет стандарта, это по-моему, через чур. Есть конкретный пример компилятора для которого такой массив будет нелинейным? Такой компилятор необходим топистартеру? |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
у меня массив не создается никто не спорит что весь массив линейный или нет.. рассматривается только избранная его часть, определенная в начале теме. под словом линейно подразумевается также, что эллементы массива располагаются непосредстевенно друг за другом и можно пройти массив посредством ++ итерации, чего не может предоставить часть массива A[m][...][n] (как минимум нужно передавать шаг итерации), а именно ее хочет передать автор в функцию.. Это сообщение отредактировал(а) mes - 19.5.2008, 15:12 |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Это сообщение отредактировал(а) math64 - 19.5.2008, 14:50 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
math64, уж легче boost::array взять, чем своё городить, нет?
|
|||
|
||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 3 Всего: 25 |
Ну значит мы по-разному поняли тему спора. Прочитав ответ от 18.5.2008, 03:30, где приводится цитата ответа MAKCim, я пришел к выводу что защищается его версия, в которой понятие "динамический" стало синонимом "непоследовательный в памяти", что не всегда верно. Пока решения такие : Rififi предложил переписать функцию Dov предложил переписать функцию и изменить представление данных math64 предложил переписать функцию и изменить представление данных |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Непоследовательный в памяти динамический многомерный массив, а в приведенном приммере у Dov динамическая часть массива одномерна. math64 без слов и споров сделал всю черную работу по представлению 3х-мерного массива линианизированным по любому измерению. Респект. ИМХО остальные предложения сводятся к одной из модификаций такого решения . |
|||
|
||||
| rrrFer |
|
||||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 208 Регистрация: 11.5.2008 Где: Красноярск Репутация: 1 Всего: 1 |
что за шаманство?
непонятно зачем в прогонке трехмерный массив? если я правильно помню, то прогонка - это метод с трехдиагональной матрицей...трехдиагональная она не потому что трехмерная, а потому что у нее на диагонали и в соседних с диагональю клеточках не нули, тоесть как бы три дагонали когда то я делал эти лабы, но они у меня не проименованы, тоесть есть программы, а какая что выполняет я уже не помню, ну так глянул, возможно это программа которая тебе нужна:
ну конечно вполне может быть, что в этой программе есть ошибки, потому что помнится правил я их прям когда сдавал... ------ и насчет:
я думаю что УКАЗАТЕЛЬ надо передавать все же на его начало, и вместе с указателем передавать переменные, отвечающие за то - какую часть массива надо использовать. Думаю делать надо именно так хотя бы для улудшения читабельности. Это сообщение отредактировал(а) rrrFer - 20.5.2008, 12:49 |
||||||||
|
|||||||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 32 Всего: 101 |
JackYF,
boost::multi_array |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Да, именно. Точное название лень было смотреть |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |