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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.79
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
#1

Вызов функции - C++

25.10.2009, 14:24. Просмотров 7055. Ответов 10
Метки нет (Все метки)

Арифметические операции с длинными числами, которые представлены в виде массивов:

есть функция умножения двух длинных чисел multiplication.
Собственно, сабж:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 int multiplication ( array<int>^ U, array<int>^V, array<int>^W )
{
// здесь умножение U на V и результат пишется в W
return 0;
}
 
// Как бы возведение числа U в степень V... результат в W
int involution (array<int>^U, int V, array<int>^W )
{
W=U;
for(int j = 1; j < V; j++)
{
 multiplication(U,W,W);
}
return 0;
}

Например:
C++
1
2
3
array<int>^ A = { 0x1, 0x1 };
array<int>^ C;
int D = 4;
Далее вызываем функцию involution следующим образом
C++
1
involution(A,D,C);
Проблема в том, что функция multiplication не возвращает результат... хотя внутри функции подсчет производится правильно.
В чем ошибка???
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2009, 14:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов функции (C++):

Вызов функции внутри другой функции с передачей локальной переменной по ссылке - C++
Столкнулся с очень с интересной проблемой. Можно ли так делать? #include &lt;iostream&gt; using std::cout; void f(const int &amp;ref){...

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель) - C++
#include &lt;iostream&gt; using namespace std; template &lt;class T1&gt; class mas { public: T1 n; T1 a; void input() ...

Вызов функции в параметре другой функции - C++
программа: #include &lt;iostream&gt; using namespace std; struct E { E() {} }; void f(const E&amp; e)

Вызов функции в возврате значения функции - C++
Есть функция: int function1(a) { ...... return function2(function1(b),function1(c)); } Как работает такая хитрая система?

вызов функции из под функции - C++
Добрый вечер. Такая ситуация: есть функция, назовем ее MainThreadFunc. Как можно сделать так, чтобы любая другая функция, которую я напишу,...

Вызов функции - C++
Привет всем. Вот такая структура кода: void Sailary() void SetShop() void SetMenu() void ResetData() int main()

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
25.10.2009, 14:31 #2
я на CLR не писал или как оно там ) ну вобще
вот тебе примеры
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int multiplication ( int a, int b)
{
 int c = a+b ;
 return c;
} 
вызов 
 int a = multiplication ( 2, 2);
 std::cout<<a;
 
 
void func()
{
 std::cout<<"gg";
}
вызов
func();
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.10.2009, 14:38  [ТС] #3
Дело в том, что возвращаемое значение фукции через return зарезервированно для обработки ошибок (возвращаться будут коды ошибок), необходимо, чтобы результат вернулся иным способом. То есть в виде аргумента функции.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 14:39 #4
По ссылке/указателю.
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.10.2009, 16:17  [ТС] #5
Но почему у меня в другой операции все работает таким же образом:

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
29
30
31
32
33
34
35
36
37
// Умножение длинного числа на простое число: V < b, где b - система счисления.
int simpleMultiplication ( array<int>^U, int V, array<int>^W )
{
    int j = 0;
    int t = 0;
    int n = 0;
    int k = 0;
    int b = 16;
 
    n = U->Length;
    
    W->Resize(W,n);
 
    for ( j = 0; j < n; j++ )
    {
        t = U[j]*V + k;
        k = t/b;
        W[j] = t - k*b;
    }
 
    if ( k != 0 )
    {
        W->Resize(W,n+1);
        W[j] = k;
    } 
 
    return 0;
}
 
int division ( array<int>^ U, array<int>^V, array<int>^W )
{
    simpleMultiplication(U,d,U);
 
// <...>
 
    return 0;
}
Число U умножается на простое число d и результат записывается в U.
Все работает, как часы

Добавлено через 35 минут
Кажется какой трабл происходит именно в функции умножения, ибо путем многочисленых экспериментов выяснено, что все остальные функции возвращают значения, а умножение требует определить длину результирующего массива как n+1, где n - действительная длина результирующего числа.

Добавлено через 2 минуты
Код функции, смысл работы аналогичен: число U умножается на число V и результат записывается в W.
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
29
30
31
32
33
34
35
36
int multiplication ( array<int>^ U, array<int>^V, array<int>^W )
{
    int j = 0;
    int k = 0;
    int i = 0;
    int n = 0;
    int m = 0;
    int t = 0;
    int b = 16;
    
    n = U->Length;
    m = V->Length;
    
    W->Resize(W,n+m);
    
    for ( j = 0; j < n; j++ )
    {
        k = 0;
        for ( i = 0; i < m; i++ )
        {
            t = U[j]*V[i] + W[j+i] + k;
            k = t/b;
            W[j+i] = t - k*b;
        }
        W[j+i] = k;
    }
    
    j = n + m - 1;
    while ( (j > 0) && (W[j] == 0) )
    {
        j--;
    }
    W->Resize(W,j+1);
 
    return 0;
}
Добавлено через 56 минут
Ребята, я в отчаянии, что делать?!
Дело в теле функции точно. Проверено. Что может влиять таким образом???
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 16:18 #6
Цитата Сообщение от fasked Посмотреть сообщение
Ребята, я в отчаянии, что делать?
Будь это С++, я бы ответил.
Цитата Сообщение от niXman Посмотреть сообщение
По ссылке/указателю.
А в этом ЯП, хз*
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.10.2009, 16:28  [ТС] #7
Будь это С++, я бы ответил.
Что Вас заставило думать, будто это не С++ ???
Всего лишь немного "нечистый"

