Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

c++ - błąd _BLOCK_TYPE_IS_VALID podczas uruchamiania

conan8 12 Oct 2014 20:10 1635 7
  • #1
    conan8
    Level 7  
    Witam. Mam do napisania program, oto treść 'zadania' :
    Zdefiniuj typ strukturalny zawierający 3 pola (int, char, double ). Następnie zaimplementuj funkcje do
    obsługi zdefiniowanego typu:
    1. losowanie – funkcja:
    a) pobiera jako argument liczbę N struktur, które mają zostad utworzone;
    b) dynamicznie alokuje pamięć na tablicę N wskaźników na struktury;
    c) następnie alokuje kolejno N struktur, przypisując uzyskane adresy do kolejnych komórek
    utworzonej wcześniej tablicy;
    d) pole typu int (32 bity) jest ustawiane na wartośd losową pomiędzy 0 a 1 000 000; pole typu
    char jest ustawiane na losową literę z zakresu A-Z; a pole typu double jest ustawiane na 0;
    e) funkcja zwraca adres tablicy.
    2. kasowanie – funkcja:
    a) pobiera wskaźnik na tablicę struktur i jej wielkość (liczba przechowywanych wskaźników na
    struktury);
    b) zwalniana jest najpierw kolejno pamięć zajęta przez wszystkie przechowywane struktury;
    c) następnie zwalniana jest również pamięć zajęta przez samą tablicę.
    3. sortowanie – funkcja:
    a) pobiera wskaźnik na tablicę struktur i jej wielkośd;
    b) elementy tablicy (wskaźniki na struktury) sortowane są dowolną metodą według pola
    zawierającego liczbę int w porządku rosnącym.
    4. zliczanie znaków – funkcja:
    a) pobiera wskaźnik na tablicę struktur oraz jej wielkośd oraz znak do wyszukania;
    b) przeszukuje kolejno struktury w poszukiwaniu zadanego znaku i w przypadku jego znalezienia
    zwiększa licznik wystąpieo o 1.
    c) zwraca liczbę wystąpień znaku.
    Program po uruchomieniu wczytuje plik wejściowy inlab01.txt
    Plik inlab01.txt zawiera w pierwszej linii kolejno liczbę struktur N do wylosowania z zakresu 0 do 100000
    i w drugiej linii – znak X do wyszukania z zakresu A-Z
    Następnie wywoływana jest sekwencja funkcji (dalej w funkcji main())
    1. czas start;
    2. losowanie N elementów;
    3. sortowanie;
    4. zlicz znaki X;
    5. kasowanie;
    6. czas stop;
    Program wypisuje na konsoli czas wykonania oraz liczbę wyszukanych znaków.

    Dołączam kod. Przy kompilacji nie ma żadnych błędów. natomiast przy próbie uruchomienia programu wyskakuje błąd: _BLOCK_TYPE_IS_VALID ( pHEAD->nBlockUse) i program nie działa. Chyba jest to coś zwiazanego z jakimś wyciekiem pamięci, czy czymś podobnym w funkcji kasowanie, ale ja nic nie dostrzegam. Proszę o pomoc.

    Code: cpp
    Log in, to see the code
  • Helpful post
    #2
    witoldwitoldowicz
    Level 28  
    Po pierwsze tablica = (el_nowy **)malloc(sizeof(el_nowy*)*N);//alokujesz wskaźniki
    po drugie malloc zwalniasz przez free. W C++ lepiej używać new i delete.
    Po trzecie sortowanie nie działa.
  • Helpful post
    #3
    mcvsama
    Level 16  
    conan8: To jest raczej C niż C++, delete jest tutaj chyba jedyną rzeczą typową dla C++. Jeśli koniecznie ten kod chcesz kompilować za pomocą kompilatora C++ i używać new/delete, to pamiętaj, że tablice zwalnia się przez delete[], nie samo delete.
  • #4
    conan8
    Level 7  
    dzięki, a jakaś wskazówka co do sortowania?
  • #6
    conan8
    Level 7  
    Wprowadziłem takie zmiany, kompiluje się i tym razem taki błąd: _CrtIsValidHeapPointer(pUserData)

    Code: cpp
    Log in, to see the code
  • Helpful post
    #7
    mcvsama
    Level 16  
    Przyjrzyj się funkcji sortującej - najpierw kopiujesz przez wartość
    Code: cpp
    Log in, to see the code
    potem podmieniasz same wskaźniki
    Code: cpp
    Log in, to see the code
    a na końcu znowu przez wartość
    Code: cpp
    Log in, to see the code
    Zamień typ tmp na wskaźnik do el_nowy
    Code: cpp
    Log in, to see the code
    (swoją drogą, czemu taka nazwa?) i podmieniaj same wskaźniki.

    Teraz jest tak, że masz wyciek pamięci, bo nadpisujesz jeden wskaźnik drugim, ale tego pierwszego tak naprawdę nie skopiowałeś. Zamiast tego masz dwa takie same wskaźniki w tablicy po wykonaniu tamtych kroków. Przy zwalnianiu wychodzi na to, że dwukrotnie (lub więcej) próbujesz zwolnić tę samą pamięć.
  • #8
    conan8
    Level 7  
    Teraz już działa, wielkie dzięki za pomoc ;>