SIGSEGV problem z detekcja

0
stivens napisał(a):

./main 1 <-- seg fault

Chyba zle zrozumialem

-8 10 10 -7 9 8 -5 0
-2 8 -10 -1 6 -3 0 -4
0
1 7 4 5 1 7 5 0 5 -4 2 -2 8 9 -2 4 3 -4 4 -5

Ten input powoduje seg faulta

No niby tak, ale jak ja u siebie tak wpisze to jest wszystko ok. Chyba ze na linuksie tak zrobie i zobacze, ale u mnie w kompilatorze nie pokazuje

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

./main 1 <-- seg fault

Chyba zle zrozumialem

-8 10 10 -7 9 8 -5 0
-2 8 -10 -1 6 -3 0 -4
0
1 7 4 5 1 7 5 0 5 -4 2 -2 8 9 -2 4 3 -4 4 -5

Ten input powoduje seg faulta

No niby tak, ale jak ja u siebie tak wpisze to jest wszystko ok. Chyba ze na linuksie tak zrobie i zobacze, ale u mnie w kompilatorze nie pokazuje

Poza tym, jak zrobie enter po drugiej lini, to ostatnich 2 lini mi juz nie przyjmie, poniewaz -1 oznacza koniec wprowadzania danych, a wystepuje w drugiej linice

2

Raczej tam jest bezpośrednie wywołanie funkcji create_histogram().
Pomiędzy printf("#####START#####") a printf("#####END#####").

1

Wiesz ze mozesz pobrac zipa ze sprawdzarka? ;)

0
Delor napisał(a):

Raczej tam jest bezpośrednie wywołanie funkcji create_histogram().
Pomiędzy printf("#####START#####") a printf("#####END#####").

A no wlasnie, bo to pokazuje niby ze inpurt jest taki :
-8 10 10 -7 9 8 -5 0
-2 8 -10 -1 6 -3 0 -4
0
1 7 4 5 1 7 5 0 5 -4 2 -2 8 9 -2 4 3 -4 4 -5
i sprawdz funkcje w lini 76 ... -> jak w nia wejdziemy, tam pokazuje inny input :
int res = create_histogram((float[]){3.248319, 7.396763, 0.484101, 8.145117, 0.999271, 9.671348, 7.294095, 2.887272, 1.471467, 3.921252}, 10, output, 11);

0
stivens napisał(a):

Wiesz ze mozesz pobrac zipa ze sprawdzarka? ;)

no i co z tym zipem mam zrobic? Mowisz o tym ?

screenshot-20190824114940.png

0

Pokaz mi oryginalne vector_utils.c

0
stivens napisał(a):

Pokaz mi oryginalne vector_utils.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;

    while (sizeD < size)
    {
        int read = scanf("%f", &(*(vec + sizeD)));
        if ((read <= 0)) return -1;
        if (read != 1 || *(vec+sizeD) == stop_value) break;
        ++sizeD;
    }
    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));
    }
}

2
    for(int i = 0; i < 100; i++)
    {
        *(out + i) = 0;
    }

Ustawione na sztywno 100 zamiast brać pod uwagę wartość out_size.

1

Yyyyy

W kazdym razie pomijajac tego seg faulta to create_histogram i tak dziala zle

                const int expected_array[] = {2, 1, 1, 2, 0, 0, 0, 2, 1, 1, 0};
                int output[] = {2, -1, -1, 1, -2, -2, 1, -2, 0, -2, -2};
        
                printf("#####START#####");
                int res = create_histogram((float[]){3.248319, 7.396763, 0.484101, 8.145117, 0.999271, 9.671348, 7.294095, 2.887272, 1.471467, 3.921252}, 10, output, 11);
                printf("#####END#####");

Powinno być: [2, 1, 1, 2, 0, 0, 0, 2, 1, 1, 0]⏎

Tablica po wywołaniu funkcji create_histogram: 10 0 0 0 0 0 0 0 0 0 0 ⏎

0
stivens napisał(a):

Yyyyy

W kazdym razie pomijajac tego seg faulta to create_histogram i tak dziala zle

                const int expected_array[] = {2, 1, 1, 2, 0, 0, 0, 2, 1, 1, 0};
                int output[] = {2, -1, -1, 1, -2, -2, 1, -2, 0, -2, -2};
        
                printf("#####START#####");
                int res = create_histogram((float[]){3.248319, 7.396763, 0.484101, 8.145117, 0.999271, 9.671348, 7.294095, 2.887272, 1.471467, 3.921252}, 10, output, 11);
                printf("#####END#####");

Powinno być: [2, 1, 1, 2, 0, 0, 0, 2, 1, 1, 0]⏎

Tablica po wywołaniu funkcji create_histogram: 10 0 0 0 0 0 0 0 0 0 0 ⏎

To nie wiem jak on to wywoluje bo u mnie dobrze pokazuje
screenshot-20190824122129.png

zmienilem juz na :
for(int i = 0; i < out_size; i++)
{
*(out + i) = 0;
}

No to nie wiem jak mam to sprawdzic teraz, wklejalem tez caly kod u siebie ten
int res = create_histogram((float[]){3.248319, 7.396763, 0.484101, 8.145117, 0.999271, 9.671348, 7.294095, 2.887272, 1.471467, 3.921252}, 10, output, 11);
i dzialalo dobrze, teraz poprawilem to wyzerowanie tablicy co mowiles ze na sztywno i przechodzi testy, tylko musze poprawic jedna rzecz,

screenshot-20190824122445.png
Ale to juz nie problem, problem tylko w tym skad mam wiedziec w ktorym miejscu mam blad ;/
To super, histogram zaraz bedzie dzialal

1

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

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

Okey, faktycznie :D

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.

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

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

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

0

Pokaz unit_test_v2.c:703

A najlepiej funkcje UTEST12

I wprowadz ten zielony input u siebie w terminalu

0

screenshot-20190824124545.png

Czyli jak Nulla przekaze do funkcji?

0

Yup, nie obslugujesz tego

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?

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

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

2

return;

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.

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?

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?

0

Poczytaj jak dzialaja static variables w srodku funkcji

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