Zwalnianie pamieci zmiennej

0

Witam,
Otóz mam pewien problem poniewaz gdy wywoluje moj programik :

 Ilosc := '0';

 while ( Ilosc = '0') do
    begin
      Ilosc := IntToStr(func.MemReadInteger(Stan));
 end;

 if ( Ilosc <> '0') then
 begin
   SendData;
 end;

Zostaje na poczatku przypisana wartosc 0 i sie zgadza, pozniej jak odnajdzie wartosc <> od 0 to zmienia ja na X wartosc i wysyla Synapsa.. No i teraz wlasnie nie wiem jak zrobic, zeby z powrotem pozniej wrocilo do normy '0';
Probowalem poprzez przypisanie ponownie po wyslaniu danych

SendData;
Ilosc := '0';

Ale ciagle zapamietywalo te dane ktore wczesniej zczytalo.
Prosze o pomoc

0

A dlaczego nie masz w pętli obsługi wysyłania, tylko wychodzisz z niej i znów sprawdzasz jej wartość, po czym wysyłasz? To ma coś na celu? IMHO ten kod powinien wyglądać mniej więcej tak:

repeat
  Ilosc := Func.MemReadInteger(Stan);

  if Ilosc <> 0 then
   SendData();
until { warunek zakończenia wysyłania }

jednak nie wiem w jakim kontekście używasz tego kodu, więc nie wiem co będzie warunkiem zakończenia wysyłania; Tak samo nie wiem dlaczego konwertujesz rezultat metody Funk.MemReadInteger do łańcucha i w takiej postaci go sprawdzasz warunkiem; Podaj połny kod tej procedury/funkcji/metody/wtf a będzie można coś więcej napisać;

Nie wiem także co to ma wspólnego ze zwalnianiem pamięci po zmiennej; Typy proste jak liczby, łańcuchy, wartości ligiczne czy macierze zwalniane są automatycznie, chyba że sam je tworzysz przez wskaźnik (procedura New) - wtedy musisz ręcznie ją zwolnić (procedura Dispose).

0

To jest juz calosc:)
Konwertuje, poniewaz to zamienia adres z pamieci gry na wartosc Integer.
Chodzi o to zeby wlasnie ta 'Ilosc' po ukonczeniu petli znowu tak jakby stala sie

Ilosc := '0'; 

Poniewaz jak juz ta petla sie zakonczy i przekonwertuje ten adres na integer i wysle ja do skryptu, to zostaje w pamieci wlasnie zapamietana ta wartosc i znowu ja ponawia, zamiast znowu wyzerowac od 0.

0

To jest juz calosc:)

Pokaż cały kod tego czegoś - od begin po którym on występuje aż do end zamykającego tego begin;

Poniewaz jak juz ta petla sie zakonczy i przekonwertuje ten adres na integer i wysle ja do skryptu, to zostaje w pamieci wlasnie zapamietana ta wartosc i znowu ja ponawia, zamiast znowu wyzerowac od 0.

Nie możliwe żeby została w pamięci stara wartość po przypisaniu jej nowej (0) jeśli wskazuje na ten sam adres w pamięci... Spróbuj zaraz po wysłaniu danych procedurą SendData wyzerować ją, a całość podglądaj pod debugerem i krok po kroku sprawdzaj jej wartość - w ten sposób upewnisz się czy faktycznie zostaje wyzerowana czy nie; Najwyżej będziemy szukać dalej.

0
repeat
  Ilosc := Func.MemReadInteger(Stan);
 
  if Ilosc <> 0 then
   SendData();
until { warunek zakończenia wysyłania }

Byloby nie za dobrym rozwiazaniem,bo nic by nie zmienilo. Warunkiem konca musi byc

 until  Ilosc <> '0'

wiec jakbym wyzerowal po SendData(); Ilosc :='0';


To warunek nigdy by ie nie skonczyl, nawet jakby juz ta funkcja konwertowania zadzialala i zczytala poprawna wartosc.
Pozdrawiam
0

Napisz spokojnie co chcesz osiągnąć bo czytam cały temat już 3 raz i nie do końca rozumiem. Wygląda na to, że próbujesz zamotać prostą rzecz.

0

Skoro warunek ma się zakończyć jeśli Ilosc = 0 to:

repeat
  Ilosc := IntToStr(Func.MemReadInteger(Stan));
 
  if Ilosc <> '0' then
    SendData();
until Ilosc = '0';

a jeżeli nigdzie nie wykorzystujesz tego Ilosc (bo w podanym przez Ciebie kawałku nigdzie), to po co w ogóle ją używasz? Skoro SendData nie potrzebuje jej, to równie dobrze możesz to zakodzić tak:

while Func.MemReadInteger(Stan) <> 0 do
begin
  SendData();
end;

No chyba, że Ilosc to zmienna globalna...

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