Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用可变函数将整数和/或整数数组转换为单个整数数组_C++_Arrays_Variadic Functions - Fatal编程技术网

C++ 使用可变函数将整数和/或整数数组转换为单个整数数组

C++ 使用可变函数将整数和/或整数数组转换为单个整数数组,c++,arrays,variadic-functions,C++,Arrays,Variadic Functions,我正在尝试编写一个函数,其中包含数量可变的integer/int数组参数,将所有元素连接到一个一维数组中。我正在努力解决两种情况中的一种,即当前_项原来是一个数组而不是一个整数。如何访问此数组的各个元素并将其分配给pOutList typedef unsigned short WORD; int PinListJoin(WORD * pOutList, ...) { int index=0; boolean isArray = false; va_list

我正在尝试编写一个函数,其中包含数量可变的integer/int数组参数,将所有元素连接到一个一维数组中。我正在努力解决两种情况中的一种,即当前_项原来是一个数组而不是一个整数。如何访问此数组的各个元素并将其分配给pOutList

typedef unsigned short      WORD;

int PinListJoin(WORD * pOutList, ...) {

    int index=0;
    boolean isArray = false;

    va_list next_item;
    va_start(next_item, pOutList);
    WORD current_item = va_arg(next_item, WORD);
    int current_item_size = sizeof(current_item) / sizeof(WORD);

    if (current_item_size > 1) {
        isArray = true;
        for (int pinidx = 0; pinidx < current_item_size; pinidx++) {
            pOutList[index] = current_item;
            index++;
        }
    }
    else {
        isArray = false;
        pOutList[index] = current_item;
        index++;
    }

    va_end(next_item);

    return(current_item_size);

}
typedef无符号短字;
int PinListJoin(单词*pOutList,…){
int指数=0;
布尔isArray=false;
列出下一个项目;
va_开始(下一个_项目,pOutList);
WORD当前项目=va项目(下一个项目,WORD);
int current\u item\u size=sizeof(current\u item)/sizeof(WORD);
如果(当前项目大小>1){
isArray=true;
对于(int-pinidx=0;pinidx

C++中没有<代码>布尔< <代码>数据类型> < /p> 此外,函数中未使用

isArray
index
变量的值

这是行不通的。变量参数被提升
unsigned short
升级为
int
(通常,在某些特殊系统上,它可能是
unsigned int
)。将非升级类型与
va_arg
一起使用将导致未定义的行为。您可以使用以下技巧为任何系统获取正确的类型:

using promoted_word = decltype(+WORD(0));
WORD current_item = WORD(va_arg(next_item, promoted_word));
WORD
的大小除以
WORD
的大小始终为1。这样做没有意义

我正在努力解决两种情况中的一种,即当前_项原来是一个数组而不是一个整数。如何访问此数组的各个元素并将其分配给pOutList

typedef unsigned short      WORD;

int PinListJoin(WORD * pOutList, ...) {

    int index=0;
    boolean isArray = false;

    va_list next_item;
    va_start(next_item, pOutList);
    WORD current_item = va_arg(next_item, WORD);
    int current_item_size = sizeof(current_item) / sizeof(WORD);

    if (current_item_size > 1) {
        isArray = true;
        for (int pinidx = 0; pinidx < current_item_size; pinidx++) {
            pOutList[index] = current_item;
            index++;
        }
    }
    else {
        isArray = false;
        pOutList[index] = current_item;
        index++;
    }

    va_end(next_item);

    return(current_item_size);

}
函数参数不能是数组。但它可以是指向数组元素的指针,我想这就是你的意思。如果是这种情况,那么您可以像这样从varargs中取出指针:

WORD* current_item = va_arg(next_item, WORD*);
然后可以将元素从一个数组复制到另一个数组,就像使用指向元素的任何指针一样

但是仍然有两个问题:1。无法根据指针和2找出数组的大小。无法找出传递的参数类型(即,它是(指向)n数组的指针还是整数)。您可以查看
printf
的界面,了解如何解决该问题。在这里,使用指定了这些类型的格式字符串来解决这个问题。数组的长度通过使用sentinel值(空终止符字符)来解决。另一种方法是将长度作为单独的参数传递


更一般地说:我建议您在C++中不使用C样式的VARARGS。射自己的脚太容易了。可变模板是更安全和更强大的方式来实现类似的事情


我说,我不太明白你想做什么,所以我不能确认使用任何形式的变量是否有意义。

你应该使用C++模板,而不是C的变量参数黑客。如图所示,这实际上不能用C的可变参数hack来实现,因为不管C函数收到多少实际参数,它都不知道。它必须以某种方式推断出它会变得混乱,并且容易出错。另一方面,这正是C++模板所需要的。您是否考虑过使用适当的C++模板,而不是使用史前C变量参数宏?您应该意识到显示的代码有致命的缺陷,因为
当前项目大小
显然总是1。这对我来说是全新的,可变模板。现在看一些例子。查找很容易…一旦你知道2)你在找什么和2)在哪里找它:D。我现在知道的是声明如下:模板int PinListJoin(Arg1 pOutList,Args…Args)我正在定义上挣扎。为了解决递归是必要的这个问题,我需要定义“基本情况”和“递归情况”函数吗?
WORD current_item = va_arg(next_item, WORD);
int current_item_size = sizeof(current_item) / sizeof(WORD);
WORD* current_item = va_arg(next_item, WORD*);