Нет соответствующей функции для вызова gl_mean Ошибка - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь сделать скользящее / скользящее среднее для двойных значений от 0 до 1, но я получаю ошибку в строке 25 :

No matching function for call to 'gl_mean'

Разве невозможновызвать функцию void и позволить ей что-то напечатать?Поскольку он не может вернуть никакого значения, поэтому я должен выполнить печать в функции void ... эта часть с void gl_mean (double x, double * count, double * mean) {...} была задана задачей кактак что я не могу его изменить.

Код:

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

void gl_mean (double x,double *count, double *mean) {


    double p;

    p=x+(*mean**count)/(*count+1);

    printf("%f",p);

}

int main () {


    double num=0;             //random number
    double i=0;               //Counter
    double sum=0;             //Sum

    srand(time(0));

    for (gl_mean (num,i,sum);i<10;i++) {

        num=rand();
        sum += num;
    }
}

1 Ответ

0 голосов
/ 04 декабря 2018

Во-первых, минимальный правильный прототип для 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
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...