1

这是我的代码和问题。代码编译得很好。但是当我运行它时。在 getMenuOption() 中输入菜单选项后,弹出“Segmentation Fault (core dumped)”。怎么了?我一般是编程新手。感谢您提供的帮助。

#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;
}
4

4 回答 4

6

这个函数定义是完全错误的。

int runMenuOption (int getMenuOption())

getMenuOption要么你可以像这样传递返回值

int runMenuOption (int option)

或者

您不应将任何值传递给此函数并getMenuOption在内部调用runMenuOption. 你两者都做,这是不正确的。

于 2013-03-24T01:19:23.277 回答
2
int runMenuOption (int getMenuOption())

这是你的问题。

那应该是:

int runMenuOption (int opt)

此外,您不应该getMenuOption()在内部调用,runMenuOption因为您在getMenuOption()将它runMenuOption作为参数传递给它时调用。runMenuOption应该只有一个switch声明。

于 2013-03-24T01:22:36.783 回答
0

您需要将函数的定义从 修改int runMenuOption (int getMenuOption())int runMenuOption (int option)。在调用中,getMenuOption()将被调用并将输出放入被stack frame调用函数的 中。

于 2013-03-24T01:27:51.530 回答
0

根据您对runMenuOption函数的声明,它需要一个指向函数的指针,该函数返回一个整数作为其第一个参数:

int runMenuOption (int getMenuOption())

然后在这一行中调用该函数:

option = getMenuOption();

这很好。但是,问题在于这一行:

runMenuOption(getMenuOption());

在这里,您正在调用getMenuOption函数并将返回值传递给runMenuOption函数。但是你应该做的是将函数本身作为参数传递:

runMenuOption(getMenuOption);

您收到分段错误错误的原因是因为getMenuOption函数的返回值被视为函数指针,并且您的程序试图调用该地址的函数,这当然是无效的。

于 2013-03-24T01:53:15.513 回答