2013-08-26 10 views
8

Sto provando a definire un const in Delphi (Delphi 2005) che è basato su altre costanti, ma Delphi si lamenta che non è un'espressione costante. Questo è ciò che il mio codice è simile:Errore nella definizione delle costanti in Delphi

program myProgram; 

const 
    Xpoints = 20; 
    Ypoints = 30; 
    ArraySize = trunc(sqrt(Xpoints*Ypoints)); 

var 
    myArray : array[1..ArraySize] of integer; 

ho potuto fare arraysize = Xpoints * Ypoints ma lo sqrt causa problemi. L'idea è che vorrei che la matrice fosse dimensionata dalle costanti Xpoints e Ypoints. Potrei fare qualcosa del genere:

program myProgram; 

const 
    sqrtXpoints = 4.472135956; 
    sqrtYpoints = 5.47722557506; 
    Xpoints = trunc(sqrtXpoints*sqrtXpoints); 
    Ypoints = trunc(sqrtYpoints*sqrtYpoints); 
    ArraySize = trunc(sqrtXpoints*sqrtYpoints); 

var 
    myArray : array[1..ArraySize] of integer; 

avendo cura di sovrastimare leggermente i valori della radice quadrata per il trunc. Tutto verrà aggiornato correttamente se cambio sqrtXpoints o sqrtYpoints, ma questo approccio sembra proprio così ... stupido.

Come una soluzione temporanea che posso valutare la costante di me in questo modo:

program myProgram; 

const 
    Xpoints = 20; 
    Ypoints = 30; 
    ArraySize = 24; 

var 
    myArray : array[1..ArraySize] of integer; 

ma non mi piace questo perché arraysize non aggiorna automaticamente se cambio Xpoints o Ypoints.

Sembra che il compilatore dovrebbe sapere come valutare una costante definita come una funzione matematica di un'altra costante in fase di compilazione per cose come l'esempio di cui sopra e per le cose ancora più semplici come questo:

const 
    pi = 4.0*arctan(1.0); 

ma io non riesco a farlo accettare. Eventuali suggerimenti? Grazie in anticipo per il vostro aiuto!

+1

È semplicemente non può utilizzare le funzioni in dichiarazioni di costanti. –

+1

Il compilatore non valuterà 'sqrt'. Potresti, suppongo, usare una costante tipizzata e correggerla al momento dell'inizializzazione. Avresti bisogno di un paio di chiamate VirtualAlloc per farlo volare. –

+0

Un'altra soluzione alternativa consiste nell'utilizzare un compilatore che è meno schizzinoso sulle espressioni costanti (fpc). – OnTheFly

risposta

7

Delphi non consente di utilizzare la maggior parte delle funzioni nella definizione di costanti. Ma si può facilmente risolverlo, basta usare array dinamici e sarete in grado di calcolare tutto ciò che si desidera dal codice:

const 
    Xpoints = 20; 
    Ypoints = 30; 
var 
    myArray : array of integer; 

procedure TForm9.FormCreate(Sender: TObject); 
begin 
    setlength(myArray, trunc(sqrt(Xpoints*Ypoints))); 

end; 
+0

Grazie per la risposta! Speravo di evitare l'allocazione dinamica della memoria, ma questo sembrava molto semplice, quindi ho fatto un tentativo e funziona bene. Non ho mai usato array dinamici in Delphi ma ora sembra un buon momento per iniziare. Grazie mille! –

+1

Dalla lettura dell'intero testo della domanda, ho sviluppato un'opinione su quale OP è in grado di capire da solo una soluzione. – OnTheFly

+4

Ti suggerisco di spostare questo codice nella sezione 'initialization' dell'unità. – TLama

Problemi correlati