Dobry wieczór,
mam pewien problem ze stworzeniem prostego programu, który oblicza sumę i średnią z wartości umieszczonych w tablicy. Kompilując program nie mam błędu, natomiast narzędzia do testów pokazują taki błąd: Program przerwany; kod błędu=139 (Sygnał SIGSEGV).
To jest mój kod (działa dla małej ilości danych):
#include <stdio.h>
#include <stdlib.h>
//int sum(const float* tab, unsigned int size, float *result);
//int avg(const float* tab, unsigned int size, float *result);
//int read_vector_float(float *vec, int size, float stop_value);
int i = 0;
int read_vector_float(float *vec, int size, float stop_value){
printf("Podaj liczby: ");
if(size < 0 || size > 100){
return -1;
}
for(i=0; i < size; i++){
if(scanf("%f", &*vec) != 1){
printf("Incorrect input");
return -2;
}
if(*vec == stop_value) {
break;
}
++vec;
}
return i;
}
int sum(const float* tab, unsigned int size, float *result){
if(size > 100){
return 1;
}
for(int j=0; j < i; j++){
*result = *result + *tab;
++tab;
}
return 0;
}
int avg(const float* tab, unsigned int size, float *result){
double sum = 0;
for(int j=0; j < (int)size; j++){
sum += *tab;
++tab;
}
*result = (float)sum / (float)size;
return 0;
}
int main() {
float T[100] = {0};
float *tPointer;
tPointer = (float*)&T;
float result = 0;
float *pResult;
pResult = (float*)&result;
read_vector_float(tPointer, 100, 0);
sum(tPointer, i, pResult);
printf("Suma: %.2f\n", result);
result = 0;
avg(tPointer, i, pResult);
printf("Srednia: %.2f\n", result);
return 0;
}
Narzędzie do testowania funkcji avg wprowadza ogromną tablicę (niezwiązaną z moją tablicą T[100]), w polu size jest np. 1200 elementów. Mój kod nie posiada praktycznie żadnych zabezpieczeń wskazanych w poleceniu, ale to jeszcze przede mną. Chciałbym nauczyć się rozwiązywać problemy z dynamiczną alokacją pamięci, a tu jest moim zdaniem problem. Prawdopodobnie brakuje mi którejś z tych funkcji: malloc, calloc lub free. Czy mogę prosić o wskazówki? Męczę się z tematem już 5-6 godzin.
Jako dodatek załączam fragment z oprogramowania do testowania:
Źródło błędu SIGSEGV wykryto w funkcji avg, plik main.c:45
Widok kodu źródłowego:
int avg(const float* tab, unsigned int size, float *result){
double sum = 0;
for(int j=0; j < (int)size; j++){
sum += *tab; //tutaj jest błąd
++tab;
}
*result = (float)sum / (float)size;
return 0;
Z góry dziękuję za podpowiedzi.