0

クラスの参照渡しが必要です。タイトルにエラーが表示されますが、関数divideByTweleveおよびmultiplyByElevenに対してのみです。何故ですか?私は何を間違っていますか?これを理解するのを手伝ってください。

#include <stdio.h>
void displayMenu();
float addTen (float* number);
float divideByTwelve(float* number);
float subtractSixteen(float* number);
float multiplyByEleven(float* number);
int menu;
float number, finalNumber;
float* ptr_number;

int main (void)
{
    float* ptr_number=NULL;
    ptr_number=&number;

    printf("Please enter a number : ");
    scanf("%f", &number);
    displayMenu();
    scanf("%d", &menu);

do {
    printf("\nEnter 5 to see final number\n");
    scanf("%d",&menu);
    switch (menu)
        {
        case 1: number=addTen(ptr_number); 
                break; 
        case 2: number=divideByTwelve(ptr_number);
                break; 
        case 3: number=subtractSixteen(ptr_number);
                break;
        case 4: number=multiplyByEleven(ptr_number);
                break;
        }
    printf("Your number is: %.2f \n", number);
    }while(menu!=5);//close of the do-while loop
}

void displayMenu()
{
    printf("How would you like to manipulate your number\n");
    printf("1. Add 10\n");
    printf("2. Divide by 12\n");
    printf("3. Subtract 16\n");
    printf("4. Multiply by 11\n");
}


float addTen (float* number)
{
    ptr_number=ptr_number+10;

}

float divideByTwelve (float* number)
{
    ptr_number=ptr_number/12;

}

float subtractSixteen(float* number)
{
    ptr_number=ptr_number-16;

}

float multiplyByEleven(float* number)
{
    ptr_number=ptr_number*11;

}
4

2 に答える 2

4

これはあなたの(多くの)問題の1つです。

次のように宣言addTenします。

float addTen (float* number);

そしてそれを次のように呼び出します:

number=addTen(ptr_number); 

これは、値を返すことを明確に示しています。

さて、関数定義に return ステートメントがありますか?

float addTen (float* number)
{
    ptr_number=ptr_number+10;   // No return statement!!
}

次に、すべての関数がfloat*パラメーターとして a を受け取ります。これは、「浮動小数点数へのポインター」と読む必要があります。ポインタは値自体と同じではないことに注意してください。

ポインターから値を取得するには、それを「逆参照」する必要があります。

float addTen (float* number)
{
    *ptr_number = *ptr_number + 10;
}

それぞれの前の星印 ( *)ptr_numberは、ポインターから実際の値に戻ることを意味します。

以前は、ポインターに 10 を加算しようとしていました。
(これは有効ですが、現在のコンテキストでは適切ではありません)

では*、ポイント先の場所に格納されている値に 10 を追加しています。



最終的に、ここにあなたのコードの私の修正版があります

void displayMenu();
void addTen (float* number);
void divideByTwelve(float* number);
void subtractSixteen(float* number);
void multiplyByEleven(float* number);


int main (void)
{
    int menu;
    float number;
    
    printf("Please enter a number : ");
    scanf("%f", &number);
    displayMenu();
    scanf("%d", &menu);

    do {
    printf("\nEnter 5 to see final number\n");
    scanf("%d",&menu);
    switch (menu)
        {
        case 1: addTen(&number);             break; 
        case 2: divideByTwelve(&number);     break; 
        case 3: subtractSixteen(&number);    break;
        case 4: multiplyByEleven(&number);   break;
        }
    printf("Your number is: %.2f \n", number);
    }while(menu!=5);//close of the do-while loop

    printf("Your FINAL number is: %.2f \n", number);
}

void displayMenu()
{
    printf("How would you like to manipulate your number\n");
    printf("1. Add 10\n");
    printf("2. Divide by 12\n");
    printf("3. Subtract 16\n");
    printf("4. Multiply by 11\n");
}


void addTen (float* ptr_number)
{
    *ptr_number = *ptr_number+10;
}

void divideByTwelve (float* ptr_number)
{
    *ptr_number = *ptr_number/12;
}

void subtractSixteen(float* ptr_number)
{
    *ptr_number = *ptr_number-16;
}

void multiplyByEleven(float* ptr_number)
{
    *ptr_number = *ptr_number*11;
}
于 2013-09-20T15:36:20.430 に答える
0

floatこれらの関数から値を返していないためです。関数にポインターを渡したい場合は、次のように行う必要があります。

float divideByTwelve (float *)
{
    *ptr_number= *ptr_number/12;
     return *ptr_number;
}

numberしかし、グローバル変数として宣言したので、これらの関数にポインターを渡す必要はありません。それ自体を渡すだけnumberです`;

float divideByTwelve (float number)
{
     return number / 12;
}
于 2013-09-20T15:36:10.633 に答える