Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 12
1

Есть функция с кучей аргументов, как её вызвать в другой функции (если половины аргументов у меня нет)?

02.12.2012, 20:05. Просмотров 1142. Ответов 13
Метки нет (Все метки)

Я конечно, понимаю, что на такие вопросы отвечают "почитай книжку". Я читала, честное слово
Конкретно.
Есть функция
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void jacobi ( const unsigned int n, double * const * a, double * d, double * const * v )
/* Вот что про jacobi пишут:
Метод Якоби предназначен для вычисления собственных значений и векторов 
симметричных матриц. Этот алгоритм я взял из "Справочника алгоритмов 
на языке Алгол" ( Уилкинсон, Райнш ) и переписал его на С++. 
Идея метода Якоби состоит в том, чтобы обнулять недиагональные элементы 
вращениями до тех пор, пока они все не обнулятся и получится диагональная матрица. 
После каждого вращения сумма квадратов внедиагональных элементов уменьшается, 
что приводит к сходимости процесса диагональности. В данном алгоритме в первых 
трёх проходах по матрице используется порог tresh ( обнуляются элементы большие 
по модулю, чем порог ), а в следующих проходах обнуляются все элементы подряд. 
Проходов делается не больше 50. В программе: a - это исходная матрица (n*n), 
d - массив (n) cобственных значений, v - массив собственных векторов 
(n указателей на массивы). Переменные c и s - это cos и sin угла поворота. 
В процессе работы наддиагональные элементы будут изменены, но их можно 
восстановить по поддиагональным.*/
,

есть другая фукция (не main), в которой получается массив
C++
1
2
3
 double a[3][3]={{ixx, ixy, ixz}, // массив[ряд][колонка]
                  {ixy, iyy, iyz},
                  {ixz, iyz, izz}};
Очень хотелось бы этот массив сразу после того, как он получился, запихнуть в jacobi. Но если написать сразу после массива
C++
1
2
3
4
5
6
7
{...
...
  double a[3][3]={{ixx, ixy, ixz}, // массив[ряд][колонка]
                  {ixy, iyy, iyz},
                  {ixz, iyz, izz}};
jacobi(3, a);
}
то это не действует. (И не действует не только это...)
Вопрос: как в списке аргументов правильно записать а?
И как записать остальные аргументы, которых у меня нет и быть не может? (потому что они считаются как раз в самой jacobi)

Заранее большое спасибо.

Добавлено через 5 часов 44 минуты
Или хотя бы в какой книжке написано то, что здесь нужно?..
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.12.2012, 20:05
Ответы с готовыми решениями:

Как вызвать функцию чужого приложения, как подменить значения аргументов функции?
собственно вопрос первый: мне нужно каким то образом из своей программы/библиотеки вызвать...

Странное расположение в памяти аргументов функции с неизвестным количество аргументов
Не могу понять, почему такая программа не работает, выдавая segmentation fault после распечатки...

Выполнить расчет функции от двух аргументов при заданных законах изменения аргументов
Выполнить расчет функции от двух аргументов при заданных законах изменения аргументов. Все значения...

Выполнить расчет функции от двух аргументов при заданных законах изменения аргументов
Выполнить расчет функции от двух аргументов при заданных законах изменения аргументов. Все значения...

13
24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
02.12.2012, 20:09 2
Можете заранее указать эти аргументы
C++
1
2
3
4
5
6
7
например
void func (int a=5, int b=3, int c=3);
 
main()
{
func (10, 5);// тут а стало 10 (вместо 3), b стало 5 (вместо 3), c осталось = 3
}
0
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 12
02.12.2012, 20:35  [ТС] 3
MaRKerNSK, пример ясен. а вот в функции jacobi так можно поступить только с const unsigned int n (знаю, что n будет равно трём).
А как поступить с массивом? Про него же не напишешь в аргументах типа double a = {1,2,3,4,5}...
0
24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
02.12.2012, 20:37 4
НУ тут можно через разные партотипы функций, можно сделать глобальный масив, а можно обьявить масси с заданными параметрами внутри функции...
0
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 12
02.12.2012, 21:01  [ТС] 5
А можно ссылку на книжку?

Цитата Сообщение от MaRKerNSK Посмотреть сообщение
а можно обьявить массив с заданными параметрами внутри функции...
- внутри какой функции? Той самой, куда его надо впихнуть? Проблема в том, что в массив должны входить значения переменных, которые получаются в той функции, где он впервые объявлен.
То есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 функция2(аргументы) //это jacobi
{
        тут проводятся манипуляции с массивом а
}
 
