Delphi-PRAXiS

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:

kalmi01 7. Dez 2004 14:43

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

hab ich getan, interner Fehler L13333
bleibt.

Tschau

sakura 7. Dez 2004 15:05

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
:warn: Du musst nicht den Fehler immer so übergroß schreiben, das ist wie schreien und nicht gerade freundlich. Ich kann nichts dafür.

Jetzt habe ich Dir die Möglichkeit gesagt, dass Du versuchst ein kleines Projekt zu erstellen und mir dieses zuzusenden. Bleibt der Fehler nachvollziehbar, leite ich es direkt an den entsprechenden Entwickler weiter, damit die sich dieses Problemes annehmen können. Wenn Du das nicht willst, musst Du uU auch weiterhin mit dem Fehler leben und andere auch :?

...:cat:...

Brainshock 7. Dez 2004 15:06

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

hab eigentlich keine Probleme damit. Hab in beiden Units die Types eingebunden und den beschriebenen Typ genommen.
Das Array hab ich als var übergeben, sonst ist es bei der Rückgabe wieder Länge 0.
Quellcode sieht ungefähr so aus:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Types, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  UpdateListFile : TStringDynArray;
begin
  if Unit2.Check4UpdateList(UpdateListFile) then
  begin
    ShowMessage(IntToStr(Length(UpdateListFile))); // hier mal ne Message, um die länge zu kontrollieren
    Caption:= 'OK';
  end;
end;
Delphi-Quellcode:
unit Unit2;

interface

uses
  Types;

implementation

function Check4UpdateList(var UpdateListFile : TStringDynArray): boolean;
begin
  SetLength(UpdateListFile, 1); // hier gibts keinen Fehler
  Result := true;
end;
Viel Glück und mfg

sakura 7. Dez 2004 15:08

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

Zitat von Brainshock
hab eigentlich keine Probleme damit. Hab in beiden Units die Types eingebunden und den beschriebenen Typ genommen.

Sollte auch gehen, viele nutzen es immer wieder ;)

...:cat:...

kalmi01 7. Dez 2004 15:41

Re: Problem mit dyn. Arrays bei Übergabe an Funktion
 
Hallo und Danke,

hab es in einem neuen Projekt probiert und siehe da es funktionierte.

Unit1 und Unit 2 in mein Testverzeichnis kopiert, DCU's gelöscht,
compiliert und Peng

Anschließend aus dem uses von Unit1 einen von den Einträgen
gelöscht, die Delphi automatisch einträgt.
Delphi hat die Einträge wieder reingesetzt und man sollte es nicht glauben,
es funktioniert.

Hatte zwischenzeitlich sogar mal gebootet und mein Profil neu angelegt.
Vielen Dank noch mal für Eure Hilfe.

Schönen Tag noch, wünscht
Michael


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:15 Uhr.

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