从函数返回结构的不同值

时间:2018-11-28 07:15:06

标签: c

我想为具有动态结构数组的函数中的每个销售人员设置佣金。如果推销员的销售额超过x美元,则您的佣金为9%;如果推销员的销售额少于x美元,则您的佣金为5%。

让我们说规模是四个,那么每个人将有4个单独的佣金 我想显示四个不同的金额。

double commissionCal(struct Sale *arrSale, int size)
{
    double commission, total;

    for (int x = 0; x < size; x++)
    {
        if (arrSale[x].saleAmount > 2000.00)
        {
            commission = arrSale[x].saleAmount * .09; //sets commission
            total = arrSale[x].saleAmount + commission; // adds commission to sale amount

            return total; // I know by adding return total will end the function
        }
        else
        {
            commission = arrSale[x].saleAmount * .05;
            total = arrSale[x].saleAmount + commission;

            return total;
        }
    }


}

Console output

1 个答案:

答案 0 :(得分:2)

c中,一个函数不能通过返回值返回多个值。

您在这里有两个选择:

选项1:将指向结果变量的指针作为参数接收它的输出

void commissionCal(const struct Sale *i_arrSale, int i_size, double * o_total, double *o_commision)
{
  *o_total= 0.;
  *o_commission= 0.;
  // ...
}

// later in your program:
  double total;
  double commission;
  commissionCal(monthlysales, salescount, &total, &commission);
  printf("total: %f commission: %f", total, commission);

选项2:定义结构并将其用作返回类型

struct SaleResults{
  double total;
  double commission;
}

struct SaleResults commissionCal(const struct Sale *i_arrSale, int i_size)
{
  SaleResults results;
  results.total = 0.;
  results.commission = 0.;
  // ...
  return results
}

// later in your program:
  struct SaleResults results = commissionCal(monthlysales, salescount);
  printf("total: %f commission: %f", results.total, results.commission);

仅当您返回的数据结构相对较小(只是一堆值)时,才应使用此选项,因为在对接收变量的赋值返回后会进行复制。但是,现代编译器通常采用返回值优化(RVO)来消除这种开销。

还请注意,我将销售数组输入更改为const指针。 如果您不希望更改指针,则应始终将指针(尤其是在函数参数中)声明为const