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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.79
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.10.2009, 14:24     Вызов функции #1
Арифметические операции с длинными числами, которые представлены в виде массивов:

есть функция умножения двух длинных чисел 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++
C++ Вызов функции в C++
C++ Вызов функции
Вызов функции в возврате значения функции C++
вызов функции C++
C++ Вызов функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Андрейка
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
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.10.2009, 14:38  [ТС]     Вызов функции #3
Дело в том, что возвращаемое значение фукции через return зарезервированно для обработки ошибок (возвращаться будут коды ошибок), необходимо, чтобы результат вернулся иным способом. То есть в виде аргумента функции.
niXman
Эксперт C++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 14:39     Вызов функции #4
По ссылке/указателю.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 16:18     Вызов функции #6
Цитата Сообщение от fasked Посмотреть сообщение
Ребята, я в отчаянии, что делать?
Будь это С++, я бы ответил.
Цитата Сообщение от niXman Посмотреть сообщение
По ссылке/указателю.
А в этом ЯП, хз*
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.10.2009, 16:28  [ТС]     Вызов функции #7
Будь это С++, я бы ответил.
Что Вас заставило думать, будто это не С++ ???
Всего лишь немного "нечистый"

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

В общем не знаю что за язык, но если он поддерживает ссылки, то именно так и можно вернуть из функции результат через параметры.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 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++
 Аватар для niXman
3133 / 1445 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 16:51     Вызов функции #10
Цитата Сообщение от fasked Посмотреть сообщение
Visual Studio 2005
Микрософтовкий компилятор слабо соответствует стандарту, не стоит его приводить как аргумент. Другое дело g++, mingw.

Цитата Сообщение от fasked Посмотреть сообщение
Я же уже сказал что все остальные функции возвращают значение!..
Мэн, ну я не сильно понимаю что это за язык, но если другая подобная функция проделывает это, значит и все должны! Чудес то не бывает!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2009, 16:55     Вызов функции
Еще ссылки по теме:

C++ Вызов функции
Вызов функции C++
Вызов функции в параметре другой функции C++
C++ Вызов функции
вызов функции из под функции C++

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

Или воспользуйтесь поиском по форуму:
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
25.10.2009, 16:55  [ТС]     Вызов функции #11
Мэн, ну я не сильно понимаю что это за язык, но если другая подобная функция проделывает это, значит и все должны! Чудес то не бывает!
Чудес то не бывает, но "shit happens".
Yandex
Объявления
25.10.2009, 16:55     Вызов функции
Ответ Создать тему
Опции темы

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