2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 функция не объявляется
Сообщение13.03.2010, 17:58 


06/01/10
61
Только начал осваивать C++.
Написал арифметику длинных чисел. Отдельно сложение, вычитание, сравнение и т.д. В функции сложения используется функция вычитания при определённой сигнатуре слагаемых. Компиллятор пишет:
'add_bignum' was not declared in this scope.

Текст моей программы:

#include <iostream>
#define maxdigits 100
#define plus 1
#define minus -1
using namespace std;

typedef struct{char digits[maxdigits];int signbit;int lastdigit;} bignum;

void
zero_justify(bignum *n) //-0 и нули в начале
{
while((n->lastdigit>0) && (n->digits[n->lastdigit]==0))
n->lastdigit--;
if((n->lastdigit==0) && (n->digits[0]==0))
n->signbit=plus;
}

void
print_bignum(bignum *n)
{
int i;
if(n->lastdigit==minus) printf("- ");
for(i=n->lastdigit;i>=0;i--) printf("%c",'0'+n->digits[i]);
printf("\n");
}

int
compare_bignum(bignum *a,bignum *b)
{
int i;
if((a->signbit==minus) && (b->signbit==plus)) return(plus);
if((b->signbit==minus) && (a->signbit==plus)) return(minus);
if(b->lastdigit>a->lastdigit) return(plus*a->signbit);
if(a->lastdigit>b->lastdigit) return(minus*a->signbit);
for(i=a->lastdigit;i>=0;i--)
{
if(a->digits[i]>b->digits[i]) return(minus*a->signbit);
if(b->digits[i]>a->digits[i]) return(plus*a->signbit);
}
return(0);
}

void subtract_bignum(bignum *a,bignum *b,bignum *c) //вычитание
{
int borrow,v,i;
if((a->signbit==minus)||(b->signbit==minus))
{
b->signbit=-1*b->signbit;
add_bignum(a,b,c);
b->signbit=-1*b->signbit;
return;
}
if(compare_bignum(a,b)==plus)
{
subtract_bignum(b,a,c);
c->signbit=minus;
return;
}
c->lastdigit=max(a->lastdigit,b->lastdigit);
borrow=0;
for(i=0;i<=c->lastdigit;i++)
{
v=(a->digits[i]-borrow-b->digits[i]);
if(v<0)
{
v=v+10;
borrow=1;
}
c->digits[i]=(char) v%10;
}
zero_justify(c);
}


void add_bignum(bignum *a,bignum *b,bignum *c) //Сложение
{
int carry;
int i;
if(a->signbit==b->signbit) c->signbit=a->signbit;
else
{
if(a->signbit=minus)
{
a->signbit=plus;
subtract_bignum(b,a,c);
a->signbit=minus;
}
else
{
b->signbit=plus;
subtract_bignum(a,b,c);
b->signbit=minus;
}
return;
}
c->lastdigit=max(a->lastdigit,b->lastdigit)+1;
carry=0;
for(i=0;i<=(c->lastdigit);i++)
{
c->digits[i]=(char)(carry+a->digits[i]+b->digits[i])%10;
carry=(carry+a->digits[i]+b->digits[i])/10;
}
zero_justify(c);
}



int main()
{
return 0;
}



Разве в C++ не выполняется принцип инкапсуляции? В чём ошибка моего кода?

 Профиль  
                  
 
 Re: функция не объявляется
Сообщение13.03.2010, 22:05 


09/02/09
90
Novosibirsk
Функция subtract_bignum использует функцию add_bignum, но в момент разбора вычитания функция сложения ещё не определена, компилятор про неё ничего ещё не знает.
Поместите в начало файла (до определения функции subtract_bignum) строчку с декларацией функции add_bignum :

void add_bignum(bignum*, bignum*, bignum*);

Имена формальных параметров не обязательны, можно не указывать, достаточно только типов.
Если бы в add_bignum, в свою очередь, не использовалась subtract_bignum то достаточно было бы просто переместить определение add_bignum выше по тексту.

 Профиль  
                  
 
 Re: функция не объявляется
Сообщение14.03.2010, 02:10 


30/12/09
95
Создайте хидер с объявлениями ваших функций и включите его с помощью #include.
Это стандартный стиль C/C++

 Профиль  
                  
 
 Re: функция не объявляется
Сообщение14.03.2010, 10:45 


06/01/10
61
Спасибо.
А в чем разница между указателями bignum*a, bignum* a, bignum *a?
И почему декларировать функция можно bignum*?

 Профиль  
                  
 
 Re: функция не объявляется
Сообщение14.03.2010, 12:21 


06/04/09
156
Воронеж
Yakov в сообщении #297412 писал(а):
А в чем разница между указателями bignum*a, bignum* a, bignum *a?

Ни в чем, но с первый аккуратней - а то компилятор может подумать, что это умножение. :) При объявление рекомендуют использовать последний вариант, чтобы избегать ошибок типа:
Используется синтаксис C++
bignum* a, b;

Это эквивалентно:
Используется синтаксис C++
 bignum* a;
 bignum b;
 


Yakov в сообщении #297412 писал(а):
И почему декларировать функция можно bignum*?

Потому что компилятор (линкер) различает функции по количеству и типам.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group