функция1()
{
       ...
       тут сначала ищутся ixx, ixy, iyy и т.д.;
 
       double a = {ixx, iyy, ixy и т.д.};
 
       функция2(???)
}
Добавлено через 2 минуты
И как тут можно использовать прототип?
0
24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
02.12.2012, 21:03 6
Molchunja, Ну дак если ты отправляешь массив на переработку то зачем тебе за его определять?
вот и отпраляй его в функцию а там делай с ним чего душе угодно)) или в чём проблема?

Добавлено через 1 минуту
Цитата Сообщение от Molchunja Посмотреть сообщение
И как тут можно использовать прототип?
Почитайте в интернете, гугл в помощь на эту тему инфы море, я не хочу сейчас тут расписывать выдержки из учебников и статей, извините если не угодил)
0
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 12
02.12.2012, 21:05  [ТС] 7
Цитата Сообщение от MaRKerNSK Посмотреть сообщение
вот и отпраляй его в функцию
Вот с этим-то и проблема!
Как его туда впихнуть?
0
24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
02.12.2012, 21:11 8
а понятно вы е знаете как отправлять массив в функцию то тут просто

C++
1
2
3
4
5
6
7
8
void func (int *arr, int size)
 
int main (void)
{
int array[5];
func (array, 5);
return 0;
}
0
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 12
02.12.2012, 21:18  [ТС] 9
Цитата Сообщение от MaRKerNSK Посмотреть сообщение
func (array, 5);
ну, я вроде так и пишу...
Цитата Сообщение от Molchunja Посмотреть сообщение
jacobi(3, a)
но не работает. А не работает, наверное, потому, что массив у меня double a, а функция jacobi ожидает
Цитата Сообщение от Molchunja Посмотреть сообщение
const unsigned int n, double * const * a,
.
Если в функции jacobi поменять соответствующий аргумент, она перестаёт работать. А как так записать массив, чтобы его описание было похоже на double * const * a, не представляю.

З.Ы. Поменять что-либо в функции jacobi не вариант, потому что она длинная и сложная, а я программирую четвёртый день в жизни.
0
24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
02.12.2012, 21:21 10
Ну так и обьявляй массив Double
C++
1
double array[5];
0
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 12
02.12.2012, 21:27  [ТС] 11
Цитата Сообщение от Molchunja Посмотреть сообщение
double a[3][3]
Именно так и делаю...
0
24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
02.12.2012, 21:34 12
А так что вы не сказали что у вас двумерный масив... с ними по другому
C++
1
2
3
4
5
6
7
в функцию так передовать
void func (double array[][10], int size);
 
main (void) 
{
double arr[10][10];
func (arr, 10);
Добавлено через 53 секунды
В данном случае проще использовать вектор) =)
0
0 / 0 / 0
Регистрация: 01.12.2012
Сообщений: 12
03.12.2012, 00:06  [ТС] 13
Почему же? Сказала...
В самом первом моём сообщении всё написано: и что массив двумерный, и что в функцию его нельзя передать так, как вы пишете (при замене "double * const * a" на "double a[][3]" функция не работает).

Что за вектор?
0
24 / 11 / 0
Регистрация: 26.11.2012
Сообщений: 110
Записей в блоге: 2
03.12.2012, 00:20 14
Ну сори у мен сейчас 3 часа ночи))) не заметил)) а вектор это
C++
1
2
3
4
5
6
7
8
9
#include <vector>
void  func(std::vector<std::vector<double>>arr);
 
main()
{
std::vector<std::vector<double>>array(10, std::vector<int>(5)) //аналаг double [10][5]
 func (array);
return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.12.2012, 00:20

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Отсутствуют экземпляры перегруженная функция "pow", соответствующие списку аргументов типы аргументов: (<unknown-type>, double)
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;iostream&gt; int main() { double x, y, z, a, b;...

Если функция не принимает аргументов, то принято ли писать в её заголовке void?
Если функция не принимает аргументов, то принято ли писать в её заголовке void? Например, вместо:...

Обьясните почему нет аргументов в функции
Есть интересный кусок кода, но не понятно почему функции: MyFunction, MyDerivative. My2Derivative,...

Нет перегруженной функции, принимающей 2 аргументов
Оговорюсь сразу, что я новичок в программировании, надеюсь на Вашу помощь. Базовый класс:...

Рекурсивная функция и передача аргументов функции
Помогите пожалуйста!!!!! Пропустила занятие, а разобраться не получается!!!!!!!!А нужно на...

Thread C2893. Хотя аргументов у вызываемой функции нет
Это код, где вызывается thread: void CChatClientDlg::OnBnClickedBtnSendMessage() { if...


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

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

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