C 没有指针的分段错误?
这是我的代码和问题。代码编译得很好。但当我运行它时。当我进入getMenuOption Segmentation中的菜单选项后,会弹出错误提示。怎么了? 我对编程基本上是新手。如果有,谢谢你的帮助C 没有指针的分段错误?,c,pointers,runtime-error,C,Pointers,Runtime Error,这是我的代码和问题。代码编译得很好。但当我运行它时。当我进入getMenuOption Segmentation中的菜单选项后,会弹出错误提示。怎么了? 我对编程基本上是新手。如果有,谢谢你的帮助 #include <stdio.h> #include<math.h> #define CALCULATE_PI 'a' #define CALCULATE_GEOMEAN 'b' #define CALCULATE_HARMMEAN 'c' void printInstr
#include <stdio.h>
#include<math.h>
#define CALCULATE_PI 'a'
#define CALCULATE_GEOMEAN 'b'
#define CALCULATE_HARMMEAN 'c'
void printInstructions (void);
void printMenuOptions (void);
int runMenuOption ();
int getMenuOption ();
int getLimit ();
int calculatePi ();
int calculateGeoMean ();
int calculateHarmonicMean ();
int main(void)
{
printInstructions();
printMenuOptions();
runMenuOption(getMenuOption());
return 0;
}
void printInstructions (void)
{
printf("======================================================\n");
printf("= PI, Geometric Mean, and Harmonic Mean Calculator =\n");
printf("= Please refer to the menu to choose calucaltion =\n");
printf("=Choose desired menu option and press enter to begin =\n");
printf("= Proceed to follow on-screen instructions =\n");
printf("======================================================\n\n\n");
return;
}
void printMenuOptions (void)
{
printf("3 choices: Please enter a VALID letter.\n");
printf("Choice 'a' = Calcualtes PI\n");
printf("Choice 'b' = Calculates Geometric Mean\n");
printf("Choice 'c' = Calculates Harmonic Mean\n\n");
return;
}
int runMenuOption (int getMenuOption())
{
char option;
double answer,
Pi = 0.0,
geoMean = 0.0;
option = getMenuOption();
switch (option)
{
case CALCULATE_PI:
calculatePi(getLimit());
answer = Pi;
break;
case CALCULATE_GEOMEAN:
calculateGeoMean(getLimit());
answer = geoMean;
case CALCULATE_HARMMEAN:
printf("Harmonic Mean");
break;
default:
printf("Incorrect Character!\n");
printf("Try again");
break;
}
printf("Your answer is %5p", &answer);
return 0;
}
int getMenuOption (void)
{
char option;
printf("Please enter choice: ");
scanf("%c", &option);
return option;
}
int getLimit ()
{
int limit;
scanf("%d", &limit);
return limit;
}
int calculatePi (void)
{
int limit,
count = 0,
Pi = 0;
printf("Please enter the PI limit: ");
limit = getLimit();
for (count = 1; count <= limit; count++)
{
Pi += 1 / count;
}
return sqrt(Pi * 6);
}
int calculateGeoMean()
{
int limit,
userValue = 0,
count = 0;
double geoMean = 0;
limit = getLimit();
while(count <= limit)
{
if (userValue <= 0)
printf("Incorrect. Try again");
else
{
count++;
userValue *= userValue;
}
}
geoMean = userValue;
return sqrt(userValue);
}
int calculateHarmonicMean()
{
int limit,
userValue = 0,
count = 0;
double harmMean = 0;
limit = getLimit();
while(count <= limit)
{
if (userValue <= 0)
printf("Incorrect. Try again");
else
{
count++;
userValue *= 1 / userValue;
}
}
harmMean = userValue;
return limit / userValue;
}
这个函数定义是完全错误的
int runMenuOption (int getMenuOption())
您可以这样传递getMenuOption的返回值
int runMenuOption (int option)
或
您不应该将任何值传递给此函数并在runMenuOption内调用getMenuOption。这两种方法都不正确。此函数定义完全错误
int runMenuOption (int getMenuOption())
int runMenuOption (int getMenuOption())
您可以这样传递getMenuOption的返回值
int runMenuOption (int option)
或
您不应该将任何值传递给此函数并在runMenuOption内调用getMenuOption。你两者都在做,这是不正确的
int runMenuOption (int getMenuOption())
这是你的问题
这应该是:
int runMenuOption (int opt)
另外,您不应该在runMenuOption中调用getMenuOption,因为您在将getMenuOption作为参数传递给runMenuOption时调用它。runMenuOption应该只有一个switch语句
这是你的问题
这应该是:
int runMenuOption (int opt)
另外,您不应该在runMenuOption中调用getMenuOption,因为您在将getMenuOption作为参数传递给runMenuOption时调用它。runMenuOption应该只有一个switch语句。您需要将函数的定义从int runMenuOption int getMenuOption修改为int runMenuOption int option。在调用中,将调用getMenuOption,并将输出放入被调用函数的堆栈框架中。您需要将函数的定义从int-runMenuOption int-getMenuOption修改为int-runMenuOption int-option。在调用中,将调用getMenuOption,并将输出放在被调用函数的堆栈框架中。根据您对runMenuOption函数的声明,它使用指向返回整数的函数的指针作为其第一个参数:
int runMenuOption (int getMenuOption())
runMenuOption(getMenuOption);
然后在此行中调用该函数:
option = getMenuOption();
runMenuOption(getMenuOption());
这很好。然而,问题在于这一行:
option = getMenuOption();
runMenuOption(getMenuOption());
这里调用getMenuOption函数,并将返回值传递给runMenuOption函数。但您应该做的是将函数本身作为参数传递:
int runMenuOption (int getMenuOption())
runMenuOption(getMenuOption);
出现分段错误的原因是,getMenuOption函数的返回值被视为函数指针,而您的程序正试图在该地址调用函数,这当然是无效的。根据您对runMenuOption函数的声明,它将指向返回整数的函数的指针作为其第一个参数:
int runMenuOption (int getMenuOption())
runMenuOption(getMenuOption);
然后在此行中调用该函数:
option = getMenuOption();
runMenuOption(getMenuOption());
这很好。然而,问题在于这一行:
option = getMenuOption();
runMenuOption(getMenuOption());
这里调用getMenuOption函数,并将返回值传递给runMenuOption函数。但您应该做的是将函数本身作为参数传递:
int runMenuOption (int getMenuOption())
runMenuOption(getMenuOption);
出现分段错误的原因是,getMenuOption函数的返回值被视为函数指针,而您的程序正试图在该地址调用函数,这当然是无效的。@Armin:我刚刚测试了我的解决方案,它在GCC v4.5.3上运行良好。Doing:runMenuOption&getMenuOption也会工作,但绝对不是runMenuOptiongetMenuOption。你能详细解释一下为什么你认为这是错误的吗?编辑:另请注意,作者:runMenuOptiongetMenuOption;我指的是他在主函数中调用runMenuOption的那一行,而不是runMenuOption函数原型。你的建议是,我有不同的想法,虽然不寻常,但有效。在您编辑之前,我无法撤消投票。我只是想告诉作者分段错误的确切原因。此解决方案还有一个优点,即只需对作者的原始程序进行最小的更改。@Armin:我刚刚测试了我的解决方案,它在GCC v4.5.3上运行良好。Doing:runMenuOption&getMenuOption也会工作,但绝对不是runMenuOptiongetMenuOption。你能详细解释一下为什么你认为这是错误的吗?编辑:另请注意,作者:runMenuOptiongetMenuOption;我指的是他在主函数中调用runMenuOption的那一行,而不是runMenuOption函数原型。你的建议是,我有不同的想法,虽然不寻常,但有效。在您编辑之前,我无法撤消投票。我只是想告诉作者分段错误的确切原因。此解决方案还具有对作者的原始程序进行最小更改的优点。