SIGSEGV problem z detekcja

Odpowiedz Nowy wątek
2019-08-23 12:25
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:52
0
stivens napisał(a):

Yup, nie obslugujesz tego

aha, dobra, to juz wiem przynajmniej gdzie patrzec jak mi sie cos takiego wyswietla, spoko jest progress Extra.
Czyli wystarczy ze dopisze do display_vector :

if(tab == NULL || size <= 0) return cos tam;
Tylko teraz pytanie co? Incorrect inpurt czy Not enough data available?

Pozostało 580 znaków

2019-08-24 12:54
0

Zobacz sygnature
void display_vector

void ...


Nie musisz sprawdzac czy size > 0 bo for sie iteruje od 0 a jak bedzie warunek "0 < -9" to to zwroci false i petla sie nie wykona


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110

Pozostało 580 znaków

2019-08-24 13:00
0
stivens napisał(a):

Zobacz sygnature
void display_vector

void ...


Nie musisz sprawdzac czy size > 0 bo for sie iteruje od 0 a jak bedzie warunek "0 < -9" to to zwroci false i petla sie nie wykona

No wiem wlasnie, czyli w display_vectorze mam zatrzymac program ?
sprawdzam size <= 0 bo jak mi w tescie poda bledne dane to musi wywalic chyba

Wpisalem :
if(tab == NULL || size <= 0) exit(1);

ale zle bo :

screenshot-20190824130504.png

edytowany 1x, ostatnio: simonsoft, 2019-08-24 13:05

Pozostało 580 znaków

2019-08-24 13:06

return;


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110

Pozostało 580 znaków

2019-08-24 13:10
1
stivens napisał(a):

return;

Extra !! Poszlo, no to teraz w zabojczym tempie zadania beda lecialy.:P
Dziekuje bardzo za pomoc, pewnie zaraz bede robil jakiegos kolejnego posta bo bedzie problem, Stivens dzieki bardzo mi pomogles, teraz wiem lepiej jak znajdywac te problemy.
Biore sie za wyszukiwarke 2D i macierz diagonalnie dominujaca teraz.

Pozostało 580 znaków

2019-08-24 16:32
0

Stary mam jeszcze jedno pytanie, bo jest nowe zadanie, nie wiem czy tworzyc nowy temat?

Napisz funkcję do wyszukiwania indeksu zadanego elementu w tablicy. Funkcja powinna zwracać indeks znalezionego elementu lub -1 jeżeli szukany element nie wystąpił w tablicy.

int find(const int* tab, int size, int to_find)

Funkcja zwraca:

Indeks znalezionego elementu. W przypadku przekazania wartości NULL jako tab funkcja powinna kontynuować poprzednie wyszukieanie oraz zignorować parametr size.
-1 jeżeli nie można znaleźć elementu lub
-2 w przypadku podania błędnych danych.

I teraz nie wiem jak to zrobic, skoro tablica jest const, to nie moge jej zmieniac, Myslalem zeby zrobic dodatkowa funkcje sprawdzajaca ile razy kazda liczba sie powtarza, ale nie wiem. Bo
find zwraca zawsze 1 element tylko i potem jak to zrobic zeby jak sie znowu wywola pamietalo o tym ze juz jeden element zwrocilo?

W jaki sposob podejsc do tego zadania?

edytowany 1x, ostatnio: simonsoft, 2019-08-24 16:32
nowe zadanie - nowy temat - kq 2019-08-24 20:03

Pozostało 580 znaków

2019-08-24 18:46
0
simonsoft napisał(a):

Stary mam jeszcze jedno pytanie, bo jest nowe zadanie, nie wiem czy tworzyc nowy temat?

Napisz funkcję do wyszukiwania indeksu zadanego elementu w tablicy. Funkcja powinna zwracać indeks znalezionego elementu lub -1 jeżeli szukany element nie wystąpił w tablicy.

int find(const int* tab, int size, int to_find)

Funkcja zwraca:

Indeks znalezionego elementu. W przypadku przekazania wartości NULL jako tab funkcja powinna kontynuować poprzednie wyszukieanie oraz zignorować parametr size.
-1 jeżeli nie można znaleźć elementu lub
-2 w przypadku podania błędnych danych.

I teraz nie wiem jak to zrobic, skoro tablica jest const, to nie moge jej zmieniac, Myslalem zeby zrobic dodatkowa funkcje sprawdzajaca ile razy kazda liczba sie powtarza, ale nie wiem. Bo
find zwraca zawsze 1 element tylko i potem jak to zrobic zeby jak sie znowu wywola pamietalo o tym ze juz jeden element zwrocilo?

W jaki sposob podejsc do tego zadania?

a globalna nie bedzie potrzebna?
tego statica to uzyc w funkcji zeby zawsze wracala w dobre miejsce, ale skad po wywolaniu funkcji find wywnioskuje zeby jeszcze raz do niej wrocilo?

Pozostało 580 znaków

2019-08-24 18:59
0

Poczytaj jak dzialaja static variables w srodku funkcji


01010100 01110101 01110100 01100001 01101010 00100000 01101110 01101001 01100101 00100000 01101101 01100001 00100000 01101110 01101001 01100011 00100000 01100011 01101001 01100101 01101011 01100001 01110111 01100101 01100111 01101111 00101110 00100000 01001001 01100011 00100000 01110011 01110100 01101111 01101110 01110100 00101110

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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