我有以下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;
}
答案 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);
在声明和包含区域中,以便编译器从那里知道如何处理该标识符。
或者作为高级选项,将其在头文件中声明并包含该头文件。
免责声明:我没有运行代码,也没有检查其他错误。我只是回答了您询问的具体错误。