ďťż

Ładny brzuch

Witam,

Wybaczcie jeśli moje pytanie jest banalne albo popełniam jakiś prosty błąd ale sprawa wygląda tak:

Mam zapisane w pliku binarnym dane pomiarowe. Jest ich 500000 po 2 bajty razem plik ma 1MLN bajtów.
Otwieram plik i czytam poleceniem BlokRead wszystkie dane na raz do tablicy statycznej i jest OK.
Jak to samo chcę zrobić ale do tablicy dynamicznej to wywala mi się aplikacja.

W czym tkwi błąd???

Po okrojeniu moje fragmenty kodu wyglądają tak:
DZIAŁAJĄCY
Buffer: array[0..500000] of word; NomberOfData := 500000; AssignFile(SrcFile, Name); Reset(SrcFile,1); BlockRead(SrcFile, Buffer, NomberOfData*2); ... bla bla bla .... Close(SrcFile);

a ten NIE DZIAŁA
Buffer: array of word; NomberOfData := 500000; AssignFile(SrcFile, Name); Reset(SrcFile,1); SetLength(Buffer, NomberOfData); BlockRead(SrcFile, Buffer, NomberOfData*2); ... bla bla bla .... Close(SrcFile);

POOOOOOOMOOOOOOOOOOOCYYYYYYYYYYYYYYYY........

Z góry dzięki
Użytkownik imcpan edytował ten post 17 marzec 2007, 10:33


Tablice dynamiczna najpierw trzeba utworzyc. ;->

@down: w sensie nadac rozmiar (SetLentght), czyli z tego co widze, wlasnie BufferTot powoduje blad (moge sie domyslac)
Użytkownik krajew4 edytował ten post 16 marzec 2007, 22:00
Po pierwsze nie krzycz. Po drugie w ktorym miejscu wywala Ci ten program?

// @UP: utworzyc? Co rozumiesz pod tym pojeciem? Ja nie bardzo zrozumialem co masz na mysli...
// A co to jest BufferTot?
// @Up&Down: Tak, tyle ze SetLength zostalo uzyte i stad moje pytanie bylo :). No a z tym wskaznikiem to czekam na wyjasnienie caly czas, bo wyglada od poczatku podejrzanie :).
Użytkownik Ali240 edytował ten post 16 marzec 2007, 22:34

// @UP: utworzyc? Co rozumiesz pod tym pojeciem? Ja nie bardzo zrozumialem co masz na mysli...
zaalokowac pamiec tablicy dynamicznej przez setlength();

z tego co widze to nie pokazales jak przypisujesz wartosc z BufferTot do tablicy? moze tam jest blad? tablice dynamiczne sa numerowane od 0 do (ilosc - 1), wiec ustawiajac dlugosc jak 500 000 najwyzszy indeks to 499 999
Użytkownik Deadeye edytował ten post 16 marzec 2007, 22:24


Przepraszam za pomyłkę,

BufferTot jest takie samo jak Buffer tyle że dwa razy większe. Obie tablice są alokowane przez SetLength() więc nie to powinno być przyczyną błędów. W procedurze BlokRead rzeczywiście powinno być Buffer ( tak jak to poprawiłem w pierwszym poście) a nie BufferTot ale jak mówię nie tu chyba leży "psina pogrzebana".

A program się wywala na czytaniu BlokRead.

