Autor Beitrag
Stephan.Woebbeking
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: Do 09.06.11 15:11 
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?

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


ausblenden Delphi-Quelltext
1:
2:
3:
procedure LoadDateTimeArrayFromDataStore( data: TIntArray; node: IXMLNode );
begin
  SetLength( data, Integer( node.GetAttribute( 'Count' ) ) );
guinnes
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 97



BeitragVerfasst: Di 14.06.11 09:53 
Ok, danke!

Stephan