Kompiler findet korrekte Prozedur bei gleichem Namen nicht

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Uli
Beiträge: 24
Registriert: Mi 2. Sep 2009, 18:49

Kompiler findet korrekte Prozedur bei gleichem Namen nicht

Beitrag von Uli »

Hallo,
ich habe zwei Prozeduren mit dem selben Namen in zwei verschiedenen Units. Die Prozeduren unterscheiden sich im Typ des Übergabeparameters. Beim kompilieren bekomme ich folgende Fehlermeldung:
"Error: Call by var for arg no. 1 has to match exactly: Got "TStringArray" expected "TLogResultArray".
Das interessant ist, wenn ich die Reihenfolge der Units "toolkit" und "declare" in der USES Anweisung in global.pas umdrehe, kann ich das Testprogrmm kompilieren, dann funktioniert der Aufruf mit dem andern Datentyp aber nicht mehr. Ich habe das Programm und die Units unten aufgeführt. Der Fehler tritt in der Unit global.pas in der Zeile "SetArray(MasterResultArray, 0);" auf.
Die Lazarus Version ist 0.9.30.

Kann mir bitte jemand sagen, warum dies so ist?

Code: Alles auswählen

program test;
 
uses toolkit, declare, global;
 
begin
  SelectMaster('select * from dual');
end.

Code: Alles auswählen

unit toolkit;
 
interface
 
type  TStringArray  = array of ansistring;
 
procedure SetArray(var Arr: TStringArray; Len: integer);
 
implementation
 
procedure SetArray(var Arr: TStringArray; Len: integer);
begin
  if Len < 1 then setlength(Arr, 0) else setlength(Arr, Len+1);
end;
 
end.

Code: Alles auswählen

unit declare;
 
interface
 
uses  toolkit;
 
type  TLogResult         = record
        Line             : ansistring;
      end;
 
      TLogResultArray    = array of TLogResult;
 
var   MasterResultArray  : TStringArray;
      LogResultArray     : TLogResultArray;
 
procedure SetArray(var Arr: TLogResultArray; Len: integer);
 
implementation
 
procedure SetArray(var Arr: TLogResultArray; Len: integer);
begin
  if Len < 1 then setlength(Arr, 0) else setlength(Arr, Len+1);
end;
 
end.

Code: Alles auswählen

unit global;
 
interface
 
uses  toolkit, declare;
 
procedure SelectMaster(Sql: ansistring);
 
implementation
 
procedure SelectMaster(Sql: ansistring);
begin
  SetArray(MasterResultArray, 0);
end;
 
end.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Kompiler findet korrekte Prozedur bei gleichem Namen nicht

Beitrag von DiBo33 »

Im ersten Fall rufst du die Funktion SetArray() aus der Unit declare auf und erhälst richtiger weise den Fehler, im 2. Fall rufst du SetArray() aus der Unit toolkit auf wobei hier der Übergabeparameter stimmt.

Warum überhaupt beides male den gleichen Namen? willst du die Funktion überladen? dann musst du override nutzen oder du rufst die einzelnen Funktionen explizit auf:
toolkit.SetArray()
declare.SetArray()

Edit: nicht override sondern overload

Uli
Beiträge: 24
Registriert: Mi 2. Sep 2009, 18:49

Re: Kompiler findet korrekte Prozedur bei gleichem Namen nicht

Beitrag von Uli »

Hi DiBo33,
danke für die schnelle Antwort.
Du hast natürlich Recht, overload war was fehlte.

Danke.

Antworten