Powtarzam sypiący się kod:
Buffer: array of word; NomberOfData := 500000; SetLength(Buffer, NomberOfData); AssignFile(SrcFile, Name); Reset(SrcFile,1); BlockRead(SrcFile, Buffer, NomberOfData*2); //<- Tutaj sie sypie ... bla bla bla .... Close(SrcFile);
Użytkownik imcpan edytował ten post 17 marzec 2007, 10:40
Jestes pewny ze tam sie wywala? Jezeli tak to nie do konca rozumiem (chyba ze delphi>6 inaczej dziala). Na D6 wywala sie na zwalnianiu tablicy dynamicznej. Sprawdzilem czym sie rozni tablica dyn od stat i okazuje sie ze roznice sa duze. Taki kodzik testkowy:
var buf1: array [0..1023] of byte; buf: array of byte; p: pointer; begin buf1[0] := 123; SetLength(buf, 1023); buf[0] := 123; // showmessage(inttostr(byte(pointer(@buf1)^))); p := pointer(integer(@buf1)+1); showmessage(inttostr(byte(p^))); // showmessage(inttostr(byte(pointer(@buf)^))); p := pointer(integer(@buf)+1); showmessage(inttostr(byte(p^)));
Jak widac po odpaleniu, buf1 wskazuje na piewszy element tablicy. Natomiast buf, wyglada na to ze wskazuje na miejsce w pamieci gdzie sa infromacje o naszej tablicy, lub cos w tym stylu.

// EDIT:
Ha!
var f: file; buf: array of char; begin AssignFile(f, 'c:\test.txt'); SetLength(buf, 100); Reset(F, 1); BlockRead(f, (@buf[0])^, 100); CloseFile(F);
Tak mozemy odczytac dane do dynamicznej :)

// Edit: Poprawilem buf i buf1 - pomylilem nazwy przy opisie
Użytkownik Ali240 edytował ten post 17 marzec 2007, 15:05

Jak widac po odpaleniu, buf wskazuje na piewszy element tablicy. Natomiast buf1, wyglada na to ze wskazuje na miejsce w pamieci gdzie sa infromacje o naszej tablicy, lub cos w tym stylu.

Mam wrażenie że powinno być odwrotnie. Dla statycznej przydział pamięci jest na stałe i nazwa tej tablicy winna wskazywac na jej pierwszy element. Z dynamiczna jest tak, że alokowana jest tylko jej nazwa, która przechowuje informacje o tym gdzie tablica się znajduje (po przydzieleniu pamięci). Sama tablica leży gdzie indziej. Przez to rzeczywiście mogłem miećproblemy z tym kodem.


(@buf[0])^
Tak mozemy odczytac dane do dynamicznej :)


Wprowadziłem proponowaną zmianę i jest OK.

DZIĘKI SERDECZNE Ali240!!!!!!!!!!

Ali240 !!!! Czy możesz przetłumaczyć jeszcze ten fragment na polski, c lub c++??

Coś kojarzę ten daszek jako wskaźnik ale nie jestem pewien a ta @ to już dla mnie abstrakcja :(

Porawilem juz to buf i buf1 - pomylilem nazwy jak opisywalem ;).

@x - zwraca wskaznik do x
integer(@x) - zamieniamy wkaznik na numeryczny adres
p^ - tak sie odwoluje do pamieci zawartej pod adresem na ktory wskazuje wskaznik p

Czyli (@buf[0])^ jest odwolaniem do pamieci gdzie znajduje sie pierwszy element tablicy.
Na c/c++ nie przetlumacze bo z wskaznikami tam zawsze jakis problem mam.

Co ciekawe okazuje sie ze delphi dopuszcza rowniez taka kostrukcje
BlockRead(f, buf[0], 100);
wiec nie trzeba sie bawic ze wskaznikami jednak :). Nawet nie pomylslalem ze taki sprytny kompilator jest w delphi :D.


Co ciekawe okazuje sie ze delphi dopuszcza rowniez taka kostrukcje
BlockRead(f, buf[0], 100);
wiec nie trzeba sie bawic ze wskaznikami jednak :). Nawet nie pomylslalem ze taki sprytny kompilator jest w delphi :D.


A to dlatego, że buf jest wskaźnikiem w którym jest adres buf[0], a buf[0] jest samym sobą czyli adresem pierwszego elementu tablicy i jednocześnie tymże elementem. Wszystko jest OK.

DZIĘKI też za tłumaczenie!

Na razie temat do zamknięcia.

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •