Форум программистов, компьютерный форум CyberForum.ru

Передача в параметр многомерного массива произвольного размера - C++

Восстановить пароль Регистрация
 
 
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.03.2014, 11:52     Передача в параметр многомерного массива произвольного размера #1
Пусть, например, имеется функция
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void Gauss(double **a, double *b, size_t n, double *x)
{
 size_t i;
 size_t j;
 size_t k;
 double s;
 double kof;
 for (i=0; i<n; ++i)
 {
  for (j=i+1; j<n; ++j)
  {
   kof=a[j][i]/a[i][i];
   b[j]-=b[i]*kof;
   for (k=i; k<n; ++k)
   {
    a[j][k]-=a[i][k]*kof;
   }
  }
 }
 for (i=n-1; i<n; --i)
 {
  for (j=n-1, s=b[i]; j>i; --j)
  {
   s-=x[j]*a[i][j];
  }
  x[i]=s/a[i][i];
 }
}
, она работает, если ей скормить указатель массив указателей на строки, но
C++
1
double a[3][3];
означает совсем не это, приходится писать
C++
1
2
3
4
5
6
double a[3][3];
 double b[3];
 double x[3];
 double *pa[3]={a[0], a[1], a[2]};
 ...
 Gauss(pa, b, 3, x);
. Можно исправить на
C++
1
void Gauss(double a[3][3], double *b, double *x)
, а тройку забить в код функции, тогда можно писать
C++
1
2
3
4
5
double a[3][3];
 double b[3];
 double x[3];
 ...
 Gauss(pa, b, x);
. А как бы сделать функцию, чтоб она приняла и
C++
1
2
3
4
5
double a[3][3];
 double b[3];
 double x[3];
 ...
 Gauss(pa, b, 3, x);
и без переделок
C++
1
2
3
4
5
double a[4][4];
 double b[4];
 double x[4];
 ...
 Gauss(pa, b, 4, x);
и матрицу вообще любого другого размера?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2014, 11:52     Передача в параметр многомерного массива произвольного размера
Посмотрите здесь:

Передача многомерного массива переменного размера в функцию C++
Матрицы произвольного размера. C++
Дана целочисленная квадратная матрица произвольного размера. C++
Передача размерности массива как параметр из одной функции в другую. C++
C++ Строковый массив произвольного размера
Динамический массив произвольного размера C++
C++ Матрицу произвольного размера преобразовать в вектор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kupnu4
26 / 26 / 9
Регистрация: 03.05.2013
Сообщений: 71
19.03.2014, 12:17     Передача в параметр многомерного массива произвольного размера #2
если я правильно поянл вопрос, вам нужны динамические массивы:
C++
1
2
3
4
5
6
7
8
size_t size = 4;
double** a = new double[size];
for(int i=0; i<size;++i)
     a[i] = new double[size];
double* b = new double[size];
double* x = new double[size];
 ...
Gauss(pa, b, size, x); // void Gauss(double **a, double *b, size_t size, double *x)
в этом случае в зависимости от size будут создаваться массивы разной размерности, но всегда хорошо буду приниматься функцией
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
19.03.2014, 12:29     Передача в параметр многомерного массива произвольного размера #3
Нужно сделать преобразование аргумента в указатель.
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
19.03.2014, 12:49     Передача в параметр многомерного массива произвольного размера #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Тут была хрень.

