2013-08-26 7 views
8

Ich versuche, ein Konst in Delphi zu definieren (Delphi 2005), das auf anderen Konstanten basiert, aber Delphi beschwert sich darüber, dass es kein konstanter Ausdruck ist. Dies ist, was mein Code wie folgt aussieht:Fehler beim Definieren von Konstanten in Delphi

program myProgram; 

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

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

ich Arraysize tun konnte = xpoints * Ypoints aber die sqrt Probleme verursacht. Die Idee ist, dass ich möchte, dass das Array nach den Konstanten Xpoints und Ypoints sortiert wird. Ich könnte so etwas tun:

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; 

achtet darauf, die Quadratwurzel-Werte für die Trunc etwas zu überschätzen. Alles wird korrekt aktualisiert, wenn ich sqrtXpoints oder sqrtYpoints ändere, aber dieser Ansatz scheint einfach so ... dumm.

Als temporäre Lösung kann ich die Konstante selbst wie folgt bewerten:

program myProgram; 

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

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

aber ich mag das nicht, weil Arraysize nicht automatisch aktualisiert, wenn ich xpoints oder Ypoints ändern.

Es scheint, wie der Compiler sollte wissen, wie eine Konstante als eine mathematische Funktion einer anderen Konstante bei der Kompilierung für Dinge wie das obige Beispiel und für eine noch einfachere Dinge wie diese definiert bewerten:

const 
    pi = 4.0*arctan(1.0); 

aber ich Ich kann es nicht akzeptieren. Irgendwelche Vorschläge? Vielen Dank im Voraus für Ihre Hilfe!

+1

Sie können einfach nicht in konstanten Deklarationen verwenden Funktionen. –

+1

Der Compiler wertet 'sqrt' nicht aus. Sie könnten, denke ich, eine typisierte Konstante verwenden und sie zur Initialisierungszeit reparieren. Sie benötigen ein paar Aufrufe von VirtualAlloc, um das zu fliegen. –

+0

Eine andere Problemumgehungsoption ist die Verwendung eines Compilers, der bei den konstanten Ausdrücken (fpc) ​​weniger wählerisch ist. – OnTheFly

Antwort

7

Delphi erlauben nicht die meisten Funktionen in der Definition von Konstanten zu verwenden. Aber man kann es leicht lösen, nur dynamischen Arrays verwenden, und Sie werden in der Lage alle zu berechnen, was Sie von Ihrem Code wollen:

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

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

end; 
+0

Danke für die Antwort! Ich hatte gehofft, dynamische Speicherzuteilung zu vermeiden, aber das sah sehr einfach aus, also habe ich es versucht und es funktioniert gut. Ich habe noch nie dynamische Arrays in Delphi benutzt, aber jetzt scheint es eine gute Zeit zu sein. Vielen Dank! –

+1

Aus dem Lesen des gesamten Fragetextes habe ich eine Meinung entwickelt, was OP selbst einen Workaround herausfinden kann. – OnTheFly

+4

Ich würde vorschlagen, dass Sie diesen Code in den Abschnitt "Initialisierung" der Einheit verschieben. – TLama