我一直试图找出可以从C中的函数返回多个值的方法。
比如说我有
int compute(int a, int b)
{
int c;
// do some computation on a,b,c
// return a,b,c
}
现在我可以在数组中返回这些值,并且我试图这样做,然后我意识到数组需要是动态的,所以它也可以在main()中引用。
另一种方法是我创建一个结构,然后只返回struct变量。
除了上述解决方法之外,还有任何简单而强大的方法吗?我必须从方法中返回大约25个不同的计算值,并且我的代码中已经有很多结构。
谢谢。
答案 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)
技术上说,函数只返回一个值。否则,它将不是一个函数(记住数学函数?这里的原理相同。)。
你能做的是:
涉及数组的示例:
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) { ... }