从C中的函数返回多个参数

时间:2012-04-22 02:22:14

标签: c

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

比如说我有

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

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

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

除了上述解决方法之外,还有任何简单而强大的方法吗?我必须从方法中返回大约25个不同的计算值,并且我的代码中已经有很多结构。

谢谢。

8 个答案:

答案 0 :(得分: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);
  }
}

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

答案 1 :(得分:5)

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

外的地方

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

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)increment_and_sum(&3, &4)。)

答案 2 :(得分: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);
  }
}

答案 3 :(得分:1)

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

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

答案 4 :(得分: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}

答案 5 :(得分:0)

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

    struct RET_TYPE
    {
        int a;
        int b;
    };

    struct RET_TYPE foo()
    {
         ...

         return RET_TYPE();
    }

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

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

void compute(int& a, int& b, int& c) { ... }
void compute(int* a, int* b, int* c) { ... }