Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли передать указатель на часть массива? 
:(
    Опции темы
chaoss
Дата 16.5.2008, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.4.2008

Репутация: нет
Всего: нет



У меня есть большой трехмерный динамический массив:
Код

double*** A;
A=new double**[SIZE1];
for(int i=0;i<SIZE1;i++)
{
A[i]=new double*[SIZE2];
}
for(int i=0;i<SIZE1;i++)
{
for(int j=0;j<SIZE2;j++)
{
A[i][j]=new double[SIZE3];
}
}

Есть некоторая функция:
Код

void Function(double* arr)
{
...
}

Как видно, эта функция принимает указатель на массив. Функция определенным образом заполняет данный массив.
Требуется передать в эту функцию часть от большого массива А для того, чтобы функция изменила эту часть.
Например, надо взять элементы массива с индексами A[m][...][n], где m,n - фиксированы, а ... означает все допустимые индексы, кроме первого и последнего (то есть кроме 0 и SIZE2-1) и эти элементы передать в функцию. То есть помимо необходимости "вырезать" один слой встает необходимость от этого слоя "откусить" один элемент слева и один справа и это уже передать в функцию.

Сделать это с введением дополнительной переменной не сложно. Просто делается одномерный массив:
Код

double* temp;
temp=new double[SIZE2-2];

К этому массиву применяется функция, а затем цикл заполнения:
Код

for(int i=0;i<SIZE2-1;i++)
{
A[m][i+1][n]=temp[i];
}


Но для этого нужно выделять дополнительную память, тратить время (очень важное для расчета) на перегонку значений массивов. Нельзя ли все же сразу, как я описал выше, передать в функцию нужную часть массива?
PM   Вверх
Rififi
Дата 16.5.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



"часть  массива" передать нельзя.
можно передать специальную конструкцию, которая будет итерировать массив по определенным правилам (стандартного решения нет, нужно реализовывать самому)
PM MAIL   Вверх
JackYF
Дата 16.5.2008, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Почему бы не передать один указатель и просто использовать в функции нужную часть? smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 16.5.2008, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



chaoss, 
линеализировать трехмерный массив

Добавлено через 55 секунд
Цитата(JackYF @  16.5.2008,  18:23 Найти цитируемый пост)
Почему бы не передать один указатель и просто использовать в функции нужную часть?

потому как сигнатура double *, а не double **


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 16.5.2008, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Цитата(MAKCim @  16.5.2008,  17:34 Найти цитируемый пост)
потому как сигнатура double *, а не double ** 

Брр...

Код

void func(double*** arr, int m, int n)
{
  for (int i = 1; i < SIZE1 - 1; ++i)
  {
    std::cout << arr[m][i][n];
  }
}

ы?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
MAKCim
Дата 16.5.2008, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



JackYF, 
Цитата(chaoss @  16.5.2008,  16:45 Найти цитируемый пост)
Есть некоторая функция:

Цитата(chaoss @  16.5.2008,  16:45 Найти цитируемый пост)
Как видно, эта функция принимает указатель на массив




--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 17.5.2008, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



MAKCim, понял. Ну, если нет возможности изменить функцию, тогда хуже smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Dov
Дата 17.5.2008, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(chaoss @  16.5.2008,  15:45 Найти цитируемый пост)
К этому массиву применяется функция, а затем цикл заполнения:


chaoss, а как ты передаёшь размер массива в функцию? 

Если размер нужного массива указан в теле функции, то вызываешь так:
Код
Function(&A[m][0][n]);


Функция должна обработать этот массив до нужного размера.
Например так:
Код
void Function(double* arr)
{
// ...
    for(int i = 1; i < SIZE2 - 1; i++)
        arr[i * SIZE3] = 999;
//...    
}


Добавлено @ 18:19
Для наглядности приведу пример:
Код

#define SIZE1 3
#define SIZE2 5
#define SIZE3 4

void Function(double* arr)
{
//...
    for(int i = 1; i < SIZE2 - 1; i++)
        arr[i * SIZE3] = 999;
//...        
}

int main()
{
    double A[SIZE1][SIZE2][SIZE3] = {0};
    
    int m = 2;
    int n = 1;

    Function(&A[m][0][n]);

    for(int i = 0; i < SIZE1; i++)
    {
        for(int j = 0; j < SIZE2; j++)
        {
            for(int h = 0; h < SIZE3; h++)
            {
                cout << setw(5) << A[i][j][h];
            }
            cout << endl;
        }
        cout << endl;
    }    

    return 0;
}


Для динамического массива так же должно быть, имхо.

Это сообщение отредактировал(а) Dov - 17.5.2008, 18:21


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
MAKCim
Дата 17.5.2008, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Dov @  17.5.2008,  18:10 Найти цитируемый пост)
Для динамического массива так же должно быть, имхо.

