Record che definiscono un layout di memoria parziale

0

Sto lavorando a una soluzione che dovrebbe funzionare in C ++ - Builder e Delphi, è per questo che uso la sintassi Object Pascal, ma non mi è molto familiare. Provo ad accedere a un mapping di file con una dimensione che non è definita in fase di esecuzione con Free Pascal / Delphi. Ho provato

type
  TFileMappingLayout = packed record
    Size: DWORD;
    Data: array [0..0] of byte;
  end;
  PFileMappingLayout = ^TFileMappingLayout;

ma non sono sicuro se questo è conforme al controllo di intervallo. Sembra impossibile per google, non ho trovato nulla di utile finora. Leggere le descrizioni sulla creazione di tipi strutturati non ha menzionato casi come questo. Ho anche dato uno sguardo al codice sorgente di Lazarus, ma ho rinunciato dopo 100 definizioni di record banali ...

Uso il campo Data solo per la copia binaria, ad esempio scrivendo su di esso:

  PFileMappingLayout(FData)^.size := cbData;
  Move(myData, PFileMappingLayout(FData)^.Data, cbData);

Come si fa normalmente con Delphi / Free Pascal?

Come chiameresti questo tipo di definizione del record ( open record , partial record )?

    
posta Wolf 20.10.2015 - 12:02
fonte

1 risposta

1

Per evitare errori di controllo dei range, dovresti piuttosto definire l'array di dati come segue:

Data: array[0..MaxInt-1] of Byte;

In generale, per un tipo TMyType , puoi definire un array di tipo aperto come segue:

Data: array[0..MaxInt div SizeOf(TMyType) - 1] of TMyType;

Ma questo è tutto se si desidera avere una struttura record come al momento. Personalmente userò solo un array dinamico:

Data: array of Byte;

Usa SetLength() per inizializzare il suo conteggio e Length() per ottenere il suo conteggio corrente. Non devi allocare o de-allocare alcuna memoria per questo come dovresti per la tua implementazione.

(Siamo spiacenti, non so come chiamino tali tipi di record come hai indicato ...)

    
risposta data 09.12.2015 - 14:36
fonte

Leggi altre domande sui tag