【问题标题】:invalid operands to binary / (have ‘float *’ and ‘int’)?二进制 / 的无效操作数(有“float *”和“int”)?
【发布时间】:2013-09-20 15:31:40
【问题描述】:

我需要通过引用传递我的班级。我在标题中遇到了错误,但仅限于功能 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;

}

【问题讨论】:

  • 如果你想让一个函数对一个数字进行操作并返回一个结果作为返回值,不要传递数字的地址,只传递数字。此外,您的函数没有返回任何内容,尽管它们被声明为返回 float
  • addTen这样的函数中,为什么还要传入参数number?函数中没有用到。
  • 如果你应该通过引用传递,摆脱全局变量并使用你传入的东西(提示:在你操作它之前取消引用它!)

标签: c casting type-conversion


【解决方案1】:

这是您的(许多)问题之一。

您将addTen 声明为:

float addTen (float* number);

并将其称为:

number=addTen(ptr_number); 

这清楚地表明它返回一个值。

现在,您在函数定义中看到返回语句了吗?

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

接下来,您的所有函数都将float* 作为参数,您应该将其读作“指向浮点数的指针”。请注意,指针与值本身不是

要从指向值的指针中获取,您需要“取消引用”它:

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

【讨论】:

  • 谢谢大家,正如你们所见,我仍在学习 C 的早期阶段。我仍在犯新手错误。
【解决方案2】:

因为您没有从这些函数返回 float 值。如果你想传递一个指向你的函数的指针,那么你应该这样做

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

但是您已将number 声明为全局变量,因此无需将指针传递给这些函数。只需传递number 本身`;

float divideByTwelve (float number)
{
     return number / 12;
}

【讨论】:

  • @chux; float divideByTwelve (float* &amp;number) 是通过引用传递的。
  • @chux;是的。尝试运行这个测试程序:#include &lt;stdio.h&gt; void print_arr (int *p, int n) { for (int *ptr = p; ptr &lt; p+n; ptr++) printf("%d\t", *ptr); } int main() { int a[3] = {1, 2, 3}; print_arr(&amp;a[0], 3); }。可以看到输出here
  • 我认为 divideByTwelve (float &amp;number) 不是有效的 C 语法。见stackoverflow.com/questions/9856248/…
  • 建议你想要float divideByTwelve (float *ptr_number)。我将删除大多数 cmets,因为它们不再适用于您当前的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 2012-01-17
  • 2022-01-11
  • 1970-01-01
  • 2014-11-29
  • 2012-04-16
  • 1970-01-01
相关资源
最近更新 更多