Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit dyn. Arrays bei Übergabe an Funktion (https://www.delphipraxis.net/35450-problem-mit-dyn-arrays-bei-uebergabe-funktion.html)

kalmi01 7. Dez 2004 13:18


Problem mit dyn. Arrays bei Übergabe an Funktion
 
Hallo,
warum bekomme ich bei diesem Konstrukt die Fehlermeldung: Inkompatible Typen ?

In Unit 1 steht folgendes:

Delphi-Quellcode:
implementation
  {$R *.dfm}

  uses
    unit2;

  procedure TForm1.Button1Click(Sender: TObject);
    var
      UpdateListFile : array of string;
    begin
      if Check4UpdateList(UpdateListFile)
      then Edit1.Text := 'OK';
    end;

end.

In Unit 2 steht folgendes:
Delphi-Quellcode:
unit Unit2;

interface
  function Check4UpdateList(UpdateListFile : array of string) : boolean;


implementation
  function Check4UpdateList(UpdateListFile : array of string) : boolean;
    begin
      SetLength(UpdateListFile, 1); // hier gibts den Fehler
      Result := true;
    end;

end.
Würde mich mal interessieren, wo mein Denkfehler liegt.
Gruß
Michael

sakura 7. Dez 2004 13:21

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
Zitat:

Zitat von kalmi01
warum bekomme ich bei diesem Konstrukt die Fehlermeldung: Inkompatible Typen?

Weil array of string nicht gleich array of string ist, zumindest in der Pascal Logik.

Erstelle Dir einen Typen, den Du dann überall für array of string einsetzt.

Delphi-Quellcode:
unit Unit2;

interface
  type
    TStringArray = array of string;

  function Check4UpdateList(UpdateListFile : TStringArray) : boolean;


implementation
  function Check4UpdateList(UpdateListFile : TStringArray) : boolean;
    begin
      SetLength(UpdateListFile, 1); // hier gibts den Fehler
      Result := true;
    end;

end.
...:cat:...

Jan 7. Dez 2004 13:23

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
Hallo kalmi01,
das selbe Problem hatte ich auch schon des öfteren.
Beim übergeben eines dynamischen arrays an eine Methode wird der Array innerhalb der Methode statisch. Ein Lösungsansatz wäre nur einen Zeiger auf den Array zu übergeben und diesen dann innerhalb der Methode zu dereferenzieren und dann setlength anzuwenden. Kann aber nicht garantieren, dass das klappt, habs nämlich selber noch nie versucht.
Gruß
Jan

sakura 7. Dez 2004 13:26

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
Zitat:

Zitat von Jan
Beim übergeben eines dynamischen arrays an eine Methode wird der Array innerhalb der Methode statisch.

Das hat nichts damit zu tun. Delphi moniert, dass zweimal ein Typ deklariert wird, in diesem Fall array of String. Auch wenn es die gleiche Definition ist, so wird er zwei mal deklariert und Pascal/Delphi kann nicht garantieren, dass das gleiche gemeint ist und stoppt mit einem Compiler-Fehler. Wenn man jetzt einmal einen Typen deklariert, also z.B.
Delphi-Quellcode:
type
  TStringArray = array of String;
und dann immer den neuen Typen nutzt, so ist garantiert, dass es sich immer um den gleichen Typen handelt.

...:cat:...

Jan 7. Dez 2004 13:41

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
und warum kann denn dann alles machen was man mit einer statischen stringlist auch machen kann? also ich verstehe nicht, warum da jetzt unterscheide gemacht werden. Wieso wird wegen dieser doppelten deklaration der array jetzt wie ein statischer array behandelt? wo liegt da der sinn? Und wieso limitiert dieses doppelte deklarieren nur den dynamischen aspekt des arrays? weil normalerweise müsste Delphi ja dann bei beliebigen übergebenen Variabeln an eine Methode Zweifel haben ob der Typ jetzt wirklich richtig ist und generell den typ als inkompatibel bezeichnen.
Das soll jetzt nicht heißen, dass du nicht Recht hast aber mich interessiert das, weil ich mich schon oft darüber gewundert hab was das soll.
Würde denn mein Lösungsvorschlag mit dem zeiger funktionieren?
Gruß
Jan

sakura 7. Dez 2004 13:49

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
Zitat:

Zitat von Jan
und warum kann denn dann alles machen was man mit einer statischen stringlist auch machen kann?

Wie kommst Du eigentlich auf statische Arrays? Die haben mit der Frage doch nichts zu tun. Und statisch wird auch nichts.

Zitat:

Zitat von Jan
Wieso wird wegen dieser doppelten deklaration der array jetzt wie ein statischer array behandelt?

Hat ja keiner gesagt.

Zitat:

Zitat von Jan
Und wieso limitiert dieses doppelte deklarieren nur den dynamischen aspekt des arrays?

... (siehe oben)

Zitat:

Zitat von Jan
weil normalerweise müsste Delphi ja dann bei beliebigen übergebenen Variabeln an eine Methode Zweifel haben ob der Typ jetzt wirklich richtig ist und generell den typ als inkompatibel bezeichnen.

Nein, deswegen werden ja immer eindeutige Typen verlangt. Ob das jetzt einfache wie Integer, Btye oder String, Objeke wie TStrings, TControl oder TObject oder eigene Typen wie z.B. der obige TStringArray. Das ist egal. Es muss hat ein Type sein. array of String ist aber keine Typ, sondern eine neue Typendefinition.

Zitat:

Zitat von Jan
Würde denn mein Lösungsvorschlag mit dem zeiger funktionieren?

Er wäre gefährlich (Typensicherheit ist verloren) aber möglich.

...:cat:...

kalmi01 7. Dez 2004 14:06

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
Hi,

also nur so zur Info, mit Pointern hat ich es auch schon probiert.
War nicht vom gewünschten Ergebnis gekürt.

Delphi-Quellcode:
  type
    TStringArray = array of string;
Geht aber auch nicht so, wie gewollt.
Deklarier ich TStringArray in Unit1, so muß ich diese auch in Unit2
im uses referenzieren, damit es eindeutig bleibt.

Also hab ich eine eigene Unit für Typdefinitionen angelegt.
So weit so gut, die Syntaxprüfung meckert nicht mehr.

Leider gibts beim Compilieren: [Fataler Fehler] Interner Fehler: L1333

gefrusteter
Michael

Jan 7. Dez 2004 14:21

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
Zitat:

und warum kann denn dann alles machen was man mit einer statischen stringlist auch machen kann?

Wie kommst Du eigentlich auf statische Arrays? Die haben mit der Frage doch nichts zu tun. Und statisch wird auch nichts.
Naja statisch meinte ich jetzt nur, weil der dynamische array of string der übergeben wird ja immernoch benutzbar ist, genau so wie ein statischer array, nur setlength, was ja auf einen dynamischen array anwendbar ist, klappt nicht, also folgerte ich, dass delphi den array jetzt statisch behandelt.

Brainshock 7. Dez 2004 14:33

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
Hi,

anstatt einen neuen Typ für das Array zu deklarieren, nimm doch einfach den vorhandenen:

Delphi-Quellcode:
TStringDynArray
aus der Unit:

Delphi-Quellcode:
Types

Da gibt's das nämlich schon... :zwinker:

mfg

sakura 7. Dez 2004 14:41

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
Zitat:

Zitat von kalmi01
Leider gibts beim Compilieren: [Fataler Fehler] Interner Fehler: L1333

Bleibt der Fehler auch nach einem Neustart bestehen? Kannst Du den evtl. soweit eingrenzen, dass Du mir das Projekt zusenden kannst, dann sende ich es an Danny weiter.

...:cat:...

Edit: namen verdreht :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz