Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: DragoRosso - Maggio 19, 2025, 11:23:55 am

Titolo: Absolute directive with record and array
Inserito da: DragoRosso - Maggio 19, 2025, 11:23:55 am
Ciao a tutti, dal forum internazionale riporto una interessante modalità per inizializzare un array di record.

https://forum.lazarus.freepascal.org/index.php/topic,71183.msg555336.html#msg555336 (https://forum.lazarus.freepascal.org/index.php/topic,71183.msg555336.html#msg555336)

Questa la riporto perchè è compatibile con Delphi, mentre ne viene proposta nel topic anche un'altra che non lo è.
Ancorchè non sia una novità, l'uso di "absolute" non è comune.

In pratica viene creato un array di stringhe e poi viene assegnato già come dichiarazione ad un array di record proprio grazie alla direttiva absolute https://wiki.freepascal.org/Absolute (https://wiki.freepascal.org/Absolute)

Ciò consente di definire e alimentare in modo efficace delle semplici strutture senza dovere creare e leggere file di testo o db.

Codice: [Seleziona]
const
  TABLE_SIZE = 118; //118*3 -1 = array size

  //questa può essere const o var, dipende dall'uso del record che fate poi
  TABLE_DATA: array[0..pred(TABLE_SIZE * 3)] of string = (
  'H', 'Hydrogen', '1.00794', 'He', 'Helium', '4.002602',
  'Li', 'Lithium', '6.941', 'Be', 'Beryllium', '9.012182',
  'B', 'Boron', '10.811', 'C', 'Carbon', '12.0107',
  'N', 'Nitrogen', '14.0067', 'O', 'Oxygen', '15.9994',
  'F', 'Fluorine', '18.9984032', 'Ne', 'Neon', '20.1797',
  'Na', 'Sodium', '22.98976...', 'Mg', 'Magnesium', '24.305',
  'Al', 'Aluminium', '26.9815386', 'Si', 'Silicon', '28.0855',
  'P', 'Phosphorus', '30.973762', 'S', 'Sulfur', '32.065',
  'Cl', 'Chlorine', '35.453', 'Ar', 'Argon', '39.948',
  'K', 'Potassium', '39.948', 'Ca', 'Calcium', '40.078',
  'Sc', 'Scandium', '44.955912', 'Ti', 'Titanium', '47.867',
  'V', 'Vanadium', '50.9415', 'Cr', 'Chromium', '51.9961',
  'Mn', 'Manganese', '54.938045', 'Fe', 'Iron', '55.845',
  'Co', 'Cobalt', '58.933195', 'Ni', 'Nickel', '58.6934',
  'Cu', 'Copper', '63.546', 'Zn', 'Zinc', '65.38',
  'Ga', 'Gallium', '69.723', 'Ge', 'Germanium', '72.63',
  'As', 'Arsenic', '74.9216', 'Se', 'Selenium', '78.96',
  'Br', 'Bromine', '79.904', 'Kr', 'Krypton', '83.798',
  'Rb', 'Rubidium', '85.4678', 'Sr', 'Strontium', '87.62',
  'Y', 'Yttrium', '88.90585', 'Zr', 'Zirconium', '91.224',
  'Nb', 'Niobium', '92.90628', 'Mo', 'Molybdenum', '95.96',
  'Tc', 'Technetium', '(98)', 'Ru', 'Ruthenium', '101.07',
  'Rh', 'Rhodium', '102.9055', 'Pd', 'Palladium', '106.42',
  'Ag', 'Silver', '107.8682', 'Cd', 'Cadmium', '112.411',
  'In', 'Indium', '114.818', 'Sn', 'Tin', '118.71',
  'Sb', 'Antimony', '121.76', 'Te', 'Tellurium', '127.6',
  'I', 'Iodine', '126.90447', 'Xe', 'Xenon', '131.293',
  'Cs', 'Caesium', '132.9054', 'Ba', 'Barium', '132.9054',
  'La', 'Lanthanum', '138.90547', 'Ce', 'Cerium', '140.116',
  'Pr', 'Praseodymium', '140.90765', 'Nd', 'Neodymium', '144.242',
  'Pm', 'Promethium', '(145)', 'Sm', 'Samarium', '150.36',
  'Eu', 'Europium', '151.964', 'Gd', 'Gadolinium', '157.25',
  'Tb', 'Terbium', '158.92535', 'Dy', 'Dysprosium', '162.5',
  'Ho', 'Holmium', '164.93032', 'Er', 'Erbium', '167.259',
  'Tm', 'Thulium', '168.93421', 'Yb', 'Ytterbium', '173.054',
  'Lu', 'Lutetium', '174.9668', 'Hf', 'Hafnium', '178.49',
  'Ta', 'Tantalum', '180.94788', 'W', 'Tungsten', '183.84',
  'Re', 'Rhenium', '186.207', 'Os', 'Osmium', '190.23',
  'Ir', 'Iridium', '192.217', 'Pt', 'Platinum', '195.084',
  'Au', 'Gold', '196.966569', 'Hg', 'Mercury', '200.59',
  'Tl', 'Thallium', '204.3833', 'Pb', 'Lead', '207.2',
  'Bi', 'Bismuth', '208.9804', 'Po', 'Polonium', '(209)',
  'At', 'Astatine', '(210)', 'Rn', 'Radon', '(222)',
  'Fr', 'Francium', '(223)', 'Ra', 'Radium', '(226)',
  'Ac', 'Actinium', '(227)', 'Th', 'Thorium', '232.03806',
  'Pa', 'Protactinium', '231.0588', 'U', 'Uranium', '238.02891',
  'Np', 'Neptunium', '(237)', 'Pu', 'Plutonium', '(244)',
  'Am', 'Americium', '(243)', 'Cm', 'Curium', '(247)',
  'Bk', 'Berkelium', '(247)', 'Cf', 'Californium', '(251)',
  'Es', 'Einstenium', '(252)', 'Fm', 'Fermium', '(257)',
  'Md', 'Mendelevium', '(258)', 'No', 'Nobelium', '(259)',
  'Lr', 'Lawrencium', '(262)', 'Rf', 'Rutherfordium', '(267)',
  'Db', 'Dubnium', '(268)', 'Sg', 'Seaborgium', '(271)',
  'Bh', 'Bohrium', '(272)', 'Hs', 'Hassium', '(270)',
  'Mt', 'Meitnerium', '(276)', 'Ds', 'Darmstadium', '(281)',
  'Rg', 'Roentgenium', '(280)', 'Cn', 'Copernicium', '(285)',
  'Nh', 'Nihonium', '(286)', 'Fl', 'Flerovium', '(289)',
  'Mc', 'Moscovium', '(290)', 'Lv', 'Livermorium', '(293)',
  'Ts', 'Tennessine', '(294)', 'Og', 'Oganesson', '(294)');

var
  Elements : array[0..pred(TABLE_SIZE)] of record
    Symbol     : string;
    Name       : string;
    Mass       : string;
  end absolute TABLE_DATA;  { absolute, don't program without it !! }


procedure XXXXX
begin
  for var i in Elements do
    begin
      ShowMessage(i.Symbol+' / '+i.Name+' / '+i.Mass);
    end;
end;
Titolo: Re:Absolute directive with record and array
Inserito da: DragoRosso - Maggio 19, 2025, 02:58:18 pm
Ho chiesto ad un altro forum se ci fossero dei problemi ad usare tale modo (a parte fare ciò con tipologie diverse di codice) e in pratica uno degli ultimi commenti, sicuramente il più mirato alla mia richiesta, ha confermato che giustamente essendo le stringhe dei "managed type", quel tipo di assegnazione non è proprio consigliata (anche se lecita). Inoltre così scrivendo il codice potrebbe non essere ottimizzato dal compilatore.

Insomma, buona l'idea come esempio d'uso "scolastico" ma da non usare nella programmazione reale.