0

我一直在尝试找出可以从 C 中的函数返回多个值的方法。

比如说我有

int compute(int a, int b)
{
int c;
// do some computation on a,b,c
// return a,b,c
}

现在我可以在数组中返回这些值,我试图这样做,然后我意识到数组需要是动态的,因此它也可以在 main() 中引用。

另一种方法可能是我创建一个结构,然后只返回结构变量。

除了上述解决方法之外,是否有任何简单而强大的方法来做到这一点?我必须从一个方法返回大约 25 个彼此独立的不同计算值,而且我的代码中已经有很多结构。

谢谢你。

4

8 回答 8

6

您不能轻易返回多个变量,例如带有return (a,b,c). 但是,您可以传递设置为其他“返回值”的指针或使用结构。

空间不足

如果您希望函数实际返回单独的值而不修改其参数,一种简单的方法是传递额外的指针(您也可以使用结构)。例如,此函数将计算一对数字的和和差:

int add_sub(int a, int b, int* ret2) {
   if (ret2) *ret2 = a - b;
   return a + b;
}

if (ret1)允许您安全地作为指针参数传递,NULL以便您可以忽略该返回值。你像这样使用它:

int add, sub;
add = add_sub(10, 3, &sub);
// add == 13, sub == 7

int just_add;
just_add = add_sub(15, 5, NULL);
// just_add == 20

(注意,如果你两次传递相同的参数,这种技术可能会导致令人困惑的行为,例如a = add_sub(a, b, &b)不给你想要的东西。)

到位

如果你想修改函数的参数,你可以将它们作为指针传递。例如,这个函数将增加它的两个参数,然后返回它们的总和:

int increment_and_sum(int* a, int* b) {
     (*a)++;
     (*b)++;
     return a + b
}

您使用的是:

int a = 10, b = 3, sum;
sum = increment_and_sum(&a, &b);
// a == 11, b == 4, sum == 15

(请注意,您不能在 中使用文字increment_and_sum,也就是说,您不能使用increment_and_sum(3, 4)or increment_and_sum(&3, &4)。)

于 2012-04-22T02:38:37.997 回答
5

如果这些值在逻辑上都是相关的,那么将它们放入一个结构中是有意义的。但是,如果您只更改几个不紧密耦合的值,则可以将它们作为指针传递,如下所示:

int swap(int *a, int *b) {
  int tmp;

  if (a == b) { // Pointers are equal, so there's nothing to do!
    return -1;  // Indicate the values haven't changed.
  }

  tmp = *a;
  *a = *b;
  *b = tmp;
  return 0;  // Indicate the swap was successful.
}

void main(...) {
  int first = 12;
  int second = 34;

  if (swap(&first, &second) == -1) {
    printf("Didn't swap: %d, %\n", first, second);
  } else {
    printf("Swapped: %d, %d\n", first, second);
  }
}

这是一种相当标准的技术,将数据放入函数参数中,并让函数返回一个值来指示成功/失败或其他一些条件。\

于 2012-04-22T02:28:19.977 回答
2

您不可能必须将指针传递给变量并在您的方法中设置它们。像这样:

void get_some_values()
{
    int a=0, b=0, c=0;
    compute(&a, &b, &c);

    // after call to compute a=1, b=2, c=3;
}

void compute(int *a, int *b, int c*)
{
    *a = 1;
    *b = 2;
    *c = 3;
}
于 2012-04-22T02:30:11.847 回答
2

正常的方法是使用指针参数。如果您需要返回可变数量的事物,您可以使用指向数据的指针和指向整数“事物数量”的指针。另一种方法是指针对指针,并让您的函数根据需要分配内存。这使得调用者负责释放它。

例子:

int make_numbers(int **numbers, int *count)
{
  /* work out how many numbers we want to generate */
  *count = howmany;
  *numbers = malloc(*count * sizeof(int));
  /* fill *numbers array here */
  return 0; /* success */
}

void caller(void)
{
  int *numbers;
  int count;
  if (0 == make_numbers(&numbers, &count)) {
    /* use the numbers */
    free(numbers);
  }
}
于 2012-04-22T02:36:05.157 回答
1

从技术上讲,一个函数只返回一个值。否则,它就不是一个函数(还记得数学函数吗?这里的原理相同。)。

你可以做的是:

  • 如果元素相关,则将它们放在结构中并返回结构。可能是最简单和最清晰的方法。
  • 将它们放在一个数组中并返回该数组。就像结构一样简单,但可能不那么清楚。
  • (仅限数值)您可以使用一种自行设计的映射将它们转换为一个整数(a = 100 * a,b = 10 * b,c = c)。

涉及数组的示例:

int* coords(int x, int y) {
    int *a = calloc(sizeof(int), 2);
    a[0] = x;
    a[1] = y;
    return a;
} 

int main() {

    int* vals = coords(47, -121);
    printf("vals = {%d, %d}\n", vals[0], vals[1]);
    return 0;
}

vals = {47, -121}
于 2012-04-22T02:31:24.237 回答
0

不,你不能,但另一个更 c++ish 的替代解决方案是创建一个结构然后返回它。

    struct RET_TYPE
    {
        int a;
        int b;
    };

    struct RET_TYPE foo()
    {
         ...

         return RET_TYPE();
    }
于 2012-04-22T02:31:00.867 回答
0

您也可以使用指针返回数组,这里是演示。 http://www.tutorialspoint.com/cprogramming/c_return_arrays_from_function.htm

于 2015-11-14T18:28:26.667 回答
-1

如果你不想要结构,你只能通过引用传递。需要好的文档,甚至可能需要声明式编程。

void compute(int& a, int& b, int& c) { ... }
void compute(int* a, int* b, int* c) { ... }
于 2012-04-22T02:30:53.410 回答