Strona 1 z 2 12 OstatniOstatni
Pokaż wyniki 1 do 10 z 15

Temat: Błąd SIGSEGV (segmentation fault)

  1. #1

    Domyślnie Błąd SIGSEGV (segmentation fault)

    No więc napisałem program i mam błąd jak w temacie.
    Kilkanaście razy sprawdziłem kod i napisałem kilka wersji programu (małe zmiany) i nadal ów błąd występuję. Wiem, że on nadal jest, bo wrzucam to zadanie na SPOJa (pl.spoj.pl) i mi go wyskakuje, że program jest zły (błąd SIGSEGV w każdym z testów). Program się kompiluje oczywiście (również z dopiskiem -ggdb).
    Oto kod:
    Kod:
    // Autor: kokosoko
    
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(void)
    {
            long long int x, y, t, i, j, max=-10000000, min=10000000, min2=1000000000, k, tab[100001], tab2[100001],
    tab3[100001], ans;
    
            scanf("%lld",&t);
            for(i=0;i<t;i++)
            {
                    scanf("%lld %lld",&tab[i],&tab2[i]);
                    if(tab[i]>max)max=tab[i];
                    if(tab[i]<min)min=tab[i];
            }
            for(i=min;i<=max;i++)
            {
                    tab3[i]=0;
                    for(j=0;j<t;j++)
                    {
                            tab3[i]+=abs(tab2[j]);
                            tab3[i]+=abs(i-tab[j]);
                    }
                    if(tab3[i]<min2)
                    {
                            min2=tab3[i];
                            ans=i;
                    }
            }
            printf("%lld %lld\n",ans,tab3[ans]);
    
            return 0;
    }
    Przypuszczam, że coś z tablicami jest nie tak (np. wywołanie nieistniejącej części tablicy), ale jak analizowałem kod, to wszystko było ok.

    Gdyby komuś miało to pomóc w pomocy, tam jest treść zadania: https://pl.spoj.pl/problems/ETI07E5

    Dziękuję za każdą wskazówkę.

    PS Zapomniałem - wszystkie wyniki mam dobre (z testów i z forum polskiego SPOJa).

  2. #2

    Domyślnie

    Tablice int o tak dużym rozmiarze?
    4*100001=400004=390.62kB
    3 tablice to prawie 1M. Trochę za duże jak na stos. Spróbuj zadeklarować ja jako zmienne globalne,
    Ostatnio edytowane przez rafal44 : 07-04-2009 - 20:06
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

  3. #3

    Domyślnie

    Wprowadziłem tę poprawkę i teraz program wygląda tak (wkleję zmienioną część):
    Kod:
    // Autor: kokosoko
    
    #include<stdio.h>
    #include<stdlib.h>
            long long int x, y, t, i, j, max=-10000000, min=10000000, min2=1000000000, k, tab[100001], tab2[100001],
    tab3[100001], ans;
    int main(void)
    {
            scanf("%lld",&t);
            ...
    Ale nadal jest SIGSEGV.

  4. #4

    Domyślnie

    Nie zauważyłem że masz long long int,a to nie 4 bajty tylko osiem. Tablice są o wiele za duże.
    "a imię jego będzie czterdzieści i cztery"
    A. Mickiewicz Dziady cz. III

  5. #5

    Domyślnie

    Zmieniłem na zwykłego inta i też SPOJ pisze SIGSEGV. Ale na moim kompilatorze działa bez zarzutu (long long też).
    Może błąd jest nie w rozmiarze tablic, ale w wypisywaniu nieistniejącej czy coś w tym stylu?
    I zmieniłem jeszcze nawet rozmiary wszystkich tablic z: tab[100001] na: tab[1001] i nadal jest SIGSEGV, a powinno być błędna odpowiedź, jeśli wyniki tylko są złe.
    Ostatnio edytowane przez kokosoko : 07-04-2009 - 21:27

  6. #6
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie

    rafal44: Nie sa za duze. Wiele razy rozwiazujac zadanka np. z main.edu.pl definiowalem tablice long long majace milion elementow - sie wszystko miescilo. A tutaj mamy tylko 100 tysiecy elementow. Na pewno nie chodzi o to. Pewnie cos nie tak jest z programem, ale nie wiem co. Nie chce mi sie nim grzebac, bo bym musial przejrzec t zadanie na spoju, wglebic sie w twoj program, algorytm przeanalizowac itd. A na to nie mam ochoty Chce mi sie juz rzygac tymi calymi algorytmami od czasu OIG-a :P
    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

  7. #7

    Domyślnie

    napisz dokladnie co ten program ma robic to go napisze i sobie porownasz.
    Ostatnio edytowane przez kosiarz : 07-05-2009 - 09:04
    "dobrzy hakerzy są sławni na cały świat, ale o hakerach geniuszach nikt nic nie wie."

  8. #8
    Zarejestrowany
    Jul 2008
    Skąd
    Za twoimi plecami
    Postów
    351

    Domyślnie

    Black Coders | Hacking, Kernel, Linux, Operating Systems, Programming
    I otworzyła studnię Czeluści,
    a dym się uniósł ze studni jak dym z wielkiego pieca,
    i od dymu zaćmiło się słońce i powietrze.
    A z dymu wyszła szarańcza na ziemię,
    i dano jej moc jaką mają ziemskie skorpiony.
    (...)
    I dano jej nakaz aby nie zabijała,
    lecz aby przez pięć miesięcy cierpieli katusze...

  9. #9

    Domyślnie

    Zadanie podałem ( https://pl.spoj.pl/problems/ETI07E5 ), a oto co robi program (napiszę mój algorytm w myślnikach):
    -wczytuje liczbę punktów t

    -wczytuję t razy współrzędne punktów x i y

    -wyznaczam największą i najmniejszą wartość x, żeby określić zakres poszukiwań najkorzystniejszego miejsca na osi x dla ogniska z zadania

    -od najmniejszej do największej wartości x sprawdzam drogę jaką musi przebyć Jaś od kupy z liśćmi do ogniska (czyli sumę: wartości bezwzględnej z odległości punktów od osi x i: wartości bezwzględnej z odległości sprawdzanego punktu od danego punktu, na którym jest kupa liści (to jest najtrudniejsze do wytłumaczenia; w kodzie to:
    Kod:
    tab3[i]+=abs(tab2[j]);
    tab3[i]+=abs(i-tab[j]);
    )

    -wyznaczam najmniejszą wartość odległości od ogniska sprawdzanego punktu (czyli najkorzystniejszego - żeby Jasiowi było najbliżej do wszystkich punktów i powiedzmy - żeby się najmniej zmęczył)

    -wypisuję punkt, w którym droga Jasia będzie najkrótsza oraz wartość owej drogi w jednostkach układu współrzędnych

  10. #10

    Domyślnie

    zmień long long int na "long int" a potem możesz przetestować jak działa na 16 bitach "int" i będziesz wiedział czy problem nie leży po stronie niedoboru pamięci RAM jak robisz tyle obliczeń na 64 bitach.

    for(i=0;i<t;i++)
    {
    scanf("%lld %lld",&tab[i],&tab2[i]);
    if(tab[i]>max)max=tab[i];
    if(tab[i]<min)min=tab[i];
    }


    dla t=10mln policz sobie rezerwację RAMU. W ogóle zacznijmy od tego, że jak t=10mln to zabraknie nawet tyle miejsc w tablicy aby wykonać tą pętlę bo ilość slotów w tablicy jest znacznie mniejsza niż zdeklarowana wartość "t"
    Ostatnio edytowane przez Elitegroup : 07-09-2009 - 12:47

Strona 1 z 2 12 OstatniOstatni

Podobne wątki

  1. jaki błąd??
    By 4ndr1u in forum PHP/CGI/ASP/JSP/J2EE
    Odpowiedzi: 14
    Autor: 06-26-2008, 12:59
  2. Błąd w Mysql.
    By Geek_90 in forum Newbie - dla początkujących!
    Odpowiedzi: 2
    Autor: 06-11-2008, 22:27
  3. Błąd w kodzie!
    By (_Adamex_) in forum C/C++
    Odpowiedzi: 3
    Autor: 04-12-2008, 11:33
  4. Hack.pl błąd ?
    By Malcolm2600 in forum Security
    Odpowiedzi: 9
    Autor: 03-15-2008, 10:46
  5. Błąd w ling.pl ?
    By D Ogi in forum Hacking
    Odpowiedzi: 1
    Autor: 09-03-2006, 13:40

Tagi

Zasady Postowania

  • Nie możesz zakładać nowych tematów
  • Nie możesz pisać wiadomości
  • Nie możesz dodawać załączników
  • Nie możesz edytować swoich postów
  •  
Subskrybuj