Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - в чём ошибка ?

Ответить
Настройки темы
C/C++ - в чём ошибка ?

Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

" redefinition; different type modifiers "

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

Отправлено: 21:58, 03-11-2007

 

редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


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

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

-------
http://ivank.ru


Отправлено: 01:46, 04-11-2007 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить 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
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


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

-------
http://ivank.ru


Отправлено: 18:33, 04-11-2007 | #4


Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 23:17, 04-11-2007 | #5


Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


Вложения
Тип файла: txt main.txt
(5.1 Kb, 5 просмотров)
Тип файла: txt ErrorHandlingModule.txt
(515 байт, 4 просмотров)
Тип файла: txt ErrorHandlingModuleh.txt
(296 байт, 5 просмотров)
Тип файла: txt PromptModule.txt
(669 байт, 5 просмотров)
Тип файла: txt PromptModuleh.txt
(145 байт, 4 просмотров)

Шлю всё

Отправлено: 23:21, 04-11-2007 | #6


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить 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;
	 }

-------
http://ivank.ru


Отправлено: 02:02, 05-11-2007 | #7


Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 17:30, 05-11-2007 | #8


Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


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 ) - вот она объявлена

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

Отправлено: 22:34, 05-11-2007 | #9


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


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

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

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

-------
http://ivank.ru

Это сообщение посчитали полезным следующие участники:

Отправлено: 01:22, 06-11-2007 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - в чём ошибка ?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
В чём разница 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




 
Переход