I record sono tipi di valore, non tipi di riferimento. Ciò significa che tutti i record utilizzati come membri di una struttura dati più grande vengono posizionati in linea nella struttura stessa anziché come puntatore. Cercando di creare due record che contengono l'uno con l'altro, il compilatore verrà lanciato in un ciclo infinito mentre cercherà di capire la struttura dei record. Questo è probabilmente il motivo per cui non puoi inoltrare un record, e anche se stai cercando di inserire un tipo di riferimento (array dinamico) qui, non puoi ancora violare le regole della lingua.
Ma cosa si può fare è dichiarare un tipo puntatore-a-record come una dichiarazione anticipata, in questo modo:
PMyRec2 = ^MyRec2
...
MyRec2 = record
...
end;
Naturalmente, una volta di iniziare a usare puntatori a record, è necessario preoccuparsi di assegnazione e liberando la memoria, e la complessità del codice che stavi cercando di evitare non usando le classi appare nel tuo progetto. Bottom line: fai questo con le classi. Crea uno dei record, se non entrambi, una classe. È il modo più semplice, davvero.
E l'overhead di memoria extra è trascurabile. Esce da un puntatore all'oggetto per ciascun riferimento, che è necessario per i puntatori agli oggetti, oltre a un campo nascosto (4 byte) per istanza prima di D2009 o due (8 byte) su D2009 o successivo. Questo non è affatto.
fonte
2010-07-11 12:21:58
Eventuali duplicati: http://stackoverflow.com/questions/2420650/cross-reference-between-delphi-records –
Questo non ha senso. Se supponiamo che la lunghezza di ogni MyRec2Array sia fissa e diversa da zero, stai provando a creare una struttura dati che occuperà infiniti byte ... –
@Andreas Rejbrand - MyRec2Array è * dynamic * array. – Alex