Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C++ - Sprawdzenie programów - operacje na plikach

JimmyB 23 Sty 2014 00:00 1314 6
  • #1 23 Sty 2014 00:00
    JimmyB
    Poziom 11  

    Witam,
    Mam prośbę: czy mógłby mi ktoś sprawdzić poniższe programy?

    Kod: cpp
    Zaloguj się, aby zobaczyć kod

    0 6
  • #2 23 Sty 2014 00:48
    the_fifth_horseman
    Poziom 32  

    Z góry powiem: Gdybym oceniał to jako zadanie, byłoby z tobą cienko.

    Nie wiem z czego się uczyłeś C++ - ani jaki heretyk cię uczył - ale nie umiesz podstaw.

    Raz po raz używasz niezainicjalizowanego bufora.
    Twój kod wygląda jakbyś zakładał że fstream::read() automatycznie zaalokuje pamięć. Tak się nie stanie.
    W reverse() używasz char (1 bajt) gdzie powinieneś użyć int (4 bajty). Sposób w jako korzystasz z tablicy liczby jest... potworny. Inicjalizujesz jej rozmiar korzystając z niezainicjalizowanego inta. Następnie wpisujesz do wskaźnika wskazanego przez NIEZAINICJALIZOWANY wskaźnik (czytaj: do losowego miejsca w pamięci) adres tablicy typu char.
    Następnie widzę że spodziewasz się że tablica będzie się dynamicznie rozszerzać wraz z wzrostem n. Tak się nie stanie.

    0
  • #3 23 Sty 2014 18:45
    JimmyB
    Poziom 11  

    Generalnie, to dynamicznej alokacji się uczyłem sam, na zajęciach jeszcze tego nie było, więc lepiej, żebym teraz popełnił te błędy niż w przyszłości. Dlaczego tablica się nie rozszerzy wraz ze wzrostem n?

    0
  • #4 23 Sty 2014 20:38
    the_fifth_horseman
    Poziom 32  

    Dlatego że w C i C++, tablice mają stały rozmiar.
    Tablice tworzone dynamicznie można rozszerzyć używając realloc(), ale jeżeli tworzysz tablicę używając składni <typ>[n] , to rozmiar jej nadany będzie równy wartości jaką miała zmienna n w momencie utworzenia tablicy.

    Masz dwa wyjścia:
    Pierwszym jest ustalenie jaki jest rozmiar pliku przed utworzeniem tablicy.
    Drugim jest wykorzystanie bardziej odpowiedniej struktury - w tym przypadku polecam stos (stack) lub wektor .

    0
  • #5 25 Sty 2014 23:54
    JimmyB
    Poziom 11  

    Z tego, co wiem, operatory new i delete w C++ działają tak samo jak malloc(), realloc() i free() z C. Czyż nie?

    0
  • #6 26 Sty 2014 10:37
    the_fifth_horseman
    Poziom 32  

    Aaa, przepraszam. Z jakiegoś powody zdawało mi się że jeden z buforów alokujesz statycznie.
    Owszem,
    new == malloc()
    delete == free()

    0
  • #7 30 Sty 2014 01:52
    JimmyB
    Poziom 11  

    Zatem programy są napisane poprawnie? (oprócz reverse?)

    0