Recent

Author Topic: Dimensione record variata dopo versione 2.0.8  (Read 11261 times)

Jeeno

  • Newbie
  • Posts: 3
Dimensione record variata dopo versione 2.0.8
« on: August 23, 2021, 04:50:30 pm »
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  [Select][+][-]
  1. unit uvars;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils;
  9.  
  10. const LunPassword = 10;
  11.       LunEmail = 40;
  12.       LunMachine = 20;
  13.  
  14. type TAutorizzazione = (
  15.                     r_personale,
  16.                     w_personale,
  17.                     n_personale,
  18.                     d_personale,
  19.  
  20.                     r_utente,
  21.                     w_utente,
  22.                     n_utente,
  23.                     d_utente,
  24.                     p_utente,
  25.                     a_utente,
  26.  
  27.                     r_esterno,
  28.                     w_esterno,
  29.                     n_esterno,
  30.                     d_esterno,
  31.  
  32.                     r_files,
  33.                     r_backup,
  34.                     r_restore,
  35.                     r_report,
  36.                     r_costieprezzi,
  37.  
  38.                     r_progetto,
  39.                     w_progetto,
  40.                     n_progetto,
  41.                     d_progetto,
  42.                     b_progetto,
  43.  
  44.                     r_scrittura,
  45.                     w_scrittura,
  46.                     d_scrittura,
  47.  
  48.                     r_statoprogetto,
  49.                     r_archivio,
  50.                     w_archivio,
  51.  
  52.                     r_accesso,
  53.                     r_statisticautente,
  54.                     w_accesso,
  55.                     r_fondo,
  56.                     w_fondo,
  57.  
  58.                     r_storicoprogetto,
  59.                     r_storicoscrittura,
  60.                     r_storicoaccesso,
  61.  
  62.                     r_pianodeiconti,
  63.                     w_pianodeiconti,
  64.                     d_pianodeiconti,
  65.                     n_pianodeiconti,
  66.  
  67.                     r_regolamentocontabilescrittura,
  68.                     w_regolamentocontabilescrittura,
  69.                     d_regolamentocontabilescrittura,
  70.  
  71.                     r_contabileordinaria,
  72.                     w_contabileordinaria,
  73.                     d_contabileordinaria
  74.                     );
  75.  
  76.                     TAbilitazione = (
  77.                                   nonabilitato,
  78.                                   abilitato,
  79.                                   bloccato
  80.                                   );
  81.  
  82.                     TStatoUtente = (connesso,nonconnesso);
  83.                     TSetOfAutorizzazione = set of TAutorizzazione;
  84.                     TSetOfChar = set of char;
  85.  
  86.                     TUtente = record
  87.                       codice: integer;
  88.                       login: string[LunEmail];
  89.                       password: string[LunPassword];
  90.                       passwordcambiata: boolean;
  91.                       abilitazione: TAbilitazione;
  92.                       dataultimologin: TDateTime;
  93.                       dataultimologout: TDateTime;
  94.                       autorizzazioni: TSetOfAutorizzazione;
  95.                       stato: TStatoUtente;
  96.                       device: string[LunMachine];
  97.                       gruppi: TSetOfChar;
  98.                       settori: TSetOfChar;
  99.                       tag: byte;
  100.                     end;
  101.  
  102. var so_utente: integer;
  103.  
  104. implementation
  105. begin
  106.   so_utente:=sizeof(TUtente);
  107. 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.]
« Last Edit: August 23, 2021, 11:59:57 pm by trev »

bonmario

  • Sr. Member
  • ****
  • Posts: 346
Re: Dimensione record variata dopo versione 2.0.8
« Reply #1 on: August 23, 2021, 06:14:35 pm »
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

  • Newbie
  • Posts: 3
Re: Dimensione record variata dopo versione 2.0.8
« Reply #2 on: August 23, 2021, 08:16:27 pm »
Grazie Mario. Non ci avevo pensato; avevo solo cercato nelle note di rilascio di Lazarus.

Jeeno

  • Newbie
  • Posts: 3
Re: Dimensione record variata dopo versione 2.0.8
« Reply #3 on: August 24, 2021, 01:16:32 pm »
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

  • Sr. Member
  • ****
  • Posts: 346
Re: Dimensione record variata dopo versione 2.0.8
« Reply #4 on: August 24, 2021, 01:38:49 pm »
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

 

TinyPortal © 2005-2018