Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   error overload (https://www.clubdelphi.com/foros/showthread.php?t=90033)

xangiesaurx 22-03-2016 18:40:00

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?:confused:

Reasen 23-03-2016 05:41:16

Que intentas hacer? Seguro que hay mejores alternativas.

jhonny 24-03-2016 16:32:31

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.

AgustinOrtu 24-03-2016 16:56:07

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

xangiesaurx 24-03-2016 19:42:53

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. :p

xangiesaurx 25-03-2016 18:07:41

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 :D

Por cierto Caller.Params son Variant. (Uso XE5)

AgustinOrtu 25-03-2016 18:49:37

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;

xangiesaurx 25-03-2016 20:50:49

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


La franja horaria es GMT +2. Ahora son las 20:14:44.

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