Zablokowanie argumentu NULL w funkcji

0

Witam,

robiłem zadanie które sprawdza maszyna. Niestety jednym z elementów które sprawdza jest wywołanie funkcji sumującej przyjmując NULL jako argument. Muszę zablokować jakoś tę możliwość.

Treść zadania:

Napisz funkcje do obliczania sumy i wartości średniej z elementów tablicy. Prototypy funkcji powinny wyglądać następująco:

int sum(const float* tab, unsigned int size, float *result);
int avg(const float* tab, unsigned int size, float *result);

Parametry:

tab - wskaźnik na tablicę typu float, dla której ma zostać wyznaczona suma / wartość średnia,

size - liczba elementów w tablicy,

result - wskaźnik na zmienną typu float, w której ma zostać zapisana obliczona suma / wartość średnia.

Wartość zwrócona:

0 - w przypadku podania błędnych danych, 1 - w przeciwnym przypadku.

Napisz program, który pobierze od użytkownika ciąg liczb rzeczywistych (maksymalnie 100, w przypadku mniejszej liczby danych wartość 0 będzie oznaczała koniec wprowadzania danych) i zapisze je do tablicy. Następnie, wykorzystując przygotowane funkcje, program ma wyznaczyć i wyświetlić, z dokładnością dwóch miejsc po przecinku, w kolejnych liniach sumę podanych wartości oraz wartość średnią. W przypadku niepodania żadnej wartości program ma wyświetlić komunikat “Error” i zakończyć działanie z kodem błędu 1, jeżeli wszystkie operacje się powiodą program powinien zwrócić wartość 0.

Przykładowe wejście:

Podaj liczby:

5.895462 -2.534116 6.274956 -9.079528 -3.419764 0.000000⏎

Przykładowe wyjście:

Suma: -2.86
Srednia: -0.57

Mój kod:

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

int sum(const float* tab, unsigned int size, float *result);
int avg(const float* tab, unsigned int size, float *result);

int main()
{	
    float a[100];
    float *tab=a;
    float wynik=0;
    float *result=&wynik;
    int i=0;
    float podana=0;
    unsigned int size = 0;
    int r;

		
 
		printf("Podaj  liczby: ");	
	for(i=0;i<100;i++)
		{
		r = scanf("%f",&podana);
        
		if(r!=1)
		{	
		printf("Error");
			return 1;
		}
        
                	if(podana==0 && size==0)
            {
            printf("Error");
 			return 1;

            
            }
        	if(podana==0)
            {
            
 			break;

            
            }
	
			else
			{
    		*(tab+i)=podana;
			size++;
	
			}
}
 


		//Zablokować NULL

		
		sum(tab, size, result);
		avg(tab, size, result);
		sum(NULL, size,result);
	return 0;
}

int sum(const float* tab, unsigned int size, float *result)
{
	

	unsigned int i=0;
	float ile=0;
	
	for(i=0;i<size;i++)
		{
	
    	ile+=*(tab+i);
			
		}
	*result= ile;
	printf("Suma wynosi: %.2f", *result);
	return 0;
}

int avg(const float* tab, unsigned int size, float *result)
{
	unsigned int i=0;
	float ile=0;
	for(i=0;i<size;i++)
		{
	
    	ile+=*(tab+i);
			
		}
	*result= ile/size;
	printf("\nSrednia wynosi: %.2f", *result);
	return 0;
	
}

Większość chyba zrobiłem póki co dobrze, a mam problem z tym NULL'em.
Maszyna sprawdza to tak:

Widok konsoli programu -- przebieg interakcji z użytkownikiem:

float test_array[5] = { -5.797000, 2.012000, -2.104000, -4.150000, 1.449000 };⏎
TEST [1]: Obliczanie sumy elementów w tablicy test_array⏎
Wywołanie: sum(test_array, size, &s) == 1⏎
Suma wynosi: -8.59Wartość zwrócona: 0; oczekiwana: 1. Wynik: PORAŻKA⏎
⏎
float s = -8.589999;⏎
float expected_sum = -8.586000;⏎
TEST [2]: Sprawdzanie poprawności obliczonej sumy, z dokładnością do 0.1⏎
Wywołanie: test_is_close(expected_sum, s, 0.1) == 1⏎
Wartość zwrócona: 1; oczekiwana: 1. Wynik: SUKCES⏎
⏎
TEST [3]: **Sprawdzanie poprawności zachowania się funkcji w przypadku przekazania do niej wskaźnika NULL⏎
Wywołanie**: sum(NULL, size, &s) == 0⏎
Program przerwany; kod błędu=139 (Sygnał SIGSEGV)

Nie mogę zmienić prototypów funkcji, bo są one podane w zadaniu. Jak ktoś wie co można zrobić to proszę o wskazówki.

4
int avg(const float* tab, unsigned int size, float *result)
{
    if (tab == NULL) return 1;
0

Ehh... Z 30 minut się głowiłem czemu mi nie działa. Ciągle pisałem

if (*tab == NULL) return 1;

i wyrzucało albo błędy albo nie działało. A zamiast chwilę pomyśleć, to w to brnąłem ;/
Dzięki wielkie! :D

1

Ach te wskażniki i dereferencje:). To samo co powyżej, tylko dla mnie logiczniej byłoby w pierwszym "ifie" liczyć sumę, a jak stało się coś złego (NULL) to else i działamy nietypowo:

#include <stdio.h>

int sum(float * tab, unsigned int size, float * result){
    if (tab){
		/* all ok, 
        /* compute and print sum */
        return 0;
    }
    
    else{
		/* ups! NULL, do something...*/
		return 0;
    }
}

int main(void) {
    float * result;
    float a = 1.0f;
    result = &a;
	printf ("%d\n", sum(NULL, 1, result)); // -> 0

	return 0;
}

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