Среднее значение функции заголовка дает мне неправильный результат в C. Если я вызываю функцию «average», которую я создал в своем заголовке, результат будет не таким, как ожидалось

#c #function

#c #функция

Вопрос:

Я создал файл заголовка на C и назвал его statistic.h. Я создал функцию для вычисления среднего (я вызвал функцию «average»). Но когда я использую для формулы: sizeof (list)/ sizeof (list[0]) , результат будет неправильным.

файл заголовка ниже:

  #ifndef STATISTIC_H_INCLUDED
 #define STATISTIC_H_INCLUDED

float average(int list[]){
int i;
float sum_elements,mean;

int total =sizeof (list)/sizeof (list[0]);
for (i=0;i<total;i  ){
    sum_elements=sum_elements list[i];
                     }
     mean = sum_elements / total;

return mean;


 }

 #endif // STATISTIC_H_INCLUDED


//see main code below where I'm trying to call the function I have previously created in the header.

 #include <stdio.h>
 #include "statistic.h"
int main(){

int list[]={26,12,16,56,112,24};

float mean=average(list); // I'm calling the average function I created in my header
printf("%f",mean);

return 0;
/*The average is 41.00 but I'm getting 19.00 instead . If I don't use 
the sizeof function and manually declare the variable total=6 (the 
number of element in the list), it gives me the correct result 
(41.00).*/
 

Ответ №1:

sizeof (list)/sizeof (list[0]); in average не работает, поскольку list распадается на an int* при передаче в качестве аргумента функции. Вам нужно отправить размер списка в функцию в качестве аргумента.

Пример:

 #include <stddef.h>
#include <stdio.h>

float average(int list[], size_t total) { // send total in as an argument
    float sum_elements = 0;               // note: initialize sum_elements

    for (size_t i = 0; i < total; i  ) {
        sum_elements = sum_elements   list[i];
    }

    return sum_elements / total;
}

int main() {
    int list[] = {26, 12, 16, 56, 112, 24};

    // do the size calculation here, where `list` is defined instead:
    float mean = average(list, sizeof list / sizeof *list);
    printf("%f", mean);

    return 0;
}
 

ДЕМОНСТРАЦИЯ

Комментарии:

1. Большое вам спасибо, Тед. Я работал над этим в течение нескольких дней. Вы сделали это таким простым и понятным. Да благословит вас Бог.

2. @FabioGenua Рад это слышать! Пожалуйста!

Ответ №2:

list Параметр в вашей average функции не является массивом, это указатель, поэтому sizeof трюк не работает.

Если это не операнд sizeof унарных amp; операторов or или строковый литерал, используемый для инициализации массива символов в объявлении, выражение типа «N-element array of T » будет преобразовано или «decay» в выражение типа «указатель на T «, и его значением будет значениеадрес первого элемента в массиве.

Когда вы вызываете average :

 float mean=average(list);
 

выражение list преобразуется из типа «6-элементный массив int » в «указатель на int «, и значение выражения такое же, как amp;list[0] , поэтому average фактически получает значение указателя, а не массив.

В контексте объявления параметра функции T a[N] и T a[] оба «настроены» на T *a — все три объявляются a как указатель на T , а не массив T .

Вам нужно будет передать размер массива в качестве отдельного параметра:

 float average( int *list, size_t list_size ) 
{
  ...
  for ( size_t i = 0; i < list_size; i   ) 
    ...
}
 

и назовите его как

 mean = average( list, sizeof list / sizeof list[0] );
 

Вам также необходимо явно инициализировать sum_elements 0 в average функции.

Комментарии:

1. Большое вам спасибо. «Профессора» в университете не смогли ответить на мой вопрос. Я надеюсь, что однажды я смогу вернуть всю помощь, которую я получаю здесь. Еще раз спасибо, Джон. Большое спасибо.