Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: DragoRosso - Gennaio 26, 2022, 11:42:32 pm

Titolo: Warning errato in compilazione ?
Inserito da: DragoRosso - Gennaio 26, 2022, 11:42:32 pm
Facendo alcune prove con i messaggi di compilazione (a proposito di un recente post), mi sono trovato di fronte a questo, che dovrebbe essere un palese errore di valutazione:

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
var p: UINT64;
begin
  p := $FFFFFFFFFFFFFFFF;
  ShowMessage(p.toString);
end;   

Codice banale .... se non fosse che il compilatore dà questo warning:

Citazione
unit1.pas(37,8) Warning: range check error while evaluating constants (-1 must be between 0 and 18446744073709551615)

Il codice invece è valido (almeno secondo me) .... quella costante esadecimale corrisponde al massimo valore assegnabile ad una UINT64 e non al valore -1 (che non è comuqnue ammesso x P).

Corrisponde anche a voi ? Chiedo anche ai veterani del FPC ....

Ciao
Titolo: Re:Warning errato in compilazione ?
Inserito da: bonmario - Gennaio 27, 2022, 07:54:54 am
Mi viene da dire che hai ragione, visto che convertendo $FFFFFFFFFFFFFFFF in decimale, salta fuori proprio 18446744073709551615.

Ciao, Mario
Titolo: Re:Warning errato in compilazione ?
Inserito da: nomorelogic - Gennaio 27, 2022, 01:07:47 pm
in effetti la cosa è strana...
deve essere per forza un warning dato per errore dal compilatore

anche perché questo codice da lo stesso risultato (che è corretto)
però senza warning

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
var p: UINT64;
begin
  p := high(UInt64);
  ShowMessage(p.toString);
end;   
Titolo: Re:Warning errato in compilazione ?
Inserito da: nomorelogic - Gennaio 27, 2022, 01:12:51 pm
forse è qualcosa di più di un warning dato per errore
forzando il tipo, il warning sparisce

sembrerebbe che la costante sia interpretata come un tipo diverso e che venga fatto il cast dopo aver generato il warn
strano...

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
var p: UINT64;
begin
  p := UINT64($FFFFFFFFFFFFFFFF);
  ShowMessage(p.toString);
end;   
Titolo: Re:Warning errato in compilazione ?
Inserito da: DragoRosso - Gennaio 27, 2022, 02:11:54 pm
Fare il cast di una costante per assegnarla ad un tipo integrale .... mi sembra strano che debba essere così.

E' probabile come dice @nomorelogic che la costante sia interpretata come un tipo diverso da quello che è (quella vale anche -1 in un contesto Int64 però).

La cosa che mi preoccupa, è che non vorrei che quel "messaggio" fosse un sintomo di una anomalia magari più profonda.

Ciao

P.S.: ho fatto una prova con un cast Int64 .... compila con il warning ....  :o
Titolo: Re:Warning errato in compilazione ?
Inserito da: DragoRosso - Gennaio 27, 2022, 02:17:17 pm
 :o :o :o ;D

però così compila senza alcun warning .....

Codice: [Seleziona]
procedure TForm1.Button1Click(Sender: TObject);
var p: UINT64;
begin
  p := $FFFFFFFFFFFFFFFF+1;
  ShowMessage(p.toString);
end;

Loooool