2011-12-16 11 views
6

Czy istnieje sposób, w jaki mogę zadeklarować zmienną o adresie bezwzględnym, który ma pewne przesunięcie względem zmiennej, do której się odnosi. Na przykład, zamiast:Składnia zmiennej bezwzględnej lokalnej na inną zmienną z pewnym przesunięciem

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


jest jakiś sposób, że można zrobić:

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

(Przykładem jest tylko zilustrowanie, a nie koniecznie przydatne ..)

+1

Zadałem to samo pytanie na WP: RD/C kilka lat temu, a odpowiedź, którą otrzymałem, brzmiała "nie". I, o ile mi wiadomo, to naprawdę * jest * odpowiedzią. –

+1

(Przy okazji, wiesz, że twój pierwszy fragment jest rzeczywiście krótszy niż twój ostatni, prawda? :) –

+1

To, o co prosisz, to odpowiednik słowa kluczowego VC++ "__based". Nie ma takiej funkcji w Delphi (lub C++ Builder, jeśli o to chodzi). –

Odpowiedz

7

Nie, nie sądzę, że istnieje "rozszerzona składnia" słowa kluczowego absolute. Dokumentacja jest here i, o ile mi wiadomo, nie ma żadnych nieudokumentowanych funkcji związanych z tym słowem kluczowym.

+0

Dziękuję Andreas. Podczas wyszukiwania w Internecie to, co zauważyłem było "absolutne", wcale nie jest używane w ogóle. Tak więc nie liczyłem na zbyt wiele ... –

+0

'absolute' służy tylko do deklarowania zmiennych, które mają ten sam adres pamięci, a nie do deklarowania zmiennych, które są od siebie odsunięte. –

4

Nie ma żadnej składni tego, o co prosisz.

Co można zrobić, jest jednak użyć arytmetyki wskaźników (jeśli używasz wersji obsługującej go), np:

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

Bardziej wiarygodny podejściem jest zamiast użyć typu StrRec rekord, który jest to, co faktycznie zawiera String wewnętrznie:

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

Lub non wersja wskaźnik arytmetyka:

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

BTW, począwszy od D2009 +, jednostka System ma własną funkcję StringRefCount(), która odtwarza liczbę referencyjną ciągu.

+0

Dziękuję Ci Remy. Moje pytanie nie dotyczyło w szczególności liczby referencyjnej, to był tylko przykład. Przepraszam, jeśli mój przykład nie był tak dobry :). D2007 nie ma arytmetyki wskaźnika, ale będę pamiętał "PStrRec", by od teraz odliczać referencje, wydaje się to być bardziej poprawne niż to, co teraz robię (dopóki nie otrzymam wersji z "StringRefCount") . –

+0

Jeśli ktoś chce użyć "StrRec", musisz zadeklarować rekord, ponieważ jest w sekcji implementacji "system.pas". –

+0

W Delphi 2007 i poniżej możesz użyć funkcji 'Inc' i' Dec' do wykonania algorytmu wskaźnikowego. – Johan

Powiązane problemy