2011-12-16 27 views
6

Có cách nào để tôi có thể khai báo một biến với địa chỉ tuyệt đối có một số thay đổi cho biến mà nó đề cập đến không. Ví dụ, thay vì:Cú pháp cho biến cục bộ tuyệt đối đối với biến số khác với một số bù đắp

function RefCount(const s: string): Integer; 
begin 
    Result := PInteger(Integer(s) - 8)^; 
end; 


là có một cách nào đó mà tôi có thể làm:

function RefCount(const s: string): Integer; 
var 
    Count: PInteger absolute s {- 8 ?} ; 
begin 
    Result := Count^; 
end; 

(Ví dụ là để minh họa mà thôi, nó không nhất thiết phải là hữu ích ..)

+1

Tôi đã hỏi cùng một câu hỏi về WP: RD/C cách đây vài năm và câu trả lời tôi nhận được là 'không'. Và, theo như tôi biết, điều đó thực sự * là * câu trả lời. –

+1

(Bằng cách này, bạn biết rằng đoạn mã đầu tiên của bạn thực sự ngắn hơn đoạn cuối cùng của bạn, phải không? :) –

+1

Những gì bạn về cơ bản yêu cầu là equivilent của từ khóa '__based' của VC++. Không có tính năng như vậy trong Delphi (hoặc C++ Builder, cho rằng vấn đề). –

Trả lời

7

Không, tôi không nghĩ có 'cú pháp mở rộng' của từ khóa absolute. Tài liệu là here và, theo như tôi biết, không có các tính năng không có giấy tờ liên quan đến từ khóa này.

+0

Cảm ơn bạn Andreas. Trong khi tìm kiếm trên web những gì tôi nhận thấy là 'tuyệt đối' không được sử dụng tất cả những gì nhiều cả. Vì vậy, tôi đã không hy vọng cho nhiều .. –

+0

'tuyệt đối' chỉ để khai báo các biến chia sẻ cùng một địa chỉ bộ nhớ, không phải để khai báo các biến được bù đắp lẫn nhau. –

4

Không có cú pháp cho những gì bạn yêu cầu.

gì bạn có thể làm, tuy nhiên, là sử dụng con trỏ số học (nếu bạn đang sử dụng một phiên bản hỗ trợ nó), ví dụ:

function RefCount(const s: string): Integer; 
begin 
    if s <> '' then 
    Result := (PInteger(s) - 2)^; 
    else 
    Result := 0; 
end; 

Một cách tiếp cận đáng tin cậy hơn là sử dụng các loại StrRec kỷ lục thay vào đó, mà là những gì một String thực sự chứa nội:

function RefCount(const s: string): Integer; 
begin 
    if s <> '' then 
    Result := (PStrRec(s) - 1)^.refCnt 
    else 
    Result := 0; 
end; 

Hoặc, phiên bản con trỏ số học phi:

function RefCount(const s: string): Integer; 
begin 
    if s <> '' then 
    Result := PStrRec(LongInt(s) - SizeOf(StrRec))^.refCnt 
    else 
    Result := 0; 
end; 

BTW, bắt đầu bằng D2009 +, đơn vị System có chức năng StringRefCount() riêng để truy xuất số tham chiếu của chuỗi.

+0

Cảm ơn bạn Remy. Câu hỏi của tôi không phải là đặc biệt về số lượng tham khảo, nó chỉ là một ví dụ. Xin lỗi nếu ví dụ của tôi không tốt như vậy :). D2007 không có số học con trỏ, nhưng tôi sẽ ghi nhớ 'PStrRec' để nhận số tham chiếu từ bây giờ, nó có vẻ đúng hơn sau đó những gì tôi đang làm bây giờ (cho đến khi tôi sẽ nhận được một phiên bản có 'StringRefCount') . –

+0

Nếu ai muốn sử dụng 'StrRec', bạn phải khai báo bản ghi, vì nó nằm trong phần thực thi của 'system.pas'. –

+0

Trong Delphi 2007 và dưới đây, bạn có thể sử dụng hàm 'Inc' và' Dec' để thực hiện thuật toán con trỏ. – Johan

Các vấn đề liên quan