Добавлено через 5 минут
Ну а лучше так:
C++
1
2
3
4
5
template<int n>
void Gauss(double (&a)[n][n], double (&b)[n], int size /*уже не нужен*/, double (&x)[n])
{
/* ... */
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.03.2014, 13:59  [ТС]     Передача в параметр многомерного массива произвольного размера #5
И на каждый размер отдельная строчка специализации? А без шаблона?
Ilot
Модератор
Эксперт С++
1778 / 1153 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
19.03.2014, 14:12     Передача в параметр многомерного массива произвольного размера #6
Цитата Сообщение от taras atavin Посмотреть сообщение
и матрицу вообще любого другого размера?
Вы должно быть шутите? Вы же передаете указатель на массив и в самой функции можете обращаться к ЛЮБОМУ участку памяти по смещению (он же индекс).
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.03.2014, 14:13  [ТС]     Передача в параметр многомерного массива произвольного размера #7
Цитата Сообщение от programina Посмотреть сообщение
Нужно сделать преобразование аргумента в указатель.
Указатель на массив массивов не есть указатель на массив указателей на массивы. Синтаксически привести то можно, да вот беда: самого массива указателей на массивы нет. Ну приведу я к двойному указателю. И что? Доступ к
C++
1
a[i][j]
по двойному указателю означает
C++
1
(a[i])[j]
, то есть
C++
1
(*(a+i))[j]
, то есть
C++
1
*((*(a+i))+j)
, то есть есть указатель a его значение складывается с первым индексом, умноженным на размер указателя и по полученному адресу читается указатель, значение которого складывается со вторым индексом, умноженным на размер элемента, и уже по этому адресу осуществляется доступ. А при
C++
1
double a[3][3];
C++
1
a[i][j]
означает
C++
1
*(((double*)a)+i*3+j)
, то есть есть указатель a на весь массив элементов, а не указателей на строки, его значение складывается с двумя смещениями сразу: первое - произведение первого множителя на размер строки, второе - произведение второго индекса на размер элемента и по полученному адресу читается элемент. Это принципиально другая адресация.

Добавлено через 1 минуту
Цитата Сообщение от Ilot Посмотреть сообщение
Вы должно быть шутите? Вы передаете указатель на массив и в самой функции можете обрщаться к ЛЮБОМУ участку памяти по смещению (он же индекс).
Как бы не так.
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
19.03.2014, 14:19     Передача в параметр многомерного массива произвольного размера #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от taras atavin Посмотреть сообщение
И на каждый размер отдельная строчка специализации?
?? Зачем специализация? Не нужно никакой специализации.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.03.2014, 14:20  [ТС]     Передача в параметр многомерного массива произвольного размера #9
То есть?
Ilot
Модератор
Эксперт С++
1778 / 1153 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
19.03.2014, 14:23     Передача в параметр многомерного массива произвольного размера #10
Цитата Сообщение от taras atavin Посмотреть сообщение
Как бы не так.
Я правильно понимаю. Вам нужна функция умеющая работать с массивом произвольного размера? Так?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.03.2014, 14:25  [ТС]     Передача в параметр многомерного массива произвольного размера #11
Да.
Ilot
Модератор
Эксперт С++
1778 / 1153 / 223
Регистрация: 16.05.2013
Сообщений: 3,042
Записей в блоге: 5
Завершенные тесты: 1
19.03.2014, 14:27     Передача в параметр многомерного массива произвольного размера #12
В таком случае вы сами написали решение.
C++
1
2
3
4
void Gauss(double **a, double *b, size_t n, double *x)
{
//....
}
А все остальное козе баян.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
19.03.2014, 14:30     Передача в параметр многомерного массива произвольного размера #13
taras atavin, Я могу заблуждаться, но, по-моему, Вы сами себя загоняете куда-то. Хитрый вопрос, но Вы же сами объясняете (правильность не проверял, но вроде верно) и сами решение даете:
C++
1
*(((double*)a)+i*n+j)
что мешает воспользоваться этим?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.03.2014, 14:32  [ТС]     Передача в параметр многомерного массива произвольного размера #14
И на что прога будет похожа? Правильно, на произведение недокриптографа. Да и синтаксис вызова прикинь. Каждого.
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
19.03.2014, 14:32     Передача в параметр многомерного массива произвольного размера #15
Ilot, насколько я понял о пишет про различия в смещениях указателей динамического и статического многомерных массивов. Но в целом я с Вами согласен
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
19.03.2014, 14:36     Передача в параметр многомерного массива произвольного размера #16
Цитата Сообщение от taras atavin Посмотреть сообщение
То есть?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<int n>
void Gauss(double (&a)[n][n], double (&b)[n], double (&x)[n])
{
/* ... */
}
 
int main(void)
{
    double a1[3][3]; double b1[3]; double x1[3];
    Gauss(a1, b1, x1);
    double a2[5][5]; double b2[5]; double x2[5];
    Gauss(a2, b2, x2);
}
И всё. Никаких специализаций.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.03.2014, 14:36  [ТС]     Передача в параметр многомерного массива произвольного размера #17
mustimur, а что мне мешает в конструктор класса многомерного массива завернуть
C++
1
Data=new double [n*m];
, а в оператор "квадратные скобки"
C++
1
return (double*)(Data+Index*m);
, то есть юзать тот же поход на основе линерализованного внутреннего представления массива и вычисляемого указателя на массив-элемент вместо хранимого?
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
19.03.2014, 14:41     Передача в параметр многомерного массива произвольного размера #18
Цитата Сообщение от taras atavin Посмотреть сообщение
Да и синтаксис вызова прикинь. Каждого.
Засуньте в функцию эту "криптографию" и дальше используйте ее, а дешево и сердито вряд ли получиться, я так и отказался от многомерных в пользу одномерных и сейчас проблем не знаю (правда причина другая чем у Вас), они отрабатываются идентично...

Добавлено через 3 минуты
Пока решение John Prick предлагает внятное, а Вы уперлись в стену, сами всё знаете, но ничего предпринять не хотите, хотя все козыри у Вас
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.03.2014, 14:45  [ТС]     Передача в параметр многомерного массива произвольного размера #19
John Prick, а сколько в этом:
Цитата Сообщение от John Prick Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<int n>
void Gauss(double (&a)[n][n], double (&b)[n], double (&x)[n])
{
/* ... */
}
int main(void)
{
 double a1[3][3]; double b1[3]; double x1[3];
 Gauss(a1, b1, x1);
 double a2[5][5]; double b2[5]; double x2[5];
 Gauss(a2, b2, x2);
}
примере будет экземпляров кода функции Gauss? Два, или один?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 14:55     Передача в параметр многомерного массива произвольного размера
Еще ссылки по теме:

Квадратная матрица произвольного размера C++
Объект произвольного размера через new C++
Перемножить матрицы произвольного размера C++
C++ Передача в функцию многомерного массива
динамическое создание двумерного массива и передача его как параметр функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
John Prick
755 / 688 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
19.03.2014, 14:55     Передача в параметр многомерного массива произвольного размера #20
Два. Как и у любой шаблонной функции, вызываемой с разными параметрами шаблона.
У вас есть какие-то ограничения по объёму кода?
Yandex
Объявления
19.03.2014, 14:55     Передача в параметр многомерного массива произвольного размера
Ответ Создать тему
Опции темы

Текущее время: 11:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru