• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Błąd w funkcji obliczającej średnią

42 Warsaw Coding Academy
0 głosów
383 wizyt
pytanie zadane 18 marca 2020 w C i C++ przez ResCrove Obywatel (1,700 p.)
int avg(const float* tab, unsigned int size, float *result)
{
    float srednia = 0;
    if(size == 0)
    {
        return 1;
    }
    else
    {
        for(unsigned int i = 0; i <= size; i++)
        {
            srednia = srednia + *(tab + i);
        }
    *result = srednia/size;
    }
    return 0;
}

Kompilator wykrywa mi błąd (SIGSEV) w tej linijce: 

srednia = srednia + *(tab + i);

Totalnie nie wiem co może być nie tak

komentarz 18 marca 2020 przez DragonCoder Nałogowiec (36,500 p.)
srednia = srednia + *(tab + i);

jak juz to:

srednia += tab[i];

bo podajesz elemnt tablicy, a nie nw co

size

mozesz pobbrac wielkosc tablicy

sizeof(<array>) / sizeof(*<array>)
albo tablica.size()

a blad mowi ogolnie brzmi: segmentation fault albo access violation

komentarz 18 marca 2020 przez ResCrove Obywatel (1,700 p.)
*(tab + i);

Użyłem tego dlatego że muszę pracować na wskaźnikach 

komentarz 18 marca 2020 przez DragonCoder Nałogowiec (36,500 p.)
double avg(const float* tab)
{
    double srednia;
        for(unsigned int i = 0; i < sizeof(tab)/ sizeof(tab[0]); i++) {
            srednia += tab [i];
        }
        srednia /= sizeof(tab)/ sizeof(tab[0]);
    return srednia;
}

to powinno zadzialac tak samo, ogolnie zapomnaiem napisac, ze w petli musisz zmienic <= na samo <

komentarz 18 marca 2020 przez ResCrove Obywatel (1,700 p.)
Nie moge tego użyć bo w treści zadania jest narzucone: Nie używaj odwołania tablicowego (T[xx]).
komentarz 18 marca 2020 przez ResCrove Obywatel (1,700 p.)

Muszę korzystać z wskaźników tablic.

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

int read_vector_float(float *vec, int size, float stop_value)
{
    int zmienna = 0;
    float n = 0;
    if(size <= 0)
    {
        return -1;
    }
        do
        {
            if(scanf("%f", &n) != 1)
            {
                return -2;
            }
            if(n == stop_value)
            {
                break;
            }
            else
            {
                *(vec + zmienna) = n;
                zmienna++;
            }
        }
        while(zmienna < size);

    return zmienna;
}
int sum(const float* tab, unsigned int size, float *result)
{
    float suma = 0;
    if(size == 0)
    {
        return 1;
    }
    else
    {
        for(unsigned int i = 0; i < size; i++)
        {
            suma = suma + *(tab + i);
        }
        *result = suma;
    }
    return 0;
}
int avg(const float* tab, unsigned int size, float *result)
{
    float srednia = 0;
    float rozmiar = size;
    if(size == 0)
    {
        return 1;
    }
    else
    {
        for(unsigned int i = 0; i < size; i++)
        {
            srednia = srednia + *(tab + i);
        }
    srednia = srednia/rozmiar;
    *result = srednia;
    }
    return 0;
}

int main()
{
    float tab[101] = {0};
    float *ptab = tab;
    int size = 0;
    float suma = 0;
    float srednia = 0;
    float *psrednia = &srednia;
    float *psuma = &suma;
    
    printf("Wpisz liczby: ");
    
    size = read_vector_float(ptab, 101, 0);
    
    if(size == -1)
    {
        printf("Incorrect input");
        return 1;
    }
    if(sum(ptab, size, psuma) == 0)
    { 
        printf("Suma: %f\n", *psuma);
    }
    else
    {
        printf("Not enough data available");
        return 3;
    }
    
    if(avg(ptab, size, psrednia) == 0)
    {
        printf("Srednia: %f", *psrednia);
    }
    else
    {
        printf("Not enough data available");
        return 3;
    }
    return 0;
}

Oto pełny kod zadania a jedyny problem to ta linijka:

srednia = srednia + *(tab + i);

Po wrzuceniu do kompilatora program wypisze poprawne wyniki ale wskaże ten błąd.

komentarz 18 marca 2020 przez tkz Nałogowiec (42,020 p.)
komentarz 18 marca 2020 przez ResCrove Obywatel (1,700 p.)
Tak, wpisz do programu ciąg liczb np. 7 9 8 5 2 0

Trzeba żeby ostatnie 0 było i normalnie zadziałał
komentarz 18 marca 2020 przez ResCrove Obywatel (1,700 p.)

Dlatego zależy mi tylko na poprawieniu tej linijki:

srednia = srednia + *(tab + i);

 

komentarz 18 marca 2020 przez tkz Nałogowiec (42,020 p.)
Ale on działa poprawnie...
komentarz 18 marca 2020 przez ResCrove Obywatel (1,700 p.)

No właśnie nie :/

komentarz 18 marca 2020 przez tkz Nałogowiec (42,020 p.)
Sprawdź, czy na pewno dobry kod wysyłasz. Jedyny moment gdy wyskoczył mi sigsegv, to gdy wpisałem litery.

1 odpowiedź

+1 głos
odpowiedź 18 marca 2020 przez Michałełe Nałogowiec (25,600 p.)

i wychodzi poza zakres tablicy zaalokowanej przez wskaźnik. Spróbuj zmienić w pętli

for(unsigned int i = 0; i < size; i++)

 

Podobne pytania

0 głosów
2 odpowiedzi 1,859 wizyt
0 głosów
3 odpowiedzi 323 wizyt
pytanie zadane 17 stycznia 2016 w C i C++ przez Informatyk# Obywatel (1,060 p.)
0 głosów
0 odpowiedzi 153 wizyt

93,382 zapytań

142,382 odpowiedzi

322,540 komentarzy

62,738 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...