нет


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
chaoss
Дата 17.5.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 29.4.2008

Репутация: нет
Всего: нет



Цитата(Dov @ 17.5.2008,  18:10)
chaoss, а как ты передаёшь размер массива в функцию? 

В функцию я передаю размер массива. Я не знаю, знакомы Вы с вычислительной математикой или нет, но там есть такой метод решения систем линейных уравнений, называется "прогонка". Моя функция как раз реализует этот алгоритм. 
Функция получает на вход три массива коэффициентов (одномерные массивы равного размера), размер массива, массив (в смысле указатель) куда должен записываться результат. На основе коэффициентов ищется решение, которое записывается по переданному указателю.
Особенность состоит в том, что мне надо применять этот алгоритм не ко всему массиву, а к вырезанному куску (без краев, если графически это представить), плюс к тому сам массив не одномерный, а трехмерный и мне надо из этого трехмерного массива вырезать одномерные линейные куски и применять к каждому из них алгоритм. Собственно стараюсь добиться максимальной скорости и минимальной необходимой памяти.
PM   Вверх
Dov
Дата 18.5.2008, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(MAKCim @ 17.5.2008,  17:49)
Цитата(Dov @  17.5.2008,  18:10 Найти цитируемый пост)
Для динамического массива так же должно быть, имхо.

нет

Что нет? 

Код

#define SIZE1 3
#define SIZE2 5
#define SIZE3 4

void Function(double* arr)
{
    for(int i = 1; i < SIZE2 - 1; i++)
        arr[i * SIZE3] = 999;    
}

int main()
{
    double (*A)[SIZE2][SIZE3];
    int value = 0;

    //Выделение памяти из кучи.
    A = new double[SIZE1][SIZE2][SIZE3];

   //Заполнение массива.
    for(int i = 0; i < SIZE1; i++)
        for(int j = 0; j < SIZE2; j++)
            for(int k = 0; k < SIZE3; k++)
                 A[i][j][k] = ++value;    
    
    int m = 2;
    int n = 1;

    Function(&A[m][0][n]);

    for(int i = 0; i < SIZE1; i++)
    {
        for(int j = 0; j < SIZE2; j++)
        {
            for(int h = 0; h < SIZE3; h++)
            {
                cout << setw(5) << A[i][j][h];
            }
            cout << endl;
        }
        cout << endl;
    }

    //Возврат памяти в кучу.
    delete [] A;

    return 0;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
mes
Дата 18.5.2008, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Dov @  18.5.2008,  00:27 Найти цитируемый пост)
Что нет? 

Цитата(chaoss @  16.5.2008,  16:45 Найти цитируемый пост)
надо взять элементы массива с индексами A[m][...][n], где m,n - фиксированы, а ... означает все допустимые индексы, 


часть массива A[m][...][n]  не линейна


--------------------
PM MAIL WWW   Вверх
Dov
Дата 18.5.2008, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(mes @  18.5.2008,  00:30 Найти цитируемый пост)
часть массива A[m][...][n]  не линейна


Это почему?  Смотри пример.



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
MAKCim
Дата 18.5.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(Dov @  18.5.2008,  08:21 Найти цитируемый пост)
Это почему?  Смотри пример.

посмотри, как создается массив у mes 
кроме того, где в стандарте написано, что многомерные массивы должны линеализироваться именно таким образом?

Это сообщение отредактировал(а) MAKCim - 18.5.2008, 10:04


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Dov
Дата 18.5.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



Цитата(MAKCim @  18.5.2008,  09:02 Найти цитируемый пост)
посмотри, как создается массив у mes 

Ничего не вижу...  smile 

Цитата(MAKCim @  18.5.2008,  09:02 Найти цитируемый пост)
кроме того, где в стандарте написано, что многомерные массивы должны линеализироваться именно таким образом?

MAKCim, о стандарте в вопросе ничего не сказано. Кто хочет, пусть читает стандарты... smile 
Вот вопрос chaoss`а:
 Можно ли передать указатель на часть массива? 
Вот мой ответ:
Можно. (см. примеры).  smile 

Всё. Остальное - сплошная болтовня, имхо.  smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0634 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.