Тем более здесь сплошная математика...
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 16:31 #8
Цитата Сообщение от fasked Посмотреть сообщение
Что Вас заставило думать, будто это не С++ ???
То, что не один поддерживающий стандарт С++ компилятор, не откомпилирует это код.

В общем не знаю что за язык, но если он поддерживает ссылки, то именно так и можно вернуть из функции результат через параметры.
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.10.2009, 16:48  [ТС] #9
То, что не один поддерживающий стандарт С++ компилятор, не откомпилирует это код.
Visual Studio 2005
В общем не знаю что за язык, но если он поддерживает ссылки, то именно так и можно вернуть из функции результат через параметры.
Я же уже сказал что все остальные функции возвращают значение!..
Например вот эта:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
int division ( array<int>^ U, array<int>^V, array<int>^W )
{
    int t = 0;
    int t1 = 0;
    int t2 = 0;
    int n = 0;
    int m = 0;
    int d = 0;
    int q = 0;
    int r = 0;
    int i = 0;
    int j = 0;
    int k = 0;
    int tk = 0;
    int b = 16;
    
    t = compare (U,V);
    if ( t == 2 )
    {
        return 1;
    }
    
    n = V->Length;
    m = U->Length - n;
    
    W->Resize(W,m+1);
    
    d = b/(V[n-1]+1);
    if ( d == 1 )
    {
        U->Resize(U,m+n+1);
        V->Resize(V,n+1);
    }
    else
    {
        simpleMultiplication(U,d,U);
        simpleMultiplication(V,d,V);
        U->Resize(U,m+n+1);
        V->Resize(V,n+1);
    }
    
    for ( j = m; j >= 0; j-- )
    {
        // D3 -- Вычислить q
        q = (U[j+n]*b + U[j+n-1]) / V[n-1];
        r = (U[j+n]*b + U[j+n-1]) % V[n-1];
        while ( r < b )
        {
            t1 = q*V[n-2];
            t2 = b*r + U[j+n-2];
            
            if ( (q == b) || (t1 > t2) )
            {
                q--;
                r = r + V[n-1];
            }
            else
            {
                break;
            }
        }
        
        // D4 -- Умножить и вычесть
        for ( i = 0; i < n; i++ )
        {
            t1 = V[i]*q+k;
            k = t1/b;
            t1 -= k*b;
 
            t2 = U[j+i] - t1 + tk;
            
            if ( t2 < 0 )
            {
                U[j+i] = t2+b;
                tk = -1;
            }
            else
            {
                U[j+i] = t2;
                tk = 0;
            }
        }
        
        t2 = U[j+i] - k + tk;
        if ( t2 < 0 )
        {
            U[j+i] = t2+b;
            tk = -1;
        }
        else
        {
            U[j+i] = t2;
            tk = 0;
        }
 
        // D5 -- Проверка остатка       
        if ( tk == 0 )
        {
            W[j] = q;
        }
        // D6 -- Компенсировать сложение
        else 
        {
            W[j] = q-1;
            for ( i = 0; i < n; i++ )
            {
                t = U[j+i]+V[i]+k;
                if ( t >= b )
                {
                    U[j+i] = t-b;
                    k = 1;
                }
                else
                {
                    U[j+i] = t;
                    k = 0;
                }
            }
            U[j+i] = U[j+i]+k-b;    
        }
    }
    
    // D8 -- Денормализация
    if ( d > 1 )
    {
        simpleDivision ( V, d, V );
        simpleDivision ( U, d, U );
    }
    
    return 0;
}
При подобном же ее вызове.
C++
1
division(U,W,W);
Число хранящееся в массиве U делится на число хранящееся массив W и результат деления записывается в массив W.

Добавлено через 12 минут
Вот не понимаю! Почему никогда не указывают язык разработки?!
Извини, Visual C++ с использованием .NET ... но суть не в этом,... кажется
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 16:51 #10
Цитата Сообщение от fasked Посмотреть сообщение
Visual Studio 2005
Микрософтовкий компилятор слабо соответствует стандарту, не стоит его приводить как аргумент. Другое дело g++, mingw.

Цитата Сообщение от fasked Посмотреть сообщение
Я же уже сказал что все остальные функции возвращают значение!..
Мэн, ну я не сильно понимаю что это за язык, но если другая подобная функция проделывает это, значит и все должны! Чудес то не бывает!
fasked
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
25.10.2009, 16:55  [ТС] #11
Мэн, ну я не сильно понимаю что это за язык, но если другая подобная функция проделывает это, значит и все должны! Чудес то не бывает!
Чудес то не бывает, но "shit happens".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2009, 16:55
Привет! Вот еще темы с ответами:

Вызов функции - C++
Здравствуйте! Не могу вызвать функцию, объясните причину. template &lt;typename T&gt; void Calc_etalon (QDir &amp; DirTxt) { ...

Вызов функции - C++
#include &quot;stdafx.h&quot; #include &lt;locale&gt; #include &lt;iostream&gt; using namespace std; class Bankomat { public: Bankomat(){}; ...

Вызов функции в C++ - C++
есть циклический вызов функции: for (int i=0; i&lt;start; i++) { if (classicZOT())...

вызов функции - C++
как правильно вызвать данную функцию? typedef int key_t; typedef double value_t; value_t find(key_t key);


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.10.2009, 16:55
Ответ Создать тему
Опции темы

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