2014 dxdy logo

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

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




 
 функция не объявляется
Сообщение13.03.2010, 17:58 
Только начал осваивать 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 
Функция 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 
Создайте хидер с объявлениями ваших функций и включите его с помощью #include.
Это стандартный стиль C/C++

 
 
 
 Re: функция не объявляется
Сообщение14.03.2010, 10:45 
Спасибо.
А в чем разница между указателями bignum*a, bignum* a, bignum *a?
И почему декларировать функция можно bignum*?

 
 
 
 Re: функция не объявляется
Сообщение14.03.2010, 12:21 
Yakov в сообщении #297412 писал(а):
А в чем разница между указателями bignum*a, bignum* a, bignum *a?

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

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


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

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

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group