| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Можно ли передать указатель на часть массива? |
| Автор: chaoss 16.5.2008, 16:45 | ||||||||
У меня есть большой трехмерный динамический массив:
Есть некоторая функция:
Как видно, эта функция принимает указатель на массив. Функция определенным образом заполняет данный массив. Требуется передать в эту функцию часть от большого массива А для того, чтобы функция изменила эту часть. Например, надо взять элементы массива с индексами A[m][...][n], где m,n - фиксированы, а ... означает все допустимые индексы, кроме первого и последнего (то есть кроме 0 и SIZE2-1) и эти элементы передать в функцию. То есть помимо необходимости "вырезать" один слой встает необходимость от этого слоя "откусить" один элемент слева и один справа и это уже передать в функцию. Сделать это с введением дополнительной переменной не сложно. Просто делается одномерный массив:
К этому массиву применяется функция, а затем цикл заполнения:
Но для этого нужно выделять дополнительную память, тратить время (очень важное для расчета) на перегонку значений массивов. Нельзя ли все же сразу, как я описал выше, передать в функцию нужную часть массива? |
| Автор: Rififi 16.5.2008, 17:31 |
| "часть массива" передать нельзя. можно передать специальную конструкцию, которая будет итерировать массив по определенным правилам (стандартного решения нет, нужно реализовывать самому) |
| Автор: JackYF 16.5.2008, 18:23 |
| Почему бы не передать один указатель и просто использовать в функции нужную часть? |
| Автор: JackYF 16.5.2008, 19:11 | ||
Брр...
ы? |
| Автор: MAKCim 16.5.2008, 19:31 |
| JackYF, |
| Автор: JackYF 17.5.2008, 10:34 |
| MAKCim, понял. Ну, если нет возможности изменить функцию, тогда хуже |
| Автор: Dov 17.5.2008, 18:10 | ||||||
chaoss, а как ты передаёшь размер массива в функцию? Если размер нужного массива указан в теле функции, то вызываешь так:
Функция должна обработать этот массив до нужного размера. Например так:
Добавлено @ 18:19 Для наглядности приведу пример:
Для динамического массива так же должно быть, имхо. |
| Автор: MAKCim 17.5.2008, 18:49 |
нет |
| Автор: chaoss 17.5.2008, 20:02 | ||
В функцию я передаю размер массива. Я не знаю, знакомы Вы с вычислительной математикой или нет, но там есть такой метод решения систем линейных уравнений, называется "прогонка". Моя функция как раз реализует этот алгоритм. Функция получает на вход три массива коэффициентов (одномерные массивы равного размера), размер массива, массив (в смысле указатель) куда должен записываться результат. На основе коэффициентов ищется решение, которое записывается по переданному указателю. Особенность состоит в том, что мне надо применять этот алгоритм не ко всему массиву, а к вырезанному куску (без краев, если графически это представить), плюс к тому сам массив не одномерный, а трехмерный и мне надо из этого трехмерного массива вырезать одномерные линейные куски и применять к каждому из них алгоритм. Собственно стараюсь добиться максимальной скорости и минимальной необходимой памяти. |
| Автор: Dov 18.5.2008, 00:27 | ||||
Что нет?
|
| Автор: mes 18.5.2008, 01:30 | ||
часть массива A[m][...][n] не линейна |
| Автор: Dov 18.5.2008, 08:21 |
Это почему? Смотри пример. |
| Автор: MAKCim 18.5.2008, 10:02 |
посмотри, как создается массив у mes кроме того, где в стандарте написано, что многомерные массивы должны линеализироваться именно таким образом? |
| Автор: Dov 18.5.2008, 12:17 | ||
Ничего не вижу...
MAKCim, о стандарте в вопросе ничего не сказано. Кто хочет, пусть читает стандарты... Вот вопрос chaoss`а: Можно ли передать указатель на часть массива? Вот мой ответ: Можно. (см. примеры). Всё. Остальное - сплошная болтовня, имхо. |
| Автор: mes 18.5.2008, 12:58 | ||||||
Dov, это как раз одна из тех конструкций итерации, о которой говорил Riffi
Dov, а на основе этих строчек как теперь с примером? чтоб функция ничего не знала о массиве и получала только его кусок )) |
| Автор: Dov 18.5.2008, 14:08 | ||
mes, практически любая функция должна знать размер массива, переданный, как параметр или, как глобальная переменная или каким-то другим путём. Иначе функция не сможет правильно работать с этим массивом. А вообще, неплохо было бы взглянуть на эту функцию.. |
| Автор: mes 18.5.2008, 14:46 | ||
дело в том что функция составлена для одного типа массива, а автор топика хочет применить к другому.. В том виде в каком автор описал, задача решения в лоб не имеет. Для обходного решения подходы в теме озвучены, но для более точного примера требуется более детальное представление о текущей задаче. Например непонятно всегда ли куски массива будут вырезаться из одного измерения или нет, а также доподлино неизвестана возможность перепроектировки функции. Так что без дальнейшей информации, |
| Автор: MAKCim 18.5.2008, 16:55 |
хорошая отмазка |
| Автор: dizzy1984 19.5.2008, 10:59 | ||||||
Существует 2 варианта решения проблемы : 1. Переписывается тело функции так, чтобы она реализовывала логику выборки непоследовательно расположенных в памяти элементов исходного массива. 2. Для каждого вызова функции создается отдельный массив с линейным расположением элементов. Я бы посоветовал первый.
Dov имеет в виду динамический массив с последовательным расположением элементов. Для него, действительно, будет так же. Она не линейна у топикстартера, у Dov'а она линейна.
Где создается массив у mes я тоже не вкурил. Видимо, это простая невнимательность и имеется в виду chaoss. А на счет стандарта, это по-моему, через чур. Есть конкретный пример компилятора для которого такой массив будет нелинейным? Такой компилятор необходим топистартеру? |
| Автор: mes 19.5.2008, 13:04 |
у меня массив не создается никто не спорит что весь массив линейный или нет.. рассматривается только избранная его часть, определенная в начале теме. под словом линейно подразумевается также, что эллементы массива располагаются непосредстевенно друг за другом и можно пройти массив посредством ++ итерации, чего не может предоставить часть массива A[m][...][n] (как минимум нужно передавать шаг итерации), а именно ее хочет передать автор в функцию.. |
| Автор: math64 19.5.2008, 14:48 | ||
|
| Автор: JackYF 19.5.2008, 16:04 |
| math64, уж легче boost::array взять, чем своё городить, нет? |
| Автор: dizzy1984 20.5.2008, 05:59 |
Ну значит мы по-разному поняли тему спора. Прочитав ответ от 18.5.2008, 03:30, где приводится цитата ответа MAKCim, я пришел к выводу что защищается его версия, в которой понятие "динамический" стало синонимом "непоследовательный в памяти", что не всегда верно. Пока решения такие : Rififi предложил переписать функцию Dov предложил переписать функцию и изменить представление данных math64 предложил переписать функцию и изменить представление данных |
| Автор: mes 20.5.2008, 09:18 | ||
Непоследовательный в памяти динамический многомерный массив, а в приведенном приммере у Dov динамическая часть массива одномерна. math64 без слов и споров сделал всю черную работу по представлению 3х-мерного массива линианизированным по любому измерению. Респект. ИМХО остальные предложения сводятся к одной из модификаций такого решения . |
| Автор: rrrFer 20.5.2008, 09:51 | ||||||||
что за шаманство?
непонятно зачем в прогонке трехмерный массив? если я правильно помню, то прогонка - это метод с трехдиагональной матрицей...трехдиагональная она не потому что трехмерная, а потому что у нее на диагонали и в соседних с диагональю клеточках не нули, тоесть как бы три дагонали когда то я делал эти лабы, но они у меня не проименованы, тоесть есть программы, а какая что выполняет я уже не помню, ну так глянул, возможно это программа которая тебе нужна:
ну конечно вполне может быть, что в этой программе есть ошибки, потому что помнится правил я их прям когда сдавал... ------ и насчет:
я думаю что УКАЗАТЕЛЬ надо передавать все же на его начало, и вместе с указателем передавать переменные, отвечающие за то - какую часть массива надо использовать. Думаю делать надо именно так хотя бы для улудшения читабельности. |
| Автор: baldina 20.5.2008, 13:20 | ||
JackYF,
boost::multi_array |
| Автор: JackYF 20.5.2008, 15:44 |
Да, именно. Точное название лень было смотреть |