Во-первых, минимальный правильный прототип для main
может быть либо:
int main(void){/*...*/}
, либо
int main(int argc, char *argv[]) { /* ... */ }
Хотя стандарт C99 допускает другую реализацию-определенные подписи, вы должны использовать их, только если вы прочитали руководство для вашего компилятора и там написано, что вы можете.
(5.1.2.2.1) Он должен быть определен с типом возврата:int и без параметров ... или с двумя параметрами ... или каким-либо другим способом, определяемым реализацией
Кроме того, здесь аналогичный диалог со ссылкой C11 .
Нет соответствующей функции ...
Да, можно печатать значения из функции void
.Но это также возможно, используя эмулированный проход по ссылке для доступа и печати значения из вызывающей функции. адрес оператора (&
) используется в вызывающей функции при эмуляции передачи по ссылке в C.
Ниже приведен базовый алгоритм с изменениями в видеописано: (прочитайте встроенные комментарии для объяснения.)
void gl_mean (double x,double *count, double *mean) {
static double p;
static int timesIn = 0; //increment times in to update *count
timesIn++;
//p = x+(*mean * *count)/(*count+1);
p += x;
*count = (double)timesIn;
*mean = p/(*count);//*count must be greater than 0
//printf("%f\n",*mean);
}
int main (void) {
double num=0.0; //random number
double dI=1.0; //Counter - avoid div-by-zero,
double sum=0.0; //Sum
int i=0;
srand(time(0));
//for (gl_mean (num,i,sum);i<10;i++) {, this will not progress through the loops)
// because the initializer part of the for loop
// only gets called once
for (i=0;i<10;i++)//gl_mean (num,i,sum);i<10;i++) {
{
num=rand() %10 + 1; // "%10 + 1" optional to limit range from 1 to 10
gl_mean (num,&dI,&sum);//note the use of address operator to emulate
//passing a value by reference.
//values for dI and sum are updated in function
printf("%d) %f: %f\n",(int)dI, num, sum);
sum += num;
// i = (int)dI; //update loop index with updated value
}
}