Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - "array of Integer" in Parameterliste


Stephan.Woebbeking - Do 09.06.11 15:11
Titel: "array of Integer" in Parameterliste
Hallo,

ich habe versucht eine Funktion zu schreiben, die mit einem array arbeitet. Im ersten Fall bekomme ich einen "Incompatible types" error, im zweiten nicht. TIntArray ist als "array of Integer" definiert! Wo liegt der Unterschied? Wo das Problem?


Delphi-Quelltext
1:
2:
3:
procedure LoadDateTimeArrayFromDataStore( data: array of Integer; node: IXMLNode );
begin
  SetLength( data, Integer( node.GetAttribute( 'Count' ) ) );



Delphi-Quelltext
1:
2:
3:
procedure LoadDateTimeArrayFromDataStore( data: TIntArray; node: IXMLNode );
begin
  SetLength( data, Integer( node.GetAttribute( 'Count' ) ) );


guinnes - Do 09.06.11 15:15

user profile iconStephan.Woebbeking hat folgendes geschrieben Zum zitierten Posting springen:
Wo liegt der Unterschied? Wo das Problem?

Die Deklaration ist zwar gleich, es ist aber nicht die selbe. Die Typprüfung von Pascal ist sehr streng, und das ist auch gut so. So ist z.B. ein Pointer auch nur ein Integer, also vom Datentyp eigentlich gleich. Trotzdem sind die beiden nicht kompatibel


jaenicke - Do 09.06.11 15:34

Das erste ist ein offenes Array, d.h. die Werte des Parameters landen beim Aufruf im Stack.

Das zweite ist ein dynamisches Array, d.h. ein Pointer auf die Werte des Arrays. Und auch nur der Pointer wird übergeben.

Diese beide Typen sehen zwar ähnlich aus, sind aber grundverschieden aufgebaut, so dass keine gegenseitige Zuweisung möglich ist.


Stephan.Woebbeking - Do 09.06.11 16:39

Moment, da habe ich vielleicht etwas zu kurz geschrieben. Ich habe NICHT versucht diese beiden Typen zu KOMBINIEREN, sondern das zweite ist lediglich die ALTERNATIVE, mit der ich feststelle, dass es klappt. D.h. wenn ich beides - Argument und formalen Parameter - als "array of Integer" definiere will das nicht... Wird das so klarer; auch nicht mit der Information aus den Antworten?


jaenicke - Do 09.06.11 16:43

Wie ich geschrieben habe: Im ersten Fall hast du ein offenes Array, bei dem die Daten auf dem Stack liegen. Das kannst du nicht in der Größe verändern. Die Daten liegen wie sie sind im Stack.

Im zweiten Fall hast du ein dynamisches Array, und auf diesen Pointer kannst du dann auch entsprechend zugreifen und auch die Größe verändern. Denn die Daten liegen hier nicht als Werte vor, sondern du hast eine Referenz, also einen Pointer, darauf.


Stephan.Woebbeking - Do 09.06.11 16:58

Ok, das habe ich jetzt verstanden... Abgesehen davon, dass es ziemlich widersprüchlich klingt, ein OFFENES array auf dem Stack und damit eben nicht veränderlich zu haben. Und das wird nur durch die zusätzliche Typdefinition ausgelöst, oder habe ich noch etwas anderes übersehen?


jaenicke - Do 09.06.11 17:03

Durch die Typdefinition definierst du ein dynamisches Array. Und damit hast du nur noch einen Pointer und darfst ändern.


Stephan.Woebbeking - Di 14.06.11 09:53

Ok, danke!

Stephan