Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-03-2016
xangiesaurx xangiesaurx is offline
Miembro
NULL
 
Registrado: feb 2016
Posts: 57
Poder: 9
xangiesaurx Va por buen camino
error overload

Hola a todos, de nuevo vengo a molestarlos, aun sigo migrando proyectos de Delphi 2010 a XE, el problema que tengo ahora es que tengo el siguiente código:

Código Delphi [-]
//// Fills memory with DWord value
procedure FillDWord(V: DWord; Dest: Pointer; Count: Integer); overload;

procedure FillDWord(V: DWord; Dest: Pointer; Count: Integer); overload;
{
  EAX = V
  EDX = Dest
  ECX = Count
}
asm
  shr   ecx, 1
  jnc   @1
  mov   [edx],eax
  add   edx,4
@1:
  shr   ecx, 1
  jnc   @2
  mov   [edx],eax
  mov   [edx+4],eax
  add   edx,2*4
@2:
  jcxz  @Exit
@3:
  mov   [edx    ],eax
  mov   [edx+1*4],eax
  mov   [edx+2*4],eax
  mov   [edx+3*4],eax
  add   edx,4*4
  loop  @3
@Exit:
end;

y me esta dando estos errores:

[dcc32 Error] GraphicUtils.pas(229): E2254 Overloaded procedure 'FillDWord’ must be marked with the 'overload’ directive
[dcc32 Error] GraphicUtils.pas(58): E2065 Unsatisfied forward or external declaration: 'FillDWord’

El primer error desaparece cuando marco los dos como overload (así como esta en el código que puse) y es cuando aparece el segundo error, lo logro quitar si comento la declaración, pero ahí esta otro problema por que también los usan externamente.

Alguien sabe que podría hacer para solucionar esto?
Responder Con Cita
  #2  
Antiguo 23-03-2016
Reasen Reasen is offline
Miembro
NULL
 
Registrado: dic 2015
Ubicación: Barcelona
Posts: 140
Poder: 9
Reasen Va por buen camino
Que intentas hacer? Seguro que hay mejores alternativas.
Responder Con Cita
  #3  
Antiguo 24-03-2016
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Ambos métodos tienen el mismo nombre, la misma cantidad de parámetros y además los parámetros de ambos métodos son del mismo tipo. El compilador no encuentra diferencia alguna en sus encabezados y por ende muestra el error.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #4  
Antiguo 24-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Pregunta: Tenes 1 metodo o 2 metodos?

Si es 1 metodo, por que incluir la directiva overload?
Si son 2 metodos, la respuesta de jhonny es correcta: No podes tener dos metodos que se llamen igual y tengan la misma firma, incluso con la directiva overload
Responder Con Cita
  #5  
Antiguo 24-03-2016
xangiesaurx xangiesaurx is offline
Miembro
NULL
 
Registrado: feb 2016
Posts: 57
Poder: 9
xangiesaurx Va por buen camino
Una disculpa por tardar en contestar, eh tenido algo de trabajo, se soluciono el problema, todo era por que estaba usando Integer, cuando lo cambie por NativeInt todo se soluciono.
Responder Con Cita
  #6  
Antiguo 25-03-2016
xangiesaurx xangiesaurx is offline
Miembro
NULL
 
Registrado: feb 2016
Posts: 57
Poder: 9
xangiesaurx Va por buen camino
Ok, ahora se me presento otro problemita, tengo en un classes.pas estas funciones:

Código Delphi [-]
function TStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
{ Default implementation of 64 bit seek is to deflect to existing 32 bit seek.
  Descendents that override 64 bit seek must not call this default implementation. }
  if (Offset < Low(Longint)) or (Offset > High(Longint)) then
    raise ERangeError.CreateRes(@SRangeError);
  Result := Seek(Longint(Offset), Ord(Origin));
end;

function TStream.Seek(const Offset: Int64; Origin: Word): Int64;
begin
  Result := Seek(Offset, TSeekOrigin(Origin));
end;

Y en fs_uses.pas tengo lo siguiente:

Código Delphi [-]
else if MethodName = 'SEEK' then
      Result := _TStream.Seek(Caller.Params[0], Caller.Params[1])

Me esta dando el siguiente error:
[dcc32 Error] fs_iclassesrtti.pas(306): E2251 Ambiguous overloaded call to 'Seek'
System.Classes.pas(846): Related method: function TStream.Seek(const Int64; Word): Int64;
System.Classes.pas(845): Related method: function TStream.Seek(const Int64; TSeekOrigin): Int64;

Alguien sabe como poder solucionarlo?
Gracias

Por cierto Caller.Params son Variant. (Uso XE5)
Responder Con Cita
  #7  
Antiguo 25-03-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
El compilador no sabe a que metodo se supone que debe invocar. Variant puede ser cualquier tipo (esa es su ventaja) entre sus contras es que hay que andar haciendo conversiones, chequeos de tipo, consumen mas memoria y son mas lentos.

Imaginate este caso:

Código Delphi [-]
  procedure MostrarMensaje(const Msg: string); overload;
  procedure MostrarMensaje(const Numero: Integer); overload;


// mas adelante..
var
  Valor: Variant;
begin
  Valor := 5;
  MostrarMensaje(Valor); E2251 Ambiguous overloaded call to MostrarMensaje
end;

La solucion: explicitamente indicar el tipo, por ejemplo usando http://docwiki.embarcadero.com/Libraries/en/System.Variants.VarToStr

Código Delphi [-]
var
  Valor: Variant;
begin
  Valor := 5;
  MostrarMensaje(VarToStr(Valor)); invoca a procedure MostrarMensaje(const Msg: string);
end;
Responder Con Cita
  #8  
Antiguo 25-03-2016
xangiesaurx xangiesaurx is offline
Miembro
NULL
 
Registrado: feb 2016
Posts: 57
Poder: 9
xangiesaurx Va por buen camino
Wink

Gracias por tu pronta respuesta AgustinOrtu.

Me sirvio tu ejemplo para darme una idea de que hacer, así que ya lo solucione, lo que hice fue hacer comparaciones delos valores que obtenía el variant y dependiendo de eso los mandaba al método correspondiente:

Código Delphi [-]
 if Variants.VarIsType(Caller.Params[0], varInt64) and VarIsType(Caller.Params[1], varWord) then
      begin
          Result:= _TStream.Seek(Int64(Caller.Params[0]), Word(Caller.Params[1]));
      end

Gracias por toda su ayuda
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
OverLoad con parametro Nil Neeruu Varios 9 03-11-2011 19:26:19
stdcall? overload? hmv OOP 4 30-10-2006 21:14:28
problema con overload santiago14 Varios 1 03-03-2005 14:35:00
Error "there is no overload version" torito Varios 4 21-11-2003 20:54:00
Aclaracion de overload tica Varios 3 06-11-2003 16:09:59


La franja horaria es GMT +2. Ahora son las 08:48:54.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi