Ĺ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
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.