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

Поиск:

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


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


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

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



Цитата(Dov @  18.5.2008,  12:17 Найти цитируемый пост)
 (см. примеры).

Цитата(Rififi @  16.5.2008,  17:31 Найти цитируемый пост)
"часть  массива" передать нельзя.
можно передать специальную конструкцию, которая будет итерировать массив по определенным правилам (стандартного решения нет, нужно реализовывать самому) 

Цитата(Dov @  18.5.2008,  00:27 Найти цитируемый пост)
void Function(double* arr)
{
    for(int i = 1; i < SIZE2 - 1; i++)
        arr[i * SIZE3] = 999;    
}

Dov, это как раз одна из тех конструкций итерации, о которой говорил Riffi

Цитата(chaoss @  17.5.2008,  20:02 Найти цитируемый пост)
В функцию я передаю размер массива...Функция получает на вход три массива коэффициентов (одномерные массивы равного размера)

Цитата(JackYF @  17.5.2008,  10:34 Найти цитируемый пост)
Ну, если нет возможности изменить функцию, тогда хуже

Dov, а на основе этих строчек как теперь с примером? чтоб функция ничего не знала о массиве и получала только его кусок ))

Это сообщение отредактировал(а) mes - 18.5.2008, 14:46


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


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


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

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



Цитата(mes @  18.5.2008,  11:58 Найти цитируемый пост)
Dov, а на основе этих строчек как теперь с примером? чтоб функция ничего не знала о массиве и получала только его кусок ))


mes, практически любая функция должна знать размер массива, переданный, как параметр или, как глобальная переменная или каким-то другим путём. Иначе функция не сможет правильно работать с этим массивом. 

А вообще, неплохо было бы взглянуть на эту функцию..  smile 


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


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


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

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



Цитата(Dov @  18.5.2008,  14:08 Найти цитируемый пост)
практически любая функция должна знать размер массива, переданный, как параметр или,

дело в том что функция составлена для одного типа массива, а автор топика хочет применить к другому.. В том виде в каком автор описал, задача решения в лоб не имеет. Для обходного решения подходы в теме озвучены, но для более точного примера требуется более детальное представление о текущей задаче. Например непонятно всегда ли куски массива будут вырезаться из одного измерения или нет, а также доподлино неизвестана возможность перепроектировки функции. Так что без дальнейшей информации,
Цитата(Dov @  18.5.2008,  12:17 Найти цитируемый пост)
Остальное - сплошная болтовня, имхо.   smile   


Это сообщение отредактировал(а) mes - 18.5.2008, 14:48


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


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


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

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



Цитата(Dov @  18.5.2008,  12:17 Найти цитируемый пост)
MAKCim, о стандарте в вопросе ничего не сказано

хорошая отмазка  smile 


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

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


Опытный
**


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

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



Цитата(chaoss @  16.5.2008,  18:45 Найти цитируемый пост)
Но для этого нужно выделять дополнительную память, тратить время (очень важное для расчета) на перегонку значений массивов. Нельзя ли все же сразу, как я описал выше, передать в функцию нужную часть массива?

Существует 2 варианта решения проблемы :
1. Переписывается тело функции так, чтобы она реализовывала логику выборки непоследовательно расположенных в памяти элементов исходного массива.
2. Для каждого вызова функции создается отдельный массив с линейным расположением элементов.
Я бы посоветовал первый.
Цитата(MAKCim @  17.5.2008,  20:49 Найти цитируемый пост)
Цитата(Dov @  17.5.2008,  18:10 )    
Для динамического массива так же должно быть, имхо.
нет

Dov имеет в виду динамический массив с последовательным расположением элементов. Для него, действительно, будет так же.
Цитата(mes @  18.5.2008,  03:30 Найти цитируемый пост)
часть массива A[m][...][n]  не линейна

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

Где создается массив у mes я тоже не вкурил. Видимо, это простая невнимательность и имеется в виду chaoss.
А на счет стандарта, это по-моему, через чур. Есть конкретный пример компилятора для которого такой массив будет нелинейным? Такой компилятор необходим топистартеру?

PM MAIL   Вверх
mes
Дата 19.5.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dizzy1984 @  19.5.2008,  10:59 Найти цитируемый пост)
Где создается массив у mes я тоже не вкурил

у меня массив не создается 


Цитата(dizzy1984 @  19.5.2008,  10:59 Найти цитируемый пост)
Она не линейна у топикстартера, у Dov'а она линейна.

никто не спорит что весь массив линейный или нет.. рассматривается только избранная его часть, определенная в начале теме.
под словом линейно подразумевается также, что эллементы массива располагаются непосредстевенно друг за другом  и можно пройти массив посредством  ++ итерации, чего не может предоставить часть массива A[m][...][n] (как минимум нужно передавать шаг итерации), а именно ее хочет передать автор в функцию..




Это сообщение отредактировал(а) mes - 19.5.2008, 15:12


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


Эксперт
****


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

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



Код

class Array {
double* data;
int size, step;
public:
Array(double* _data, int _size, int _step) { size = _size; step = _step; data = _data; }
double& get (int x) { return data[x*step]; }
int getSize() { return size; }
};
class Array3D {
double* data;
int sizeX, sizeY, sizeZ;
public:
Array3D(int _sizeX, int _sizeY, int _sizeZ) { sizeX = _sizeX; sizeY = _sizeY; sizeZ = _sizeZ; data = new data[sizeX*sizeY*sizeZ]; }
~Array3D() { delete data; }
double& get (int x, int y, int z) { return data[(x*sizeY+y)*sizeZ+z]; }
Array getColumnXY(int x, int y) { return Array(data+(x*sizeY+y)*sizeZ, sizeZ, 1); }
Array getColumnXZ(int x, int z) { return Array(data+x*sizeY*sizeZ+z, sizeY, sizeZ); }
Array getColumnYZ(int y, int z) { return Array(data+y*sizeZ+z, sizeX, sizeY*sizeZ); }
};
void function(Array a);

Array3D a3d(10,10,10);
a3d.get(5,5,5) = 1.0;
function(a3d.getColumnXZ(5,5));
double d = a3d.get(5,5,5);


Это сообщение отредактировал(а) math64 - 19.5.2008, 14:50
PM   Вверх
JackYF
Дата 19.5.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



math64, уж легче boost::array взять, чем своё городить, нет? smile


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


Опытный
**


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

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



Цитата(mes @  19.5.2008,  15:04 Найти цитируемый пост)
никто не спорит что весь массив линейный или нет.. 

Ну значит мы по-разному поняли тему спора. Прочитав ответ от 18.5.2008, 03:30, где приводится цитата ответа MAKCim, я пришел к выводу что защищается его версия, в которой понятие "динамический" стало синонимом "непоследовательный в памяти", что не всегда верно.
Пока решения такие :
Rififi предложил переписать функцию
Dov предложил переписать функцию и изменить представление данных
math64 предложил переписать функцию и изменить представление данных
PM MAIL   Вверх
mes
Дата 20.5.2008, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(dizzy1984 @  20.5.2008,  05:59 Найти цитируемый пост)
в которой понятие "динамический" стало синонимом "непоследовательный в памяти", что не всегда верно

Непоследовательный в памяти динамический многомерный массив, а в приведенном приммере у Dov динамическая часть массива одномерна.

Цитата(dizzy1984 @  20.5.2008,  05:59 Найти цитируемый пост)
Пока решения такие :

math64 без слов и споров  сделал всю черную работу по представлению 3х-мерного массива линианизированным по любому измерению. Респект. ИМХО остальные предложения сводятся к одной из модификаций такого решения .




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


Бывалый
*


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

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



что за шаманство?
Цитата

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

Цитата

