|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - в чём ошибка ? |
|
|
C/C++ - в чём ошибка ?
|
Новый участник Сообщения: 35 |
Профиль | Отправить PM | Цитировать компилятор пишет ошибку с строке объявления функции
" redefinition; different type modifiers " что это значит подскажите кто-нибудь |
|
Отправлено: 21:58, 03-11-2007 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать |
------- Отправлено: 01:46, 04-11-2007 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Вот код функции , весь код слишком большой не хочу вас грузить . Где ошибка я показал
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; } |
Отправлено: 10:59, 04-11-2007 | #3 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать KEKS-KEKS, научитесь пользоваться тегом [[code]] и научитесь прикладывать файлы к сообщениям. Ибо телепаты традиционно в отпуске. Лучше весь проект зазипованный.
|
------- Отправлено: 18:33, 04-11-2007 | #4 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Спасибо. Буду учиться.
|
|
Отправлено: 23:17, 04-11-2007 | #5 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Шлю всё
|
Отправлено: 23:21, 04-11-2007 | #6 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать Во-перых, стандартный заголовочный файл 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; } |
------- Отправлено: 02:02, 05-11-2007 | #7 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать Спасибо буду разбираться.
|
Отправлено: 17:30, 05-11-2007 | #8 |
Новый участник Сообщения: 35
|
Профиль | Отправить PM | Цитировать ivank, Прошу меня извинить , я ведь только учусь. Но я не нашёл где у меня
Цитата ivank:
Цитата ivank:
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 ) - вот она объявлена или я чего-то недогоняю |
||
Отправлено: 22:34, 05-11-2007 | #9 |
редкий гость Сообщения: 1696
|
Профиль | Сайт | Отправить PM | Цитировать KEKS-KEKS
В C++ любая функция должна быть объявлена (или определена полностью) _до_ её первого использования. В первый раз функция Accumulator используется в TestOK, т.е. _до_ её определения. В языке си так делать можно было. При этом тип формальных аргументов функции определялся по типу фактических. А типом результата объявлялся int. Таким образом при первом использовании функции Accumulator вы _неявно_ определяете её как "int Accumulator (char , float);". Но позже (уже явно) определяете как "float Accumulator (char , float);", т.е. с точки зрения компилятора пытаетесь перегрузить её по типу результата, чего делать нельзя (на что он и ругается). Но вообще ваш компилятор не прав (ибо старенький, бедняжка), в том, что пытается быть похожим на C. В C++ использовать функцию предварительно её не объявив нельзя вообще, и поэтому в первый раз компилятор д.б. ругнуться ещё на строку 25, сказав, что ему неизвестна функция Accumulator. Именно так делает, например, мой компилятор (g++4). |
------- Отправлено: 01:22, 06-11-2007 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
В чём разница 4x/8x | tolbol | Видеокарты | 3 | 15-05-2008 15:32 | |
Off и on-сайты. В чём их отличие? | united | Хочу все знать | 4 | 13-04-2007 15:18 | |
B чём здесь разница? | Spijon | Вебмастеру | 1 | 03-06-2006 18:18 | |
В чём проблема? | Andermade | Хочу все знать | 3 | 17-12-2005 01:50 | |
На чём пишется сайт??? | Guest | Вебмастеру | 7 | 07-05-2002 07:56 |
|