Zerowanie tablic

0

Czy w ten sposób, zadeklaną tablice można jakoś wyczyścić?

const
N=5000;
var
tablica: array[1..N,1..4] of string;
begin
//... coś tam coś tam...
end;

Do tej tablicy wczytuje dane, i chcę aby przed kolejnym wczytaniem innych danych, wyczyścić jej wszystkie elementy. Wiem że można pętlą.

for k:=1 to N do
begin
 tablica[n,1]:='';
 tablica[n,2]:='';
 tablica[n,3]:='';
 tablica[n,4]:='';
end;

A może jest jakieś magiczne polecenie ;P takiego typu jak: Edit1.Clear;?

0

Jak stringi to tylko pętlami:

for k:=1 to N do
  for m:=1 to 4 do
    tablica[k, m]:='';

Nie jest to wiele kodu, co?

0

A jednak to nie ma magicznego słowa :)
To w takim razie pozostane przy tej wersji
OK. dzięki

0

To powinno wystarczyć:

ZeroMemory(@tablica, sizeof(tablica));
0

Nie nie, stringi w Delphi nie sa pakowane bezposrednio w miejsce ich deklarowania (czyli np tu w tablicy) tylko alokowane gdzies na stercie a w tablicy sa wskazniki do nich. Takie cos (choc glowy nie dam) moze wyciek zrobic.

0

Też tak na początku myślałem, ale zajrzałem do helpa i zobaczyłem coś takiego:

Dynamic-array variables are implicitly pointers and are managed by the same reference-counting technique used for long strings. To deallocate a dynamic array, assign nil to a variable that references the array or pass the variable to Finalize; either of these methods disposes of the array, provided there are no other references to it.

Czyli po mojemu podczas przypisywania stringowi (czyli defakto wskaźnikowi do niego) wartość nil dealokujemy go. To samo się tyczy tablic dynamicznych.

0

Ty nie przypisujesz zmiennej (wskaźnikowi) wartości nil, tylko zapisujesz zerami pewien obszar pamięci. Dla kompilatora to nie to samo. On nie zwolni pamięci zaalokowanej dla tych ciągów i tak jak mówi Wolverine, spowoduje to wyciek pamięci.

0
Bula napisał(a)

Czyli po mojemu podczas przypisywania stringowi (czyli defakto wskaźnikowi do niego) wartość nil dealokujemy go. To samo się tyczy tablic dynamicznych.

O ile się nie mylę, to do stringa przypisanie pustego łańcucha () spowoduje także jego dealokację, ale głowy sobie nie dam za to uciąć. Natomiast, Bula: kompilator zarządza czasem życia m.in. długich łańcuchów. Jednak musi wyraźnie widzieć, gdzie dany łańcuch jest widoczny, zmieniana jego wartość etc. Twoje rozwiązanie może to utrudnić i dlatego nie jestem przekonany, czy ZeroMemory() zwolni te łańcuchy. Bezpieczniejsza jest pętla z jawnym przypisaniem WartoscTypuString := lub WartoscTypuString := nil (w tym ostatnim może być konieczne rzutowanie, ale przy nim patrz: uwaga wyżej o czasie życia). Co do tego tematu: polecam lekturę Delphi 4. Vademecum profesjonalisty.

// Edited:
Bula, błądzić jest rzeczą ludzką. Ale wyrazy uznania za umiejętność przyznania się do błędu - nie każdy to potrafi. :)

0

Macie rację. Zrobiłem sobie przed chwilą test i wyszło z niego, że ZeroMemory, w przeciwieństwie do przypisania pustego łańcucha znaków, nie zwalnia pamięci zarezerwowanej na string. Niniejszym chciałbym przeprosić autora postu za wprowadzenie w błąd.

0

Bula, nie ma problemu. [browar]

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