![]() |
|
Модераторы: 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`а: Можно ли передать указатель на часть массива? Вот мой ответ: Можно. (см. примеры). Всё. Остальное - сплошная болтовня, имхо. -------------------- Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |