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()内で呼び出すべきではありません。ステートメントのみを含める必要があります。runMenuOptiongetMenuOption()runMenuOptionrunMenuOptionswitch

于 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 に答える