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!
Po prostu nie można korzystać z funkcji w stałych deklaracji. –
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. –
Inną obejściową opcją jest użycie kompilatora, który jest mniej wybredny w wyrażeniach stałych (fpc). – OnTheFly