【发布时间】:2021-10-02 18:30:05
【问题描述】:
我有一个可变参数函数,它至少需要 3 个参数,格式为
foo(void* ret_val, int mode, int num_params, ...)
可变参数函数foo() 的一般用途可能涉及返回不同的数据类型以及可以具有各种数据类型的任意数量的输入参数,但我无法找到返回数组的方法。
如何返回数组?
函数定义是第一个参数根据foo()调用的函数返回任意类型,mode是操作方式,num_params是附加输入参数个数,可以为零.在foo() 中有一个switch 语句,它依赖于mode,可以调用一个或多个函数,并且可以返回任意类型的值。
作为一个简化的示例,假设我有以下 3 个由foo() 调用的函数:
void bar1(int i, int, j) {
// Do some calculations but return nothing.
}
int bar2() {
// Do some calculations and return a value.
}
int* bar(3) {
// Do some calculations with an array and return it.
}
那么在foo()我可以有以下代码:
foo(void* ret_val, int mode, int num_params, ...) {
va_list args;
va_start(args, num_params);
switch (mode) {
case 1: {
int a = va_arg(args, int);
int b = va_arg(args, int);
bar1(a, b);
}
break;
case 2: {
int val = bar1();
*(int*)ret_val = val;
}
break;
case 3: {
int* p = new int[10];
p = bar3();
// Add a loop to test out that the array has been read from bar3(), which works.
*(int*)ret_val = *p; // <== This is where the problem is.
}
break;
}
va_end(args);
}
然后在主程序中我可以通过以下方式调用foo():
int x;
foo(&x, 1, 2, 10, 20); // Call bar1()
foo(&x, 2, 0); // Call bar2()
printf("%d\n", x);
int xd[10]; // Declare and initialize xd.
for (int i = 0; i < 10; i++) {
xd[i] = 0;
}
foo(xd, 3, 0) // Call bar3()
for (int i = 0; i < 10; i++) {
printf("%d %d\n", i, xd[i]);
}
我调用了bar1() 和bar2() 以获取上下文,并且它们起作用了。对于bar1(),提供了两个整数,但没有返回任何内容,并且必须提供一个虚拟输出参数。对于bar2(),没有给出输入值,但返回了一个输出int,它被转换为star(int star),它可以正常工作并正确返回。
但是,对于bar3(),我在内部生成了一个包含 10 个元素的数组作为测试,该数组在 print 语句中的foo() 中正确返回,但我无法将数组返回给main()。我摆弄了各种涉及指针的语句,但是如果数组已初始化,则返回零列表,否则返回垃圾。
如何正确返回数组?
【问题讨论】:
-
这不是C; C 没有
new运算符,如new int[10];。你是用 C 还是 C++ 编写的? -
将
int xd[10];更改为int *xd;并调用为foo(&xd, 3, 0)。还需要*(int*)ret_val = *p;为*(int**)ret_val = p;(假设bar3返回int *。 -
在
foo(xd, 3, 0)中,您希望foo填充一个通过第一个参数传递给它的数组,还是希望它返回一个指向它已分配的数组的指针通过将指向该数组第一个元素的指针放在xd? -
这个函数应该如何被准确调用?
ret_val应该指向什么? -
@kaylum:这还不够。然后他们将
int **作为void *传递,但在foo作为int *访问它。
标签: c++ implicit-conversion pass-by-value