![]() |
Cast eines Arrays auf einen Arraytyp bedenklich?
Hallo,
Ich hätte da mal eine Frage. Folgende Typen:
Delphi-Quellcode:
Ich kann das TRecordArray im TRecord selbst nicht benutzen (von Pointern mal abgesehen), also benutze ich da ein einfaches Array of TRecord, was funktioniert. Ob das so schön ist.. wahrscheinlich gibts schöneres aber ich kenne keine bessere Lösung ohne Pointer/New/Dispose.
TRecord = record
// .. Daten RecordArray: Array of TRecord; end; TRecordArray = Array of TRecord; Aber weiter: Des weiteren habe ich eine procedure die ungefähr so aussieht:
Delphi-Quellcode:
Frage1: Gibt es ernsthafte Einsprüche zu dem Cast, weil die interne Struktur von "TRecordArray" und "Array of TRecord" möglicherweise unterschiedlich sind und es da zu unvorhergesehenen Fehlern kommen kann?
// Muss vom Typ TRecordArray sein, da SetLength mit "Array of TRecord" nicht funktioniert
procedure Irgendwas(var ARecords: TRecordArray) begin SetLength(ARecords, 123); // // Array wird gefüllt end; // Aufruf var Rec: TRecord; begin // A: Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen Irgendwas(Rec.RecordArray); // B: funktioniert Irgendwas(TRecordArray(Rec.RecordArray)); end; Frage2: Vorschläge zu einer bessere Lösung? (Ich weiß der Titel ist sehr seltsam, aber konnte es nicht besser formulieren. Wenn jemand das Problem besser beschreiben kann - nur her damit :mrgreen: ) |
AW: Cast eines Arrays auf einen Arraytyp bedenklich?
Typen müssen nunmal identisch sein.
Delphi-Quellcode:
Deine Definitionen sind zwar "intern gleich", aber nicht "identisch".
type
TRecordArray = Array of TRecord; // geht natürlich nicht, da TRecord noch nicht deklariert ist und Forward-Deklarationen bei arrays nicht möglich sind (Größe/SizeOf muß vorhanden sein) TRecord = record // .. Daten RecordArray: TRecordArray; end; Jemand mit der selben DNA (Bauplan) wie du, ist ja dennoch nicht du. Der Cast sollte kein Problem sein, da die Typen ja intern gleich, aber eben nicht der "selbe" Typ sind. Sowas geht vermutlich auch nicht?
Delphi-Quellcode:
Am Sichersten wären hier wohl Pointertypen oder Objekte, welche als Forward deklariert werden können.
type
TRecord = record public type TRecordArray = Array of TRecord; public // .. Daten RecordArray: TRecordArray; end; procedure Irgendwas(var ARecords: TRecord.TRecordArray); Oder du übergibst deinem Irgendwas nicht das Array, sondern den übergeordneten Record. :stupid: Funktioniert auch, aber von der Typsicherheit her ein Graus, da man ja "alles" übergeben kann.
Delphi-Quellcode:
procedure Irgendwas(var ARecords);
begin SetLength(TRecordArray(ARecords), 123); // Array wird gefüllt end; procedure Irgendwas(var ARecords); var TheRecords: TRecordArray absolute ARecords; begin SetLength(TheRecords, 123); // Array wird gefüllt end; |
AW: Cast eines Arrays auf einen Arraytyp bedenklich?
Vielleicht schon zu spät für mich, aber warum nicht
Delphi-Quellcode:
statt
TArray<TRecord>
Delphi-Quellcode:
?
array of TRecord
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE} {$R *.res} type TRecord = record // .. Daten RecordArray: TArray<TRecord> end; TRecordArray = TArray<TRecord>; procedure Irgendwas(var ARecords: TRecordArray); begin SetLength(ARecords, 123); // // Array wird gefüllt end; // Aufruf var Rec: TRecord; begin // A: Funktioniert Irgendwas(Rec.RecordArray); // B: funktioniert //Irgendwas(TRecordArray(Rec.RecordArray)); end. |
AW: Cast eines Arrays auf einen Arraytyp bedenklich?
Zitat:
Delphi 2010 und Generics? ... war hoffentlich doch schon 2007/2009 :gruebel: Hoffentlich waren da auch schon die einzelnen TArray<T>-Deklaratationen "identisch". |
AW: Cast eines Arrays auf einen Arraytyp bedenklich?
Nein, muss nicht. Ich achte mittlerweile nicht mehr drauf, was jemand in seinem Profil eingetragen hat da es eigentlich nie stimmt.
|
AW: Cast eines Arrays auf einen Arraytyp bedenklich?
Die lügen alle? :shock:
Dann hatt'er halt Pech (wenn man es nicht abweichend im Post erwähnt) :angel2: |
AW: Cast eines Arrays auf einen Arraytyp bedenklich?
Zitat:
Der Rest deiner Vorschläge ist wie du schon selbst gesagt hast etwas doof. Da ist der Cast dann doch einfacher/schöner. Wenns intern keine Probleme gibt ist ja gut :) Ja benutze (privat) Delphi 2010 und da gibts schon Generics ;) Generics gibts seit 2009 ;) Von daher wäre TArray<TRecord> tatsächlich auch ne gute Idee. Wobei ich den Code möglicherweise nach C++ übersetzen muss und da sollte ich keine zu Delphi-spezifischen Kram einbauen wenn ichs mir nicht unnötig schwer machen will. Danke auf jeden Fall für eure Antworten! :) |
AW: Cast eines Arrays auf einen Arraytyp bedenklich?
Zitat:
Gerade Container-Klassen und darauf laufende Algorithmen gibt es in der STL genug :)
Code:
class TRecord {
public: std::vector<TRecord> RecordArray; }; void irgendwas(std::vector<TRecord>& aVector) { aVector.resize(123); // Array wird gefüllt } |
AW: Cast eines Arrays auf einen Arraytyp bedenklich?
Das sollte im Prinzip sicher sein. Du musst nur aufpassen, dass du "array of ..." nicht bei Parametern verwendest, denn diese Arrays haben ein anderes Format, was zu Fehlern führen wird.
Delphi-Quellcode:
type
TRecordArray = array of TRecord; procedure DoSomething(Foo: array of TRecord); var Bar: TRecordArray; begin // Das NICHT tun Bar := TRecordArray(Foo); SetLength(Bar, 42); end; |
AW: Cast eines Arrays auf einen Arraytyp bedenklich?
[QUOTE[
Frage1: Gibt es ernsthafte Einsprüche zu dem Cast, weil die interne Struktur von "TRecordArray" und "Array of TRecord" möglicherweise unterschiedlich sind und es da zu unvorhergesehenen Fehlern kommen kann?[/QUOTE] Ja. Casts sind hässlich, nicht typsicher und führen zu unvorhergesehenen Fehlern. Den letzten Punkt habe ich von einem an sich pfiffigen Programmierer ;-) Ich würde mich -außer beim Experimentieren- nie drauf verlassen, das sich interne Datenstrukturen nicht doch irgendwann ändern. Zitat:
Meine Frage lautet: Wieso willst Du so etwas überhaupt anstellen? Wieso willst Du auf New/Dispose und Pointer verzichten? Was ist der Unterschied zwischen dem und einem 'SetLength'?
Delphi-Quellcode:
// Übrigens, statt:
Procedure Irgendwas (FooListe : TRecordArray); // oder Array of TRecord? Hilfäääää // einfach den Record als Parameter übergeben Procedure Irgendwas (Rec : TRecord); // Damit hat sich das Problem in Luft aufgelöst |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz