Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

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

19.03.2014, 11:52. Показов 2294. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.03.2014, 11:52
Ответы с готовыми решениями:

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

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

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

29
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.03.2014, 14:57  [ТС]
Студворк — интернет-сервис помощи студентам
А как бы обойтись одним экземпляром, но получающим n в параметре?
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
19.03.2014, 15:05
Никак. Уменьшить объём кода можно, например, так:
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
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.03.2014, 15:54  [ТС]
Цитата Сообщение от 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
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
19.03.2014, 15:58
Беда-беда. Но есть нормальные способы всего этого избежать.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.03.2014, 15:59  [ТС]
Какие? Именно одним экземпляром.
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
19.03.2014, 16:00
Вместо двумерного массива использовать что-нибудь более интеллектуальное и функциональное.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.03.2014, 16:03  [ТС]
Это что же интересно? Шаблон не подходит не только из-за размера. Главное в нём то, что версии генерятся только статически и не получится той же функции скормить динамический линерализованный массив какого-нибудь третьего размера на явном указателе, к чему его ни приводи.
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
19.03.2014, 16:04
Да всё что угодно. Хоть готовые классы, хоть самописные.
Вы пишете на С++, здесь, в отличии от С, есть много всего полезного.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
19.03.2014, 16:05  [ТС]
Эйси. Обычный массив той же функции не скормишь. Получается или класс матриц, или обычный массив.
0
2393 / 1913 / 763
Регистрация: 27.07.2012
Сообщений: 5,557
19.03.2014, 16:13
Тогда пишите перегруженные функции.
Вы хотите одну функцию на все случаи жизни?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.03.2014, 16:13
Помогаю со студенческими работами здесь

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

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

Ввести с клавиатуры значение массива А (100) произвольного размера н, где н <100. Сформировать двумерный массив С (10; 1
Ввести с клавиатуры значение массива А (100) произвольного размера н, где н &lt;100. Сформировать двумерный массив С (10, 10) занося в него по...

Строка произвольного размера
Можно ли как-то сделать, чтобы изначально не задавать длину массива (строки)? #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru