2013-08-26 18 views
8

Próbuję zdefiniować const w Delphi (Delphi 2005), który jest oparty na innych stałych, ale Delphi narzeka, że ​​nie jest to wyrażenie stałe. To właśnie mój kod wygląda następująco:Błąd definiujący stałe w Delphi

program myProgram; 

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

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

mogłem zrobić ArraySize = Xpoints * Ypoints ale sqrt powoduje problemy. Chodzi o to, że chciałbym, aby tablica była wielkościowana przez stałe Xpoints i Ypoints. Mógłbym zrobić coś takiego:

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; 

uważając, aby nieco przeszacować pierwiastki kwadratowe dla skórki. Wszystko zmieni się poprawnie, jeśli zmienię sqrtXpoints lub sqrtYpoints, ale to podejście wydaje się takie ... głupie.

Jako tymczasowy fix mogę ocenić stała się tak:

program myProgram; 

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

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

ale nie podoba mi się to, bo ArraySize nie aktualizuje się automatycznie w przypadku zmiany Xpoints lub Ypoints.

Wydaje się, że kompilator powinien umieć ocenić stałą zdefiniowaną jako funkcja matematyczna innej stałej w czasie kompilacji rzeczy jak powyższym przykładzie, a dla jeszcze prostszych rzeczy tak:

const 
    pi = 4.0*arctan(1.0); 

ale nie mogę tego zaakceptować. Jakieś sugestie? Z góry dziękuje za twoją pomoc!

+1

Po prostu nie można korzystać z funkcji w stałych deklaracji. –

+1

Kompilator nie oceni 'sqrt'. Można, jak przypuszczam, użyć stałej maszynowej i naprawić ją w czasie inicjalizacji. Aby wykonać tę operację, potrzebujesz kilku wywołań VirtualAlloc. –

+0

Inną obejściową opcją jest użycie kompilatora, który jest mniej wybredny w wyrażeniach stałych (fpc). – OnTheFly

Odpowiedz

7

Delphi nie pozwalają na użycie większości funkcji w definicji stałych. Ale można łatwo rozwiązać, po prostu korzystać z dynamicznych tablic i będzie w stanie wyliczyć wszystko, co chcesz z kodem:

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

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

end; 
+0

Dzięki za odpowiedź! Miałem nadzieję uniknąć dynamicznego przydzielania pamięci, ale wyglądało to bardzo prosto, więc spróbowałem i działa dobrze. Nigdy wcześniej nie używałam tablic dynamicznych w Delphi, ale teraz wydaje mi się, że warto zacząć. Dziękuję Ci bardzo! –

+1

Po przeczytaniu całego tekstu pytania, opracowałem opinię, którą OP może samodzielnie rozwiązać. – OnTheFly

+4

Proponuję przeniesienie tego kodu do sekcji 'inicjalizacji'. – TLama