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

2019-08-24 12:27

Rejestracja: 3 lata temu

Ostatnio: 19 minut temu

1

To dobrze rozumiem, ze blad byl w jedynym pliku ktorego do dzisiaj nie widzielismy? :P
edit: jednak widzielismy

edytowany 1x, ostatnio: stivens, 2019-08-24 12:31

Pozostało 580 znaków

2019-08-24 12:29

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0
stivens napisał(a):

To dobrze rozumiem, ze blad byl w jedynym pliku ktorego do dzisiaj nie widzielismy? :P

Nie no, w pierwszym poscie jest cala funkcja create_histogram ktora na sztywno byla ;p

for(int i = 0; i < 100; i++)       -------- 100 zmienione juz na out_size
{
    *(out + i) = 0;
}

Pozostało 580 znaków

2019-08-24 12:29

Rejestracja: 3 lata temu

Ostatnio: 19 minut temu

0

Okey, faktycznie :D

Pozostało 580 znaków

2019-08-24 12:36

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0
stivens napisał(a):

Okey, faktycznie :D

NO I POSZLO !!! Zajebiscie, ale tak szy siak nie doszlismy do tego zebym to ja mogl samemu wykrywac takie bledy, myslalem ze moge wyzerowac cala tablice sobie a nie tylko zaleznie od out_size.
Dziekuje wymiatasz.

Pozostało 580 znaków

2019-08-24 12:40

Rejestracja: 3 lata temu

Ostatnio: 19 minut temu

0
simonsoft napisał(a):
stivens napisał(a):

Okey, faktycznie :D

NO I POSZLO !!! Zajebiscie, ale tak szy siak nie doszlismy do tego zebym to ja mogl samemu wykrywac takie bledy, myslalem ze moge wyzerowac cala tablice sobie a nie tylko zaleznie od out_size.
Dziekuje wymiatasz.

Chyba @Delor

Pozostało 580 znaków

2019-08-24 12:40

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0

Teraz ten pierwszy program, co odwraca kolejnosc elementow wektora, przypuszczam ze blad moze byc w podobnym miejscu
Main:

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

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

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

Vector_utils.c :

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

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

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

screenshot-20190824124025.png

Pozostało 580 znaków

2019-08-24 12:41

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0
stivens napisał(a):
simonsoft napisał(a):
stivens napisał(a):

Okey, faktycznie :D

NO I POSZLO !!! Zajebiscie, ale tak szy siak nie doszlismy do tego zebym to ja mogl samemu wykrywac takie bledy, myslalem ze moge wyzerowac cala tablice sobie a nie tylko zaleznie od out_size.
Dziekuje wymiatasz.

Chyba @Delor

Delor tez wymiata, ale Ty mi caly czas towarzyszysz i tez pomagasz :D

Pozostało 580 znaków

2019-08-24 12:42

Rejestracja: 3 lata temu

Ostatnio: 19 minut temu

0

Pokaz unit_test_v2.c:703

A najlepiej funkcje UTEST12

I wprowadz ten zielony input u siebie w terminalu

edytowany 2x, ostatnio: stivens, 2019-08-24 12:44

Pozostało 580 znaków

2019-08-24 12:45

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0

screenshot-20190824124545.png

Czyli jak Nulla przekaze do funkcji?

Pozostało 580 znaków

2019-08-24 12:48

Rejestracja: 3 lata temu

Ostatnio: 19 minut temu

0

Yup, nie obslugujesz tego

edytowany 1x, ostatnio: stivens, 2019-08-24 12:49

Pozostało 580 znaków

Odpowiedz

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