Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

SIGSEGV problem

Ostatnio zmodyfikowano 2019-08-23 16:52
Autor Wiadomość
Simonsoft
Temat założony przez niniejszego użytkownika
SIGSEGV problem
» 2019-08-23 11:27:37
Witam, mam problem bo wyskakuje mi SIGSEGV w testach, uzywalem QT Creator i nie mam pojecia co zrobic zeby w debugowaniu znajdowal mi te bledy.
Problem pojawia sie w tutaj. Mógłaby jakas dobra dusza pomoc?

C/C++
int reverse_vector( int * tab, int size )
{
    if( tab == NULL || size <= 0 ) return 1;
   
    int temp;
    for( int i = 0; i < size / 2; i++ )
    {
        temp = *( tab + size - i - 1 );
        *( tab + size - i - 1 ) = *( tab + i );
        *( tab + i ) = temp;
    }
    return 0;
}

void display_vector( const int * tab, int size )
{
    for( int i = 0; i < size; i++ )
    {
        printf( "%d ", *( tab + i ) ); <----------------tutaj pokazuje blad
    }
}

main :
C/C++
int tab1[ 100 ], tab2[ 100 ];
int * vec = tab1, * vec2 = tab2;

printf( "Podaj liczby: " );
int size = read_vector( vec, 100, 0 );

int wynik = reverse_vector( vec, size );

display_vector( vec2, size );
printf( "\n" );
display_vector( vec, size );

Kolejny SIGSEGV w programie o Histogramie mam, tylko tutaj mi nie pokazuje w ktorej lini jest zle :

C/C++
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "vector_utils.h"

int read_vector_float( float * vec, int size, float stop_value )
{
    if( vec == NULL || size <= 0 ) return - 1;
   
    int sizeD = 0;
    float temp;
   
    for( int i = 0; i < size; i++ )
    {
        if( scanf( "%f", & temp ) != 1 )
        {
            return - 1;
        }
        if( temp == 0 )
        {
            return 0;
        }
        sizeD++;
        if( temp == stop_value )
        {
            sizeD--;
            break;
        }
        *( vec + i ) = temp;
    }
    return sizeD;
}

int create_histogram( const float * vec, int size, int * out, int out_size )
{
    if( vec == NULL || size <= 0 || out == NULL || out_size <= 0 ) return 1;
   
    for( int i = 0; i < 100; i++ )
    {
        *( out + i ) = 0;
    }
   
    for( int j = 0; j < size; j++ )
    {
        float a = 0, c = 0, b = 1;
        a = *( vec + j );
       
        for( int i = 0; i < out_size; i++ )
        {
            if( a >= c && a < b )
            {
                *( out +( int ) c ) += 1;
            }
            c++;
            b++;
        }
       
    }
    return 0;
}

void display_vector( const int * tab, int size )
{
    int i;
    for( i = 0; i < size; i++ )
    {
        printf( "%d ", *( tab + i ) );
    }
}

main :
C/C++
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "vector_utils.h"

int main()
{
    float tab1[ 100 ];
    float * vec = tab1;
   
    int tab2[ 100 ];
    int * out = tab2;
    int size = 0;
   
    printf( "Podaj liczby:\n" );
   
    size = read_vector_float( vec, 100, - 1 );
   
    int hist = create_histogram( vec, size, out, 11 );
   
    display_vector( out, 11 );
}
P-175090
DejaVu
» 2019-08-23 11:30:53
Zapewne wychodzisz gdzieś poza zakres tablicy. Pod linuxem masz GDB, a pod Windowsem masz Visual Studio z debuggerem.
P-175091
Simonsoft
Temat założony przez niniejszego użytkownika
» 2019-08-23 11:37:01
No wlasnie wiem, ze pointer wskazuje na nic, albo wychodze poza zakres, ale denerwuje mnie to ze nie w QT Creatorze nie moge wykrywa mi tego, jest jakis Memcheck valgrinda ale nie wiem jak z tego korzystac bo po kliknieciu nic sie nie robi, screen z QT, czy jest opcja zeby w tym programie tez wygrywac SIGSEGVy?
https://ibb.co/L9tDc7K
P-175092
DejaVu
» 2019-08-23 11:39:53
Musisz w debuggerze doprowadzić najpierw do crasha, a potem otworzyć okienko z callstackiem i zobaczyć jaka funkcja została wywołana jako ostatnia i w której linijce naruszono ochronę pamięci.

/edit:
http://cpp0x.pl/kursy/Kurs-C++​/Poziom-X​/Debugowanie-na-przykladzie-Vi​sual-Studio-2017​/586

Tutaj masz pierwszy screen dla Visual Studio - odpalasz debuggerem program i otrzymujesz miejsce błędu w kodzie. Na pierwszym screenie widzisz callstacka, czyli kolejność wywoływania metod. Jeżeli używasz QT Creatora to on zapewne używa debuggera GDB.
P-175093
Simonsoft
Temat założony przez niniejszego użytkownika
» 2019-08-23 11:41:16
Tylko ze u mnie program dziala i jest efekt koncowy taki jaki powinien byc, tylko w testach, gdzie uploaduje programy wyskakuje SIGSEGV
P-175094
DejaVu
» 2019-08-23 11:45:19
No to prawdopodobnie masz za małą tablicę, bo Twoja tablica ma 100 elementów, a testy na serwerze zapewne mają dużo większy zestaw danych wejściowych.

Przeczytaj treść zadania jakie są górne ograniczenia danych.
P-175095
Simonsoft
Temat założony przez niniejszego użytkownika
» 2019-08-23 11:50:44
(maksymalnie 100, w przypadku mniejszej liczby danych wartość -1 będzie oznaczała koniec wprowadzania danych)
P-175096
DejaVu
» 2019-08-23 12:36:15
A sprawdziłeś jak Twój algorytm zachowuje się dla skrajnych danych? np. zero elementów, max elementów, jeden element w histogramie, max elementów w histogramie.
P-175097
« 1 » 2
  Strona 1 z 2 Następna strona