C代码错误,不是函数或函数指针

时间:2018-11-21 11:18:19

标签: c

我有以下C代码。当我尝试编译它时,出现错误消息:

called object 'countPassed' is not a function or function pointer"

我该如何解决?

#include <stdio.h>

int main()
{
    int countWhoPassed, averageCalculate, printPassed;
    int amount = howManygrades();
    storesGrades(amount);
    printAll(amount);
    averageCalculate = averageCalc(amount);
    printAverage(amount);
    countWhoPassed = countPassed(amount);
    printPassed = printWhoPassed(amount);
    return 0;
}

int howManygrades()
{
    int gradesAmount;
    printf("How many grades do you want?\n");
    scanf("%d", &gradesAmount);
    while (gradesAmount > 10) {
        printf("Sorry, this amount of numbers is too big for the array.");
        scanf("%d", &gradesAmount);
        while (gradesAmount < 0) {
            printf("Sorry, this amount of numbers is too small for the array.");
            scanf("%d", &gradesAmount);
        }
    }
    while (gradesAmount < 0) {
        printf("Sorry, this amount of numbers is too small for the array.");
        scanf("%d", &gradesAmount);
        while (gradesAmount > 10) {
            printf("Sorry, this amount of numbers is too big for the array.");
            scanf("%d", &gradesAmount);
        }
    }

    return gradesAmount;
}

void storesGrades(int amount)
{
    int iterator;
    float grade;
    for (iterator = 0; iterator < amount; iterator++)
    {

        printf ("Enter another grade.");
        scanf("%f", &grade);
        while ((grade <= 0.0) || (grade > 10.0))
        {
            printf("Sorry, this number is not valid.");
            scanf("%f", &grade);
        }
        grades[iterator] = grade;
    }
}

void printAll(int amount)
{
    int iterator;
    for (iterator = 0; iterator < amount; iterator++)
    {
        printf("%.1f\n", grades[iterator]);
    }
}

int averageCalc(int amount)
{
    float sum, averageResult, average;
    int iterator;
    sum = 0.0;
    for (iterator = 0; iterator < amount; iterator++) {
        sum += grades[iterator];
    }
    average = sum / (float)amount;
    return average;
}

void printAverage(int amount)
{
    float printThisAverage = averageCalc(amount);
    printf("%.2f", printThisAverage);
}

int countPassed(int amount)
{
    int iterator, countPassing;
    countPassing = 0;
    for (iterator = 0; iterator < amount; iterator++)
    {
        if (grades[iterator] >= 5.5)
        {
            countPassing++;
        }
    }
    return countPassing;
}

int printWhoPassed(int amount)
{
    int returnValue = countPassed(amount);
    return returnValue;
}

2 个答案:

答案 0 :(得分:2)

似乎有两个问题。我认为您收到的错误消息很奇怪,应该改为未定义countPassed。那是因为您在调用它之后定义它。您可以通过在调用函数之前为函数添加原型来修复它。这样,您就可以告诉编译器某个函数的存在(尚未定义该函数),它将进行编译。对我来说,它的工作原理是在主代码之前将以下原型添加到您的代码中:

int countPassed(int amount);
void printAll(int amount);
void printAverage(int amount);
void storesGrades(int amount);

或者,您可以将main函数放在所有其他函数之后。当然,在实际项目中并非总是这样。

此外,grades没有定义。我假设您想要一个int的数组,因此添加类似int grades[10]的东西应该可以解决问题(在此示例中,最多可以使用10个等级,还可以动态分配该内存以允许用户想要的任何数量。

此外,我不得不添加#include "stdio.h"使其与printf一起编译,尽管有些编译器不介意它是否丢失。

答案 1 :(得分:2)

自从您第一次使用函数countPassed以来,

countWhoPassed = countPassed(amount);

该函数的定义要晚得多,编译器还不知道如何处理这样的函数。因此,由于尚未声明任何原型,因此编译器不知道countPassed()返回一个int。因此,在没有这些信息的情况下,编译器会假设

countWhoPassed = countPassed(amount);

正在尝试将countPassed(int)的函数指针分配给变量countWhoPassed。但是后来发现它也不知道这种功能。

但是,在尚未看到此函数原型之前,编译器应该如何更好地了解它?

因此,让编译器知道该函数在首次出现之前的外观。

所以简单地放在

int countPassed(int amount);

在声明和包含区域中,以便编译器从那里知道如何处理该标识符。

或者作为高级选项,将其在头文件中声明并包含该头文件。

免责声明:我没有运行代码,也没有检查其他错误。我只是回答了您询问的具体错误。