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++] Tworzenie kopca - program działa tylko w debbugerze

chrysophylax 21 Mar 2010 17:24 2594 4
  • #1 21 Mar 2010 17:24
    chrysophylax
    Poziom 2  

    Witajcie :) Mam pewien problem ze stworzonym przez siebie programem, który stwarza kopiec w oparciu o tablicę dynamiczną. Program ma zadane 4 funkcje - tworzenie w.w. kopca, wypełniając go generowanymi pseudolosowo liczbami od 1 do 10; wyświetlenie jego zawartości (nie mam jej jeszcze dobrze opracowanej); dodanie elementu na koniec i naprawę kopca oraz pobranie elementu maksymalnego, po czym dodanie na jego miejsce elementu ostatniego i ponowne naprawienie kopca.

    Problemem jest pojawiający się czasem segmentation fault pod linuxem (przy CC) / wyłączenie się programu pod dev-C++. Co ciekawe, program działa prawidłowo pod debbugerem dev'a, nie powodując zawieszania się w trakcie :) Moje umiejętności programistyczne nie są najwyższe, więc będę Wam wdzięczny za każdą merytoryczną pomoc.

    W załączniku program

    0 4
  • Pomocny post
    #2 22 Mar 2010 18:35
    akaz_
    Poziom 13  

    Witaj,
    segfaulty będą się pojawiać zawsze, gdy podasz za duże wartości, które wczytuje program lub niepoprawne dane.
    Jeżeli dasz rozmiar tablicy typu 99999999999999999999999999999999 bądź "A",
    wysegfaulci się z powodu braku pamięci.

    Jeżeli segfaulci się w innych przypadkach, napisz konkretnie jakich, pomoże to szukać przyczynę błędu.

    Swoją drogą, stos można zaimplementować w cpp w paru linijkach kodu używając
    STLa (biblioteka standardowa), więcej tutaj: Link.
    Ogólnie polecam zapoznać się z całą wyżej podaną witryną, jest to prawdziwa kopalnia wiedzy o CPP.

    0
  • #3 26 Mar 2010 17:36
    chrysophylax
    Poziom 2  

    Wektor znam i używam, ale chodziło mi o używanie operatorów new i delete w tym programie. Segmentation prawdopodobnie wyskakuje w wyniku przekraczania zadeklarowanego zakresu przy używaniu funkcji dodającej element lub ściągającej z góry kopca, ale nie mogę właśnie znaleźć tego miejsca w programie. Nie mniej, dzięki serdecznie za link do stronki, przyda się :)

    0
  • #5 29 Mar 2010 00:23
    Dr.Vee
    VIP Zasłużony dla elektroda

    Alternatywnie uruchom program pod kontrolą debuggera. Np w linuxie:

    Code:
    gdb nazwa_programu

    Później
    Code:
    gdb> run

    Gdy program dostanie sygnał SIGSEGV kontrola zostanie przekazana do gdb.
    Używając komendy backtrace zobaczysz ciąg wywołań funkcji, który doprowadził do operacji na niedozwolonym fragmencie pamięci.
    Możesz użyć komendy frame X (gdzie X to numer zwrócony przez komendę backtrace) do przemieszczania się po stosie wywołań.
    Komenda list wypisze Ci ostatni wykonywany fragment kodu, a komenda print XXX wypisze wartość wyrażenia (zmienna, element tablicy, wskaźnik itp) XXX.

    Powodzenia :)
    Dr.Vee

    0