Forum > Italian

Dimensione record variata dopo versione 2.0.8

(1/1)

Jeeno:
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


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---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; implementationbegin  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.]

bonmario:
Ciao,
magari dico una cavolata, ma più che la versione di Lazarus, dovresti verificare quale versione di FPC ha provocato il disallineamento.

Una volta trovata, guardando nelle sue note di rilascio, dovresti trovarne il motivo.

Ciao, Mario

Jeeno:
Grazie Mario. Non ci avevo pensato; avevo solo cercato nelle note di rilascio di Lazarus.

Jeeno:
Nulla... Neppure in FPC. Ho dovuto risolvere con conversione in file text (2.0.8) e riconversione dei singoli campi dei record (2.0.10).
Ciao.
 

bonmario:
Ciao,
da una veloce ricerca, mi è saltato fuori questo:
https://wiki.freepascal.org/User_Changes_2.6.0#Sizes_of_sets_in_TP.2FDelphi_mode

vedi se magari è il tuo caso.

Ciao, Mario

Navigation

[0] Message Index

Go to full version