Войти

Показать полную графическую версию : в чём ошибка ?


KEKS-KEKS
03-11-2007, 21:58
компилятор пишет ошибку с строке объявления функции

" redefinition; different type modifiers "

что это значит подскажите кто-нибудь :moderator

ivank
04-11-2007, 01:46
KEKS-KEKS, не плохо бы приводить код с которым проблемы.

Может быть примерно такая проблема:int __stdcall function(int a, int b);
int __cdecl function(int a, int b);может быть и другая, в общем код в студию.

KEKS-KEKS
04-11-2007, 10:59
Вот код функции , весь код слишком большой не хочу вас грузить . Где ошибка я показал

float Accumulator
(
const char theOperator,const float theOperand=0
)
{ " ошибка в этой строке"
static float myAccumulator=0;
switch (theOperator)
{
case '+': myAccumulator=myAccumulator+theOperand;
Tape(theOperator,theOperand);
break;
case '-': myAccumulator=myAccumulator-theOperand;
Tape(theOperator,theOperand);
break;
case '*': myAccumulator=myAccumulator*theOperand;
Tape(theOperator,theOperand);
break;
case '/': myAccumulator=myAccumulator/theOperand;
Tape(theOperator,theOperand);
break;
case '@':

myAccumulator=theOperand;
Tape(theOperator,theOperand);
break;
case '=':
cout<<endl<<myAccumulator<<endl;
break;
case '?':
Tape(theOperator,0);
break;
default:
throw
runtime_error
("ERROR - INVALID OPERATOR - must be one of +,-,*, or /");
};
return myAccumulator;
}

ivank
04-11-2007, 18:33
KEKS-KEKS, научитесь пользоваться тегом [[code]] и научитесь прикладывать файлы к сообщениям. Ибо телепаты традиционно в отпуске. Лучше весь проект зазипованный.

KEKS-KEKS
04-11-2007, 23:17
Спасибо. Буду учиться.

KEKS-KEKS
04-11-2007, 23:21
Шлю всё :read:

ivank
05-11-2007, 02:02
Во-перых, стандартный заголовочный файл stdexcept, а не exception.
Во-вторых, вы используете функцию Accumulator предварительно её не объявив. Ваш компилятор по старой сишной привычке (в c++ так делать _нельзя_, поэтому мой компилятор например на это ругается) "угадывает" тип этой функции, как:
int Accumulator (char , float);
но ниже Accumulator описан как:
float Accumulator (char , float);

Т.е. отличается _только_ типом результата. А такая перегрузка (по типу результата, а не аргументов) в С++ запрещена. Вывод простой: всегда давайте прототипы используемых функций. Ниже код файла main.cpp с минимальными исправлениями, чтобы компилировалось. Править всё что мне не нравится лень (а не нравится довольно многое).

#include <iostream>
#include <stdexcept>
#include "PromptModule.h"
#include "ErrorHandlingModule.h"
using namespace std;

float Accumulator(const char theOperator,const float theOperand=0);

char GetOperator(void)
{
char Operator;
cin>>Operator;
return Operator;
}
float GetOperand(void)
{
float Operand;
cin>>Operand;
return Operand;
}
bool TestOK
(
const char theOperator,const float theOperand,
const float theExpectedResult
)
{
float Result=Accumulator(theOperator,theOperand);// 25
if (Result==theExpectedResult)
{
cout<<theOperator<<theOperand<<" - succeeded."<<endl;
return true;
}
else
{
cout<< theOperator<<theOperand<<" - failed ."<<
"Expected"<<theExpectedResult<<",got"<<Result<<endl;
return false;
};
}

void SelfTest(void)
{
float OldValue=Accumulator('='); //41
try
{
if
(
TestOK('@',0,0) &&
TestOK('+',3,3) &&
TestOK('-',2,1) &&
TestOK('*',4,4) &&
TestOK('/',2,2) //50
)
{
cout<<"Test completed successfully."<<endl;
}
else
{
cout<<"Test failed."<<endl;
};
}
catch (...) //60
{
cout<<"An exeption occured during self test."<<endl;
};
Accumulator('@',OldValue);
}

void Tape(const char theOperator,const float theOperand)
{
static const int myTapeChunk=3;
static char *myOperator=new char[myTapeChunk]; //70
static float *myOperand=new float[myTapeChunk];
static int myTapeSize=myTapeChunk;
static int myNumberOfEntries=0;
int Index; //
switch (theOperator)
{
case '?':for
(
Index = 0;//80
Index < myNumberOfEntries;
Index++
)
{
cout <<
myOperator[Index]<<","<<myOperand[Index]<<endl;
};
break;
case '.':
delete [] myOperator; //90
delete [] myOperand;
break;

default :
if (myNumberOfEntries == myTapeSize)
{
char *ExpendedOperator=new char[myNumberOfEntries+myTapeChunk];
float *ExpendedOperand=new float [myNumberOfEntries+myTapeChunk];

char *FromOperator=myOperator;//100
float *FromOperand=myOperand;

char *ToOperator=ExpendedOperator;
float *ToOperand=ExpendedOperand;

for
(
int Index = 0;
Index<myNumberOfEntries;
Index++ //110
)
{
*ToOperator++= *FromOperator++;
*ToOperand++= *FromOperand++;
};
delete[] myOperator;
delete[] myOperand;

myOperator=ExpendedOperator;
myOperand=ExpendedOperand; //120

myTapeSize+=myTapeChunk;
};
myOperator[myNumberOfEntries]=theOperator;
myOperand[myNumberOfEntries]=theOperand;
myNumberOfEntries++;
};
}

float Accumulator
(
const char theOperator,const float theOperand
)
{
static float myAccumulator=0;
switch (theOperator)
{
case '+': myAccumulator=myAccumulator+theOperand;
Tape(theOperator,theOperand);
break;
case '-': myAccumulator=myAccumulator-theOperand;
Tape(theOperator,theOperand);
break; //140
case '*': myAccumulator=myAccumulator*theOperand;
Tape(theOperator,theOperand);
break;
case '/': myAccumulator=myAccumulator/theOperand;
Tape(theOperator,theOperand);
break;
case '@':
myAccumulator=theOperand;
Tape(theOperator,theOperand);
break; //150
case '=':
cout<<endl<<myAccumulator<<endl;
break;
case '?':
Tape(theOperator,0);
break;
default:
throw
runtime_error
("ERROR - INVALID OPERATOR - must be one of +,-,*, or /");
};
return myAccumulator;
}
int main (int argc,char* argv[])

{ SAMSErrorHandling::Initialize();
char Operator;
do

{
try //171
{ Operator =GetOperator();
if
(
Operator=='+'||
Operator=='-'||
Operator=='*'||
Operator=='/'||
Operator=='@'
) //180
{
float Operand=GetOperand();
Accumulator(Operator,Operand);
}
else if (Operator=='!')
{
SelfTest();
}
else if (Operator=='.')
{ //190
}
else
{
Accumulator(Operator);
}
}
catch ( runtime_error RuntimeError)
{ SAMSErrorHandling::HandleRuntimeError (RuntimeError);}

catch (...) //200
{ SAMSErrorHandling::HandleNotANumberError ();}
}
while (Operator !='.');
Tape ('.',0);
return 0;
}

KEKS-KEKS
05-11-2007, 17:30
Спасибо буду разбираться.

KEKS-KEKS
05-11-2007, 22:34
ivank, Прошу меня извинить , я ведь только учусь. Но я не нашёл где у меня int Accumulator (char , float);
но ниже Accumulator описан как:
float Accumulator (char , float); »
а также Во-вторых, вы используете функцию Accumulator предварительно её не объявив. » . Но ведь я её объявил в файле main.cpp в нём объявляются по очереди:

char GetOperator(void)
float GetOperand(void)
bool TestOK
void SelfTest(void)
void Tape(const char theOperator,const float theOperand)
float Accumulator
( const char theOperator,const float theOperand=0 ) - вот она объявлена :read:

или я чего-то недогоняю :blush:

ivank
06-11-2007, 01:22
KEKS-KEKS
В C++ любая функция должна быть объявлена (или определена полностью) _до_ её первого использования. В первый раз функция Accumulator используется в TestOK, т.е. _до_ её определения.

В языке си так делать можно было. При этом тип формальных аргументов функции определялся по типу фактических. А типом результата объявлялся int. Таким образом при первом использовании функции Accumulator вы _неявно_ определяете её как "int Accumulator (char , float);". Но позже (уже явно) определяете как "float Accumulator (char , float);", т.е. с точки зрения компилятора пытаетесь перегрузить её по типу результата, чего делать нельзя (на что он и ругается).

Но вообще ваш компилятор не прав (ибо старенький, бедняжка), в том, что пытается быть похожим на C. В C++ использовать функцию предварительно её не объявив нельзя вообще, и поэтому в первый раз компилятор д.б. ругнуться ещё на строку 25, сказав, что ему неизвестна функция Accumulator. Именно так делает, например, мой компилятор (g++4).

yurfed
06-11-2007, 03:47
О, как в Паскале. Пока не объявишь, не поедешь :)

KEKS-KEKS
06-11-2007, 18:54
ivank, Спасибо, дошло до меня. Я поменял местами объявление функций и всё получилось. Теперь их очерёдность такая :

void Tape(const char theOperator,const float theOperand)
float Accumulator ( const char theOperator,const float theOperand=0 )
char GetOperator(void)
float GetOperand(void)
bool TestOK
void SelfTest(void)

и компилятор их пропускает. А ты голова :clapping:




© OSzone.net 2001-2012