2013-08-26 63 views
8

Tôi đang cố gắng xác định một const trong Delphi (Delphi 2005 có nghĩa là) dựa trên các hằng số khác, nhưng Delphi phàn nàn về nó không phải là một biểu thức liên tục. Đây là mã của tôi trông giống như:Lỗi xác định hằng số trong Delphi

program myProgram; 

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

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

Tôi có thể làm ArraySize = Xpoints * Ypoints nhưng sqrt gây ra sự cố. Ý tưởng là tôi muốn mảng có kích thước bằng các hằng số Xpoints và Ypoints. Tôi có thể làm một cái gì đó như thế này:

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; 

cẩn thận để đánh giá quá cao giá trị gốc của hình vuông. Tất cả mọi thứ sẽ cập nhật một cách chính xác nếu tôi thay đổi sqrtXpoints hoặc sqrtYpoints, nhưng cách tiếp cận này chỉ có vẻ như vậy ... ngu ngốc.

Là một sửa chữa tạm thời tôi có thể đánh giá hằng số bản thân mình như thế này:

program myProgram; 

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

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

nhưng tôi không thích điều này vì arraySize không tự động cập nhật nếu tôi thay đổi Xpoints hoặc Ypoints.

Nó có vẻ như trình biên dịch nên biết làm thế nào để đánh giá một hằng số được định nghĩa là một hàm toán học của hằng số khác tại thời gian biên dịch cho những thứ như ví dụ trên và cho những thứ thậm chí đơn giản như thế này:

const 
    pi = 4.0*arctan(1.0); 

nhưng tôi không thể chấp nhận nó. Bất kỳ đề xuất? Cảm ơn trước sự giúp đỡ của bạn!

+1

Bạn chỉ đơn giản là không thể sử dụng hàm trong khai báo không đổi. –

+1

Trình biên dịch sẽ không đánh giá 'sqrt'. Bạn có thể, tôi giả sử, sử dụng hằng số đã nhập và sửa nó lúc khởi tạo. Bạn sẽ cần một vài cuộc gọi VirtualAlloc để thực hiện điều đó. –

+0

Một tùy chọn giải pháp khác là sử dụng trình biên dịch ít cầu kỳ hơn trên các biểu thức liên tục (fpc). – OnTheFly

Trả lời

7

Delphi không cho phép sử dụng hầu hết các hàm trong định nghĩa các hằng số. Nhưng bạn có thể dễ dàng giải quyết nó, chỉ cần sử dụng mảng động và bạn sẽ có thể tính toán tất cả những gì bạn muốn từ mã của mình:

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

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

end; 
+0

Cảm ơn bạn đã trả lời! Tôi đã hy vọng để tránh phân bổ bộ nhớ động, nhưng điều này trông rất đơn giản vì vậy tôi đã cho nó một thử và nó hoạt động tốt. Tôi chưa bao giờ sử dụng mảng động trong Delphi trước đây nhưng bây giờ có vẻ như một thời điểm tốt để bắt đầu. Cảm ơn nhiều! –

+1

Từ việc đọc toàn bộ nội dung câu hỏi, tôi đã phát triển ý kiến ​​về những gì OP có thể tự mình tìm ra cách giải quyết. – OnTheFly

+4

Tôi khuyên bạn nên di chuyển mã này đến phần 'khởi tạo' của đơn vị. – TLama