2012-03-11 13 views
7

Należy pamiętać, że jest to tylko eksperyment myślowy.
Wiem, że globalne (statyczne) vary są złe, a łamanie zasięgu jest w każdym razie złym pomysłem.Czy istnieje sposób na zmianę lokalnej stałej pisanej z * poza * procedura, w której została zadeklarowana?

Rozważmy następujący kod:

function IsItChanged: integer; 
const 
    CanIBeChanged: integer = 0; 
begin 
    Result:= CanIBeChanged; 
end; 

Zakładając zapisywalnych stałe zostały włączone, w jaki sposób można zmienić wartość CanIBeChanged spoza zakresu funkcji to zadeklarowanej?

PS Nie Nie zamierzam nigdy używać tego kodu, to tylko kwestia, która jest przedmiotem zainteresowania.

Odpowiedz

12

Cóż, można to zrobić tylko przeciekając wskaźnik do zapisywanej stałej pisanej. Oto przykład, który trwa dość zawiłą drogę do wydrukowania liczbę Bestii:

program NaughtyNaughtyVeryNaughty;{$J+} 
{$APPTYPE CONSOLE} 
procedure Test(out MyPrivatesExposed: PInteger); 
const 
    I: Integer=665; 
begin 
    MyPrivatesExposed := @I; 
    inc(I); 
end; 

var 
    I: PInteger; 
begin 
    Test(I); 
    Writeln(I^); 
    Readln; 
end. 

Ponieważ zakres lokalny ogranicza się do funkcji w którym jest zdefiniowana, opisane powyżej podejście jest jedynym możliwym rozwiązanie.

+0

Jaki jest czas życia lokalnej zapisywalnej stałej? Dopóki kod nie opuści metody (jak normalna zmienna lokalna), czy jest udostępniony? W pierwszym przypadku twój kod ma niezdefiniowane zachowanie. – CodesInChaos

+1

@CodeInChaos To naprawdę dziwaczna konstrukcja. Są to naprawdę zmienne globalne. Odpowiednik locali C z pamięcią statyczną. –

+0

Niejasno pamiętałem coś takiego, ale nie byłem już pewien. – CodesInChaos

Powiązane problemy