Buondì a tutti.
Ho questo problema da risolvere relativo alla dimensione di tipo di record contenente campo set.
Da versioni precedenti e fino alla 2.0.8 il record che riporto aveva dimensione 256byte
unit uvars;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils;
const LunPassword = 10;
LunEmail = 40;
LunMachine = 20;
type TAutorizzazione = (
r_personale,
w_personale,
n_personale,
d_personale,
r_utente,
w_utente,
n_utente,
d_utente,
p_utente,
a_utente,
r_esterno,
w_esterno,
n_esterno,
d_esterno,
r_files,
r_backup,
r_restore,
r_report,
r_costieprezzi,
r_progetto,
w_progetto,
n_progetto,
d_progetto,
b_progetto,
r_scrittura,
w_scrittura,
d_scrittura,
r_statoprogetto,
r_archivio,
w_archivio,
r_accesso,
r_statisticautente,
w_accesso,
r_fondo,
w_fondo,
r_storicoprogetto,
r_storicoscrittura,
r_storicoaccesso,
r_pianodeiconti,
w_pianodeiconti,
d_pianodeiconti,
n_pianodeiconti,
r_regolamentocontabilescrittura,
w_regolamentocontabilescrittura,
d_regolamentocontabilescrittura,
r_contabileordinaria,
w_contabileordinaria,
d_contabileordinaria
);
TAbilitazione = (
nonabilitato,
abilitato,
bloccato
);
TStatoUtente = (connesso,nonconnesso);
TSetOfAutorizzazione = set of TAutorizzazione;
TSetOfChar = set of char;
TUtente = record
codice: integer;
login: string[LunEmail];
password: string[LunPassword];
passwordcambiata: boolean;
abilitazione: TAbilitazione;
dataultimologin: TDateTime;
dataultimologout: TDateTime;
autorizzazioni: TSetOfAutorizzazione;
stato: TStatoUtente;
device: string[LunMachine];
gruppi: TSetOfChar;
settori: TSetOfChar;
tag: byte;
end;
var so_utente: integer;
implementation
begin
so_utente:=sizeof(TUtente);
end.
Quello che riporto è uno stralcio della unit contenente i tipi utilizzati nel record, ed il record stesso.
Ogni volta che c'era una nuova versione, l'ho scaricata ed ho ricompilato il programma senza alcun problema (se non ricordo male dalla 1.6.x).
Ma dalla versione 2.0.10, sizeof(TUtente) = 216. Ovviamente questo crea un disallineamento con i record presenti nel file già da tempo popolato, con evidente rappresentazione di dati confusi.
Ho dato un'occhiata alle note di rilascio della 2.0.10 ma non vi ho trovato riferimenti utili.
Sembra che il compilatore operi in automatico una ottimizzazione della dimensione, prima assente....
Il problema si presenta per tutti i tipi di record contenenti campo di tipo set.
Che sappiate, prima di fare conversioni varie, esiste una direttiva (o altro modo) per indicare al compilatore di lasciare invariata la dimensione del tipo di record?
Grazie.
Jeeno (Windows 10)
[Edited to add code tags - please see
How to use the Forums.]