Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   в чём ошибка ? (http://forum.oszone.net/showthread.php?t=93421)

KEKS-KEKS 03-11-2007 21:58 672181

в чём ошибка ?
 
компилятор пишет ошибку с строке объявления функции

" redefinition; different type modifiers "

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

ivank 04-11-2007 01:46 672270

KEKS-KEKS, не плохо бы приводить код с которым проблемы.

Может быть примерно такая проблема:
Код:

int __stdcall function(int a, int b);
int __cdecl function(int a, int b);

может быть и другая, в общем код в студию.

KEKS-KEKS 04-11-2007 10:59 672357

Вот код функции , весь код слишком большой не хочу вас грузить . Где ошибка я показал

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 672585

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

KEKS-KEKS 04-11-2007 23:17 672779

Спасибо. Буду учиться.

KEKS-KEKS 04-11-2007 23:21 672784

Вложений: 5
Шлю всё :read:

ivank 05-11-2007 02:02 672847

Во-перых, стандартный заголовочный файл 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 673069

Спасибо буду разбираться.

KEKS-KEKS 05-11-2007 22:34 673249

ivank, Прошу меня извинить , я ведь только учусь. Но я не нашёл где у меня
Цитата:

Цитата ivank
int Accumulator (char , float);
но ниже Accumulator описан как:
float Accumulator (char , float); »

а также
Цитата:

Цитата ivank
Во-вторых, вы используете функцию 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 673315

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 673335

О, как в Паскале. Пока не объявишь, не поедешь :)

KEKS-KEKS 06-11-2007 18:54 673761

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:


Время: 13:49.

Время: 13:49.
© OSzone.net 2001-