#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. Большое вам спасибо. «Профессора» в университете не смогли ответить на мой вопрос. Я надеюсь, что однажды я смогу вернуть всю помощь, которую я получаю здесь. Еще раз спасибо, Джон. Большое спасибо.