Segmentation fault - błagania o pomoc, człowiek na skraju wytrzymania

0

Witam,

Napisałem program:

int main()
{
    int n;
    scanf("%d", &n);
    int tab[n];

    for(int i=0; i<n; i++)
    {
        scanf("%d", &tab[i]);
    }

    //etap rozwiazywania
    int kubelki[n];
    for(int j=0; j<n; j++)
    {
        kubelki[j]=0;
    }

    for(int i=0; i<n; i++)
    {
        kubelki[tab[i]]= kubelki[tab[i]]+1;
    }

    // wypisz rozwiazanie
    for(int i=0; i<n; i++)
    {
        for(int j=kubelki[i]; j>0; j--)
        {
            printf("%d ",i);
        }
    }

    return 0;
}

OPIS:
Na wejściu podajemy ile liczb chcemy posortować <ENTER>, następnie te liczby,
Na wyjściu otrzymujemy posortowane.
Jak widać program jest banalnie prosty.

Pojawiają się tutaj 2 problemy:

  1. Gdy wrzucam na sprawdzaczkę to wyrzuca "Segmentation fault (core dumped)", dlaczego?
  2. U mnie na komputerze (Windows) program chodzi bezproblemowo, Code::Block nie zwraca żadnych błędów, a program działa działa poprawnie, jak to zmienić?

Z góry dzięki i wielkie ukłony, bo już prawie osiwiałem z tych nerwów :(

0
kubelki[tab[i]]= kubelki[tab[i]]+1;

Odnosisz się do x-tego elementu tablicy kubelki, gdzie x jest podane przez użytkownika. Jeśli jest większe lub równe podanemu n to wylatujesz poza tabelę i masz UB, a czasem crasha.

0
CzłowiekNaSkrajuNerw napisał(a):
  1. U mnie na komputerze (Windows) program chodzi bezproblemowo, Code::Block nie zwraca żadnych błędów, a program działa działa poprawnie, jak to zmienić?

Jakoś działa ale na pewno nie poprawnie, dla danych:
5 - ilosc
1 3 2 8 6 - liczby

Zwraca 1 2 3.

Błąd masz tam gdzie zwrócił uwagę @kq.
A nerwów byś sobie oszczędził gdybyś odpalił to pod debuggerem bo w 3 minuty byś ten błąd wyłapał.

0

Po pierwsze OGROMNE DZIĘKI! :)
@kq @v00gl , zaszczyt dla forum, że są tak życzliwi ludzie jak Wy ;)

v00gl <--- nie jest to błąd, gdy domyślnie podana ilość miała być górnym ograniczeniem (ale nie napisałem tego więc tutaj również przyznaję racje). W tym przykładzie co napisałeś miało być <0,5), etc.

Co do drugiego pytania, to jak mogę użyć tego debuggera, bo sprawdziłem i u mnie nie wykrywa on błędu?

Jeszcze raz @kq @v00gl czapki z głów za szybką i konkretną odpowiedź! :)

0

Dobra, błąd zrozumiałem, ale sprawdzaczka coś nadal się ze mną nie chciała pogodzić. Więc pomyślałem kij z tym kubełkowym, zrobię to QuickSortem. Wziałem pierwszy lepszy z internetu:

#include <stdio.h>

using namespace std;

void sortQ( int tab[], int left, int right )
{
    int i = left;
    int j = right;
    int x = tab[( left + right ) / 2 ];
    do
    {
        while( tab[ i ] < x )
             i++;

        while( tab[ j ] > x )
             j--;

        if( i <= j )
        {
            int x = tab[i];
            tab[i] = tab[j] ;
            tab[j]=x;

            i++;
            j--;
        }
    } while( i <= j );

    if( left < j ) sortQ( tab, left, j );

    if( right > i ) sortQ( tab, i, right );

}

int main()
{
    int n;
    scanf("%d", &n);
    int tab[n];

    for(int i=0; i<n; i++)
    {
        scanf("%d", &tab[i]);
    }

    sortQ(tab,0,n);

    for(int i=0; i<n; i++)
    {
        printf("%d ", tab[i]);
    }

    return 0;
}

No i u mnie pięknie działa ten CUDZY kod. Wrzucam na sprawdzaczkę, a tam co? Mój ulubiony segmentation fault. "Oh God why??" :( Dobrze, że nie posiadam broni pod ręką...

0

A jakie są zakresy danych? Bo robisz tu tablicę na stosie, co może się skończyć źle jeśli rozmiar tej tablicy może być za duży...

0

Piszesz w C czy C++ ? bo istnieją już gotowe mechanizmy, zgrabne przykłady:
http://ideone.com/JnALN1 C++
http://ideone.com/GyFMPn C

0

Dzięki bardzo za odzew :)

Spróbowałem jeszcze karolinna tych Twoich programów, no i już mam komplet errorów:

  • segmentation fault
  • illegall syscall
  • compilator error :D

Dzięki bardzo wszystkim za zaangażowanie, na razie daje sobie z tym spokój na kilka dni, muszę się psychicznie zregenerować i zajrzeć do tego po pewnym czasie.

Natomiast OGROMNE DZIĘKI za pomocność!

0

To spróbuj jeszcze valgrind/memcheck.

0

Ja na miejscu kolegi na skraju załamania napisałbym jakiej on "sprawdzaczki" używa, bo moim zdaniem tutaj może być problem, skoro ładne rozwiązania od @karolinaa mu się wysypują :)

3

A ja bym zmienił sposób alokacji tablicy bo idę o zakład że to tam leży problem...

1 użytkowników online, w tym zalogowanych: 0, gości: 1