SIGSEGV problem z detekcja

Odpowiedz Nowy wątek
2019-08-23 12:25

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0

Witam, mam problem SIGSEGV, jednak uzywam QT Creatora i nie wiem jak go tutaj znalezc, bo nie wyskakuje mi, dopiero jak uploaduje program do testowania to sie wyswietla, moglby ktos pomoc mi w QT Creatorze ogarnac zebym mogl wykrywac? (Jest valgrind i Memcheck jakis ale nic sie nie dzieje jak klikne (screen)) Albo rozkminic co zle napisalem? Z gory dziekuje

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?

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 SIGSEGV
    }
}

main :

    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 :

#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 :

#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);
}

title
https://ibb.co/L9tDc7K ---- screen

edytowany 3x, ostatnio: kq, 2019-08-23 12:51

Pozostało 580 znaków

kq
2019-08-23 12:51
kq
Moderator C/C++

Rejestracja: 7 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Szczecin

0

Ciężko z pewnością odpowiedzieć na pytanie nie widząc całego kodu.

    display_vector(vec2, size);

To jest na pewno źle, bo nigdzie nie inicjalizujesz tab2, więc masz UB. Chociaż to powinno wyświetlić śmieci, a nie powodować SIGSEGV


Pozostało 580 znaków

2019-08-23 12:53

Rejestracja: 3 lata temu

Ostatnio: 21 minut temu

2019-08-23 12:58

Rejestracja: 11 lat temu

Ostatnio: 2 godziny temu

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

@simonsoft W której iteracji leci Ci sigsev? Tak jak napisał @KrzaQ powinieneś mieć śmieci a nie sigsev dopóty trzymasz się prawidłowego rozmiaru. Jeżeli read_vector zwraca Ci nie prawidłowy (za duży) rozmiar to faktycznie możesz się nadziać na sigsev.


Pozostało 580 znaków

2019-08-23 12:59

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0

Main z histogramu


#include <stdio.h>
#include <stdlib.h>
#include "vector_utils.h"

int main()
{
    int tab1[100], tab2[100];
    int *vec = tab1, *vec2 = tab2;

    printf("Podaj liczby: ");
    int size = read_vector(vec, 100, 0);
    if(size == -1)
    {
        printf("Incorrect input");
        exit(1);
    }
    if(size == 0)
    {
        printf("Not enough data available");
        exit(3);
    }

    for(int i = 0; i < size; i++)
    {
        *(vec2 + i) = *(vec + i);
    }

    int wynik = reverse_vector(vec, size);

    if(wynik == 1)
    {
        printf("Incorrect input");
        exit(1);
    }

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

    return 0;
}
edytowany 1x, ostatnio: simonsoft, 2019-08-23 13:00

Pozostało 580 znaków

kq
2019-08-23 13:01
kq
Moderator C/C++

Rejestracja: 7 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Szczecin

0

Pokaż jeszcze read_vector(). Kod na pierwszy rzut oka wydaje się poprawny, choć ma dziwną skłonność do stosowania nieczytelnej arytmetyki na wskaźnikach zamiast notacji tablicowej.


Pozostało 580 znaków

2019-08-23 13:23

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0
kq napisał(a):

Pokaż jeszcze read_vector(). Kod na pierwszy rzut oka wydaje się poprawny, choć ma dziwną skłonność do stosowania nieczytelnej arytmetyki na wskaźnikach zamiast notacji tablicowej.

int read_vector(int* tab, int size, int stop_value)
{
    if(tab == NULL || size <= 0 ) return -1;
    int sizeD = 0;

    while (sizeD < size)
    {
        int read = scanf("%d", &(*(tab + sizeD)));
        if ((read <= 0)) return -1;
        if (read != 1 || *(tab+sizeD) == stop_value) break;
        ++sizeD;
    }
    return sizeD;
}
edytowany 2x, ostatnio: simonsoft, 2019-08-23 13:23

Pozostało 580 znaków

2019-08-23 13:31

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

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

@simonsoft W której iteracji leci Ci sigsev? Tak jak napisał @KrzaQ powinieneś mieć śmieci a nie sigsev dopóty trzymasz się prawidłowego rozmiaru. Jeżeli read_vector zwraca Ci nie prawidłowy (za duży) rozmiar to faktycznie możesz się nadziać na sigsev.

No wlasnie wpienia mnie to, ze w kompilatorze u mnie normalnie dziala, a dopiero w testach sie wywala, chcialbym zeby w kompilatorze mi pokazywalo, uzywal ktos QT Creatora ?

Pozostało 580 znaków

kq
2019-08-23 13:35
kq
Moderator C/C++

Rejestracja: 7 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Szczecin

0

Qt Creator to moje podstawowe IDE do C++ :​)

Masz dostęp do danych testowych? Nie odpalałem, ale ten kod wygląda dobrze. Zamiast bawić się z valgrindem, odpal memory sanitizera (-lasan do linkera, -fsanitize=address do kompilatora) i zobacz czy nie narzeka dla przypadków skrajnych - 100, 101 elementów itd.


Pozostało 580 znaków

2019-08-23 13:44

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0
kq napisał(a):

Qt Creator to moje podstawowe IDE do C++ :​)

Masz dostęp do danych testowych? Nie odpalałem, ale ten kod wygląda dobrze. Zamiast bawić się z valgrindem, odpal memory sanitizera (-lasan do linkera, -fsanitize=address do kompilatora) i zobacz czy nie narzeka dla przypadków skrajnych - 100, 101 elementów itd.

Gdzie to sie wpisuje? Nie mam podane w ktorej iteracji SIGSEGV leci

edytowany 1x, ostatnio: simonsoft, 2019-08-23 13:45

Pozostało 580 znaków

kq
2019-08-23 13:55
kq
Moderator C/C++

Rejestracja: 7 lat temu

Ostatnio: 3 minuty temu

Lokalizacja: Szczecin

0
QMAKE_CFLAGS += -fsanitize=address
LIBS += -lasan

W pliku .pro.


edytowany 1x, ostatnio: kq, 2019-08-23 13:56

Pozostało 580 znaków

Odpowiedz

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

Robot: CCBot