Функция получает на вход три массива коэффициентов (одномерные массивы равного размера), размер массива, массив (в смысле указатель) куда должен записываться результат. На основе коэффициентов ищется решение, которое записывается по переданному указателю.

непонятно зачем в прогонке трехмерный массив?
если я правильно помню, то прогонка - это метод с трехдиагональной матрицей...трехдиагональная она не потому что трехмерная, а потому что у нее на диагонали и в соседних с диагональю клеточках не нули, тоесть как бы три дагоналиsmile ну а раз это матрица то естественно она двумерная
когда то я делал эти лабы, но они у меня не проименованы, тоесть есть программы, а какая что выполняет я уже не помню, ну так глянул, возможно это программа которая тебе нужна:
Код
 /*----------------------INCLUDES---------------------*/
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
/*-------------------procedures----------------------*/
void output(float A[5][5],int tn,int tm){
    int i,j;
    for(i=0;i<tn;i++){
        printf("|");
        for(j=0;j<tm;j++){
            if(A[i][j]>=0)
                printf(" ");
            if(A[i][j]<0)
                printf("");
            printf("%1.1f |",A[i][j]);
        }
        printf("\n");
    }
}    
void output(float A[5],int tn){
    int i;
    for(i=0;i<tn;i++){
        printf("|");
        if(A[i]>=0)
            printf(" ");
        if(A[i]<0)
            printf("");
        printf("%1.3f |",A[i]);
    }
}
void main(){
    float A[5][5]=
    {{1,-1,0,0,0},{2,10,-5,0,0},{0,-3,8,2,0},{0,0,1,-12,-7},{0,0,0,-5./6,1}},
    Y[5]={4,109,-30,-48,25./6},Z[5],B[5],a[5],K[5],V[5],C[5];
    int n=5,i;
    for(i=0;i<n;i++){
        Z[i]=0;C[i]=0;B[i]=0;a[i]=0;V[i]=0;K[i]=0;
    }
    K[0]=-A[0][1];
    K[n-1]=-A[n-1][n-2];
    V[0]=Y[0];
    V[n-1]=Y[n-1];
    for(i=0;i<n;i++){
        B[i]=A[i][i+1];
        a[i]=A[i][i-1];
        C[i]=-A[i][i];
    }
    for(i=1;i<n-1;i++){
        K[i]=B[i]/(C[i]-(a[i]*K[i-1]));
        V[i]=((a[i]*V[i-1])-Y[i])/(C[i]-(a[i]*K[i-1]));
    }
    Z[n-1]=(V[n-1]+K[n-1]*V[n-2])/(1-(K[n-1]*K[n-2]));
    for(i=n-2;i>=0;i--)
        Z[i]=K[i]*Z[i+1]+V[i];
    float s=0;
    printf("\n\nFind errors^\n");
    output(Z,n);
    for(int j=0;j<n;printf("\n%d: %3.5f",j+1,s-Y[j]),s=0,j++)
        for(i=0;i<n;i++)
            s+=A[j][i]*Z[i];
    getch();
}

ну конечно вполне может быть, что в этой программе есть ошибки, потому что помнится правил я их прям когда сдавал...
------
и насчет:
Цитата

Можно ли передать указатель на часть массива?

я думаю что УКАЗАТЕЛЬ надо передавать все же на его начало, и вместе с указателем передавать переменные, отвечающие за то - какую часть массива надо использовать. Думаю делать надо именно так хотя бы для улудшения читабельности.

Это сообщение отредактировал(а) rrrFer - 20.5.2008, 12:49
PM MAIL WWW ICQ   Вверх
baldina
Дата 20.5.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



JackYF, 
Цитата

math64, уж легче boost::array взять, чем своё городить, нет?  

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


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


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

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



Цитата(baldina @  20.5.2008,  12:20 Найти цитируемый пост)
boost::multi_array 

Да, именно. Точное название лень было смотреть smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0625 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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