Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
#1

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

19.03.2014, 11:52. Просмотров 833. Ответов 29
Метки нет (Все метки)

Пусть, например, имеется функция
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);
и матрицу вообще любого другого размера?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.03.2014, 11:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Передача в параметр многомерного массива произвольного размера (C++):

Передача многомерного массива переменного размера в функцию - C++
Как в с передается в функцию многомерный массив, чья размерность определеяется &quot;по ходу дела&quot;. Вариант в фортране: ... call...

Передача в функцию многомерного массива - C++
Как передать в функцию многомерный массив, если неизвестна его размерность. С двумерным я делал это вот так: void SomeFunc(int *array,...

Передача массива структур в функцию не указывая размера массива - C++
Я читаю с командной строки файл в котором содержится массив структур. Есть библиотека с функцией в которую я прередаю файл и массив...

Передача размерности массива как параметр из одной функции в другую. - C++
Вообщем написал программу. Всё работает как надо, кроме одного, никак не могу сделать чтобы размерность массива, которая вводится в &quot;main&quot;...

динамическое создание двумерного массива и передача его как параметр функции - C++
Здравствуйте, подскажите пожалуйста, как можно передать параметром динамически созданный массив в функцию. Желательно пример. Буду очень...

Матрицы произвольного размера. - C++
Помогите пожалуйста написать программу, которая будет работать с матрицами произвольного размера. необходимо определить для матриц операции...

29
John Prick
821 / 754 / 152
Регистрация: 27.07.2012
Сообщений: 2,147
Завершенные тесты: 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);
}
И всё. Никаких специализаций.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
19.03.2014, 14:36  [ТС] #17
mustimur, а что мне мешает в конструктор класса многомерного массива завернуть
C++
1
Data=new double [n*m];
, а в оператор "квадратные скобки"
C++
1
return (double*)(Data+Index*m);
, то есть юзать тот же поход на основе линерализованного внутреннего представления массива и вычисляемого указателя на массив-элемент вместо хранимого?
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
19.03.2014, 14:41 #18
Цитата Сообщение от taras atavin Посмотреть сообщение
Да и синтаксис вызова прикинь. Каждого.
Засуньте в функцию эту "криптографию" и дальше используйте ее, а дешево и сердито вряд ли получиться, я так и отказался от многомерных в пользу одномерных и сейчас проблем не знаю (правда причина другая чем у Вас), они отрабатываются идентично...

Добавлено через 3 минуты
Пока решение John Prick предлагает внятное, а Вы уперлись в стену, сами всё знаете, но ничего предпринять не хотите, хотя все козыри у Вас
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
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? Два, или один?
0
John Prick
821 / 754 / 152
Регистрация: 27.07.2012
Сообщений: 2,147
Завершенные тесты: 3
19.03.2014, 14:55 #20
Два. Как и у любой шаблонной функции, вызываемой с разными параметрами шаблона.
У вас есть какие-то ограничения по объёму кода?
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
19.03.2014, 14:57  [ТС] #21
А как бы обойтись одним экземпляром, но получающим n в параметре?
0
John Prick
821 / 754 / 152
Регистрация: 27.07.2012
Сообщений: 2,147
Завершенные тесты: 3
19.03.2014, 15:05 #22
Никак. Уменьшить объём кода можно, например, так:
C++
1
2
3
4
5
6
7
8
9
10
void Gauss(double *a, double *b, double *x, int size)
{
    /* индекс вычислять вручную */
}
 
template<int n>
void Gauss(double (&a)[n][n], double (&b)[n], double (&x)[n])
{
    Gauss(&a[0][0], b, x, n);
}
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
19.03.2014, 15:54  [ТС] #23
Цитата Сообщение от John Prick Посмотреть сообщение
Никак. Уменьшить объём кода можно, например, так:
void Gauss(double *a, double *b, double *x, int size)
{
* * /* индекс вычислять вручную */
}
1. Возня с линерализацией на каждом обращении. Да, прочитать можно будет всё равно, так что секреты так не спрячешь, но отлично спрячутся ошибки и мне самому придётся каждый раз тратить время на "расшифровку" и повторное "шифрование", почему и произведение именно недокритографа.
2. Приведение при каждом вызове.
3. Прощай самодокументированность прототипов. Для данных каких типов данных предназначена функция? А какой именно параметр - матрица? Ладно, иксы от свободных членов можно разделить, превратив функцию в
C++
1
doube *Gauss(double *a, double *b, size_t n);
. А какой из параметров - матрица, а какой - свободные члены? Если двумерный массив, одномерный и size_t, то двумерный - матрица, одномерный - свободные члены, а size_t - количество уравнений. А когда оба одномерны?
0
John Prick
821 / 754 / 152
Регистрация: 27.07.2012
Сообщений: 2,147
Завершенные тесты: 3
19.03.2014, 15:58 #24
Беда-беда. Но есть нормальные способы всего этого избежать.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
19.03.2014, 15:59  [ТС] #25
Какие? Именно одним экземпляром.
0
John Prick
821 / 754 / 152
Регистрация: 27.07.2012
Сообщений: 2,147
Завершенные тесты: 3
19.03.2014, 16:00 #26
Вместо двумерного массива использовать что-нибудь более интеллектуальное и функциональное.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
19.03.2014, 16:03  [ТС] #27
Это что же интересно? Шаблон не подходит не только из-за размера. Главное в нём то, что версии генерятся только статически и не получится той же функции скормить динамический линерализованный массив какого-нибудь третьего размера на явном указателе, к чему его ни приводи.
0
John Prick
821 / 754 / 152
Регистрация: 27.07.2012
Сообщений: 2,147
Завершенные тесты: 3
19.03.2014, 16:04 #28
Да всё что угодно. Хоть готовые классы, хоть самописные.
Вы пишете на С++, здесь, в отличии от С, есть много всего полезного.
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
19.03.2014, 16:05  [ТС] #29
Эйси. Обычный массив той же функции не скормишь. Получается или класс матриц, или обычный массив.
0
John Prick
821 / 754 / 152
Регистрация: 27.07.2012
Сообщений: 2,147
Завершенные тесты: 3
19.03.2014, 16:13 #30
Тогда пишите перегруженные функции.
Вы хотите одну функцию на все случаи жизни?
0
19.03.2014, 16:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 16:13
Привет! Вот еще темы с ответами:

Квадратная матрица произвольного размера - C++
Не понимаю массивы, помогите пожалуйста написать программу формирующую произвольного размера исходную квадратную матрицу. 1)Умножить в...

Объект произвольного размера через new - C++
Хочу создать объект в динамической памяти так, чтобы 1) был вызван конструктор объекта, 2) размер объекта задавался в момент создания...

Строковый массив произвольного размера - C++
Можно ли каким-то образом образом написать программу, в которой будет вводиться строковый массив произвольной длины? Если бы это был...

Динамический массив произвольного размера - C++
динамический массив заданного размера: int *massiv = new int а как организовать произвольного размера? спасибо.


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.