Ir al contenido



Foto

Error: Operator is not overloaded


Mejor respuesta Gaston , 26 diciembre 2016 - 11:41

Hola:
 
Al compilar el siguiente código obtengo un error de "Operator is not overloaded":


delphi
  1. program Project1;
  2. var a, b : Integer;
  3. begin
  4.   a := 5;
  5.   b := 2;
  6.   Writeln(a div b);
  7.   Writeln(a ** b);
  8. end.

Es evidente que estoy haciendo algo mal, pero no logro ver porqué.
 
Gracias por vuestra colaboración.

 

 

Creo que simplemente te falta 


delphi
  1. Uses math;

Saludos.

Ir al mensaje completo


  • Por favor identifícate para responder
6 respuestas en este tema

#1 orey

orey

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 26 diciembre 2016 - 03:41

Hola:
 
Al compilar el siguiente código obtengo un error de "Operator is not overloaded":

delphi
  1. program Project1;
  2. var a, b : Integer;
  3. begin
  4.   a := 5;
  5.   b := 2;
  6.   Writeln(a div b);
  7.   Writeln(a ** b);
  8. end.

Es evidente que estoy haciendo algo mal, pero no logro ver porqué.
 
Gracias por vuestra colaboración.
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.621 mensajes
  • LocationMadrid - España

Escrito 26 diciembre 2016 - 05:53

¿No estarás queriendo poner esto?:


delphi
  1. Writeln(a * b);

O esto:


delphi
  1. program Project1;
  2. uses Math;
  3.  
  4. var a, b : Integer;
  5. begin
  6. a := 5;
  7. b := 2;
  8. Writeln(a div b);
  9. Writeln(a ** b);
  10. Readln;
  11. end.

Saludos.


  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.833 mensajes
  • LocationArgentina

Escrito 26 diciembre 2016 - 06:32

Yo creería que es lo primero.

 

Es interesante esto de la sobrecarga de operadores y el estilo C. Se que Lazarus soporta esto ya que he visto código como esto:


delphi
  1. mivariable += 1;

Que es equivalente a:


php
  1. mivariable := mivariable + 1;

Pero no encuentro alguna referencia de todas las posibles sobrecarga de operadores que vienen incluídos. Se que hay una opción de compilación que permite que esto funcione (que está activa por defecto), y una duda que me trae es si yo desactivo esta función, ¿afectaría o daría advertencias en algo si justo mi código tiene escrito el estilo sobrecargado?

 

Mi duda es porque desconozco si es que hay que poner alguna directiva de compilación para que se entere el compilador o el solito reconoce que += debe ser reemplazado por el código producido por la construcción ":= +".

 

He leído medio de pasada esto y entiendo un poco la cosa, pero no encuentro ni una lista de los operadores sobrecargados que vienen por defecto, ni alguna aclaración sobre el tema de compilación.

 

Saludos,


  • 0

#4 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.621 mensajes
  • LocationMadrid - España

Escrito 26 diciembre 2016 - 08:06

Ciertamente Lazarus tiene muchas cosas de C. Si te fijas en el debugger a las direcciones de memoria en hexadecimal les coloca el prefijo 0x y no $. Eso me hace pensar que ese módulo está programado en C, si no gran parte de Lazarus.

 

En relación a las expresiones += ... son copiadas de C y muy útiles, así como el operador incremento (++) o decremento (--) que te permiten ahorrar líneas.

 

En relación a la sobrecarga de operadores, aquí tienes como lo hace para la pregunta del hilo en cuestión:


delphi
  1. // Tomado de la unidad Math
  2.  
  3. operator ** (bas,expo : float) e: float; inline;
  4. operator ** (bas,expo : int64) i: int64; inline;
  5.  
  6. .................................................
  7.  
  8. operator ** (bas,expo : float) e: float; inline;
  9. begin
  10. e:=power(bas,expo);
  11. end;
  12.  
  13.  
  14. operator ** (bas,expo : int64) i: int64; inline;
  15. begin
  16. i:=round(intpower(bas,expo));
  17. end;

Muy parecido a C++, se considera una simple función.

 

 

Saludos.


  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 5.833 mensajes
  • LocationArgentina

Escrito 26 diciembre 2016 - 08:49

Ciertamente Lazarus tiene muchas cosas de C. Si te fijas en el debugger a las direcciones de memoria en hexadecimal les coloca el prefijo 0x y no $. Eso me hace pensar que ese módulo está programado en C, si no gran parte de Lazarus.

 

En relación a las expresiones += ... son copiadas de C y muy útiles, así como el operador incremento (++) o decremento (--) que te permiten ahorrar líneas.

 

En relación a la sobrecarga de operadores, aquí tienes como lo hace para la pregunta del hilo en cuestión:


delphi
  1. // Tomado de la unidad Math
  2.  
  3. operator ** (bas,expo : float) e: float; inline;
  4. operator ** (bas,expo : int64) i: int64; inline;
  5.  
  6. .................................................
  7.  
  8. operator ** (bas,expo : float) e: float; inline;
  9. begin
  10. e:=power(bas,expo);
  11. end;
  12.  
  13.  
  14. operator ** (bas,expo : int64) i: int64; inline;
  15. begin
  16. i:=round(intpower(bas,expo));
  17. end;

Muy parecido a C++, se considera una simple función.

 

 

Saludos.

 

Si, he visto en la unidad Math esta sobrecarga y otras más.

Lo que no me queda claro como es que se las ingenia el compilador para detectar un += o un := + y seguir funcionando tranquilamente.

 

Hice una prueba con este código:


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var i: integer;
  3. begin
  4. i := 5;
  5. i += 4;
  6. ShowMessage(IntToStr(i));
  7. end;

He compilado el código tanto con la opción del COPERATORS desde la configuración del compilador para el proyecto (Proyecto -> Opciones del proyecto -> Opciones del compilador -> Procesado) activada como desactivada.

Le da lo mismo, el resultado es que compila y el resultado es 9.

 

Creo que algo tienen que ver las directivas:


delphi
  1. {$mode objfpc}{$H+}

Porque luego hice una prueba poniendo esto a continuación:


delphi
  1. {$mode objfpc}{$H+}
  2. {$COPERATORS OFF}

Y ahora al intentar compilar el código efectivamente recibo una advertencia.

 

Por esto, yo concluyo que la única forma segura de trabajar con los operadores C si es que uno desea usarlos es asegurarse de esté habilitada esta opción, o bien ponerlo en ON al inicio de nuestras units.

 

Por lo que pude leer de la doc, esta directiva de compilación permite trabajar con estos estilos: +=, -=, /= y *=. Tengo entendido que C acepta y tiene otros más, como la ** que se trata en este hilo. Al parecer el resto de operadores C se pueden (y tienen que) emular con la sobrecarga. Sería interesante tener una lista completa de los operadores que están disponibles por defecto. En la unidad Math hay unos cuantos... pero quien sabe si hay más...

 

Extraño la funcionalidad de "Búsqueda completa" que ofrece Delphi en Lazarus, para asi poder buscar en todo los fuentes del "Search Path" de Lazarus el término operator y recopilar la lista. Para lograr esto en Lazarus hay que tener abiertos cada unit en el IDE y si no te sabes el nombre de alguna no la busca :(

O al menos yo, no le vi esa opción en el Search de CodeTyphon/Lazarus.

 

Saludos,


  • 0

#6 Gaston

Gaston

    Advanced Member

  • Miembros
  • PipPipPip
  • 63 mensajes

Escrito 26 diciembre 2016 - 11:41   Mejor respuesta

Hola:
 
Al compilar el siguiente código obtengo un error de "Operator is not overloaded":


delphi
  1. program Project1;
  2. var a, b : Integer;
  3. begin
  4.   a := 5;
  5.   b := 2;
  6.   Writeln(a div b);
  7.   Writeln(a ** b);
  8. end.

Es evidente que estoy haciendo algo mal, pero no logro ver porqué.
 
Gracias por vuestra colaboración.

 

 

Creo que simplemente te falta 


delphi
  1. Uses math;

Saludos.


  • 0

#7 orey

orey

    Newbie

  • Miembros
  • Pip
  • 2 mensajes

Escrito 27 diciembre 2016 - 01:59

Muchas gracias compañeros.

Me había olvidado de incluir la unidad Math; error de novato.


  • 0