返回两个具有多个值的变量

时间:2017-04-12 02:34:56

标签: c visual-studio function

我正在尝试使用一个函数来计算h的值,然后将这些h值输入到计算n的等式中。这就是我的代码目前的样子......

int findN(double xI, double xF) {


double h = 0.1;
int n;

do {
    printf_s("%8.5f \n", h);
    n = ((xF - xI) / h);
    h = h / 10;


    printf_s("%6d \n", n);
} while (h >= 0.00001);


return n;
}

我知道这个函数目前只返回n,但由于我是新手,我不确定如何返回h的所有值以及n的所有值...如果有人可以帮助我告诉我如何返回n&的所有值h,非常感谢。

感谢。

5 个答案:

答案 0 :(得分:1)

返回多重值的典型方法是使用数组并将其指针传递给函数:

int f(double *h) {
  h[0] = 1.1;
  h[1] = 2.2;
}

int main()
{
  // create pointer
  double *h;

  // initialize it with memory block
  h = malloc(2*sizeof(double));

  // call the function
  f(h);

  // show output
  printf_s("%8.5f \n", h[0]);
  printf_s("%8.5f \n", h[1]);

  // release memory block
  free(h);

  return 0;
}

也可以在没有内存分配的情况下创建相同的数组。它更简单,但数组只存在,直到执行不离开它声明的函数范围。

int main()
{
  // create array
  double h[2];

  // call the function
  f(h);

  // show output
  printf_s("%8.5f \n", h[0]);
  printf_s("%8.5f \n", h[1]);

  return 0;
}

如果你只能在函数调用期间知道元素的数量,你可以在函数中分配数组并通过指针返回数组并在调用者处释放数组。

double* f() {
  // create pointer
  double *h;

  // some size calculations
  int size = 1+1;

  // initialize it with memory block
  h = malloc(size*sizeof(double));

  // fill the array
  h[0] = 1.1;
  h[1] = 2.2;

  // return array by pointer
  return h;
}

int main()
{
  // create pointer
  double *h;

  // call the function
  h = f();

  // show output
  printf_s("%8.5f \n", h[0]);
  printf_s("%8.5f \n", h[1]);

  // release memory block
  free(h);

  return 0;
}

答案 1 :(得分:0)

如果您想了解更多信息,请阅读指南。但实际上,通过将h作为指针发送,它将把它的值返回给main。

#include <stdio.h>

int findN(double xI, double xF, double h[]) {
    int i = 0;
    int n;

    h[i] = 0.1;
    do {
        i++;
        printf_s("%8.5f \n", *h);
        n = ((xF - xI) / (*h));
        h[i] = h[i-1] / 10;


        printf_s("%6d \n", n);
    } while (h[i] >= 0.00001);


    return n;
}

int main()
{
    double h[100];
    double xI = 1.0, xF = 1.0;
    int n;

    n = findN(xI, xF, h);

    return 0;
}

答案 2 :(得分:0)

有很多方法可以解决这个问题。另一种方法是返回struct

下面,findN()返回一个对象。恰好该对象包含两个成员。这种方法适用于小物体。对于大型物体,应考虑其他方法。

typedef struct {
  int n;
  double h;
} nh;

nh findN(double xI, double xF) {
  nh retval;
  retval.h = 0.1;

  do {
    printf_s("%8.5f\n", retval.h);
    retval.n = ((xF - xI) / retval.h);
    retval.h = retval.h / 10;
    printf_s("%6d\n", retval.n);
  } while (retval.h >= 0.00001);

  return retval;
}

// usage exanple
nh y;
y = findN(1.23, 4.56);
printf_s("h:%8.5f, n:%6d\n", y.h, y.n);

答案 3 :(得分:0)

读指针,你将能够返回你想要返回的多个值,当通过main add&amp; h在实际参数中调用函数时,它意味着findN(xI,xF,&amp; h)并且在声明函数时findN在形式参数中添加double * h,即int findN(double xI,double xF,double * h)....&#34; * is-value的含义是......的地址。&amp;当这个程序的地址发生变化时,这将在全局中对h进行全局更改。您可以使用更多变量返回更多这样的值。这称为间接返回值。如果适用,请回答我的答案。

答案 4 :(得分:0)

处理此问题的最简单方法是更改​​函数以接受指向将接受nh值的变量的指针。然后该函数将取消引用那些指针来更新调用函数中的相关变量。

void findN(double xI, double xF, int *ret_n, double *ret_h)
{
    ...
    *ret_n = n;
    *ret_h = h;
}

然后你可以这样调用你的函数:

int n;
double h;
findN(1.2, 3.4, &n, &h);

此方法适用于相对较少的参数。如果参数的数量太大,您可以创建一个struct,其中包含要返回的所有值,要么通过struct的地址,要么只返回struct彻底。