Zmienne Staticzne i Inicjalizacja ???

0

Witam

Czy w delphi isnieje mozliwośc deklarowania zmiennych statycznych tj. takich ktore nie sa <ort>usowane </ort>po wyjsciu z funkcji, lub procedury? Ogolnie zmienne statyczna zachowuja sie jak zmienne globalne poza faktem ze ich nazwa widziana jest tylko wewnatrz funkcji, natomiast wartosc ustawiona w poprzednich wywolaniach danej funkcji nie ulega zmianie w wywolaniach nastepnych ( jezyk C oferuje zmienne tego tupu, no a w Delphi troche mi tego brakuje).

Oraz pytanie drugie czy isnieje mozliwość nadawania wartosci zmiennym podczas ich tworzenia - i znowu chodzi mi o te nieszczesne funkcje ktore alokujac miejsce na stosie dla zmiennych lokalnych nie zeruja ich powodujac ze maja one przypadkowe wartosci.

0
  1. Było.
  2. Istnieje taka możliwość - {$WriteAbleConst On} i F1.
  3. Nie można.
0
marcellli napisał(a)

Witam
Oraz pytanie drugie czy isnieje mozliwość nadawania wartosci zmiennym podczas ich tworzenia - i znowu chodzi mi o te nieszczesne funkcje ktore alokujac miejsce na stosie dla zmiennych lokalnych nie zeruja ich powodujac ze maja one przypadkowe wartosci.

a co złego jest w

procedure xxx;
var
  x: Integer;
begin
  x := 0;
  ...
end;

???

0

No oki ale co jesli zastosuje sie rekurencje.

procedure xxx;
var
X: Integer
Begin
X:=0
Inc(X);
If X < 4 then xxx;
End;

W rezultacie czegos takiego otrzymal bym przepiekne stack overfolow, z drugiej strony jesli zmienna X na pocztku nie bedzie miala wartosci 0 tylko przypadkowa np.: 8, albo co gorsza -2147483648

0

A że tak się zapytam: po co komu taka rekurencja? Ona nic nie robi. Prędzej coś takiego:

procedure rek(x: integer);
begin
if x<4 then rek(x+1);
end;

procedure cos;
var x:integer;
begin
x:=0;
rek(x);
end;

Co prawda to też nic nie robi, ale działa :)</delphi>

0
marcellli napisał(a)

No oki ale co jesli zastosuje sie rekurencje.

procedure xxx;
var
X: Integer
Begin
X:=0
Inc(X);
If X < 4 then xxx;
End;

W rezultacie czegos takiego otrzymal bym przepiekne stack overfolow, z drugiej strony jesli zmienna X na pocztku nie bedzie miala wartosci 0 tylko przypadkowa np.: 8, albo co gorsza -2147483648

ale czego to dowodzi??? Przecież za każdym wywołaniem procedury/funkcji jej zmienne są odkładane na stos.
Trzeba wiedzieć, co się chce zrobić i jak, a przede wszystkim trzeba czytać czego dotyczy odpowiedz. Zauważ, że moja odpowiedz nie dotyczy Twojego pytania o zmienne statyczne a o inicjowanie zmiennych podczas ich tworzenia.

0

chodzilo mi jedynie o pokazanie plapki tkwiacej w nadawaniu wartosci zmiennej wewnatrz funkcji rekurencyjnej. W rezultacie funkcja w kolejnych wywolaniach samej siebie bedzie zerowac kazdorazowo zmienna X co spowoduje ze zaglebianie sie na kolejne poziomy rekurencji bedzie trwalo w nieskonczonosc, bo warunek if X<4 then xxx zawsze bedzie prawdziwy.

Ponadto nijak ma sie to do nadawania wartosci zmiennej podczas jej tworzenia. Nie wiem byc moze teraz szeze herezje ale zmienne lokalni raczej nie sa tworzone po raz kolejny dla kazdego wywolania rekurencyjnego tej samej funcji, a jedynie przy jej pierwszym wykonaniu.

Przyznaje pomylilem sie z tym Stack Overfolow nie wiem czemu, ale dla powyzszej funkcji mimo iz wykonuje sie w nieskonczonosc przepelnienie nie wystepuje. (Swoja droga to ciekawe bo zapisywanie na stos chocby adresu powrotu kazdego z wywolan funkcji powinno go dosc szybko przepelnic - zakladajac ze rekurencja trwa w nieskonczonosc)

0
marcellli napisał(a)

chodzilo mi jedynie o pokazanie plapki tkwiacej w nadawaniu wartosci zmiennej wewnatrz funkcji rekurencyjnej. W rezultacie funkcja w kolejnych wywolaniach samej siebie bedzie zerowac kazdorazowo zmienna X co spowoduje ze zaglebianie sie na kolejne poziomy rekurencji bedzie trwalo w nieskonczonosc, bo warunek if X<4 then xxx zawsze bedzie prawdziwy.

Delphi nie ma zmiennych statycznych i wszelakiego rodzaju rekurencje, gdzie operuje się na zmiennych robi się tak jak podał Bula, czyli zmienną tą przekazuje się jako parametr (ew. jest to zmienna globalna).

Ponadto nijak ma sie to do nadawania wartosci zmiennej podczas jej tworzenia. Nie wiem byc moze teraz szeze herezje ale zmienne lokalni raczej nie sa tworzone po raz kolejny dla kazdego wywolania rekurencyjnego tej samej funcji, a jedynie przy jej pierwszym wykonaniu.

Ano szerzysz herezję :) zmienne lokalne "żyją" tylko tyle ile "żyje" ich procedura/funkcja i za każdym razem są tworzone od nowa.

Przyznaje pomylilem sie z tym Stack Overfolow nie wiem czemu, ale dla powyzszej funkcji mimo iz wykonuje sie w nieskonczonosc przepelnienie nie wystepuje. (Swoja droga to ciekawe bo zapisywanie na stos chocby adresu powrotu kazdego z wywolan funkcji powinno go dosc szybko przepelnic - zakladajac ze rekurencja trwa w nieskonczonosc)

Nie chce mi się sprawdzać, ale na 99% w SPACJA końcu się wykrzaczy</quote>

1 użytkowników online, w tym zalogowanych: 0, gości: 1