标签: variadic-functions

varargs功能崩溃

我有一个函数应该根据格式字符串获取可变数量的参数(使用varargs):

void va(const char* name, const char* argformat, ...) {
    int numOfArgs = strlen(argformat);

    std::string buf = "asdf";

    va_list listPointer;
    va_start(listPointer, numOfArgs);
    char* blah;

    for(int i = 0; i < numOfArgs; i++) {
            switch (argformat[i]) {
                    case 's':
                            cout << va_arg(listPointer, char*) << endl;
                            break;
                    case 'i':
                            cout << va_arg(listPointer, int) << endl;
                            break;
                    case 'f':
                            cout << va_arg(listPointer, float) << endl;
                            break;
                    case 'b':
                            cout << va_arg(listPointer, bool) << endl;
                            break;
                    default:
                            break;
            }
    }

    va_end(listPointer);

    return;
}


int …
Run Code Online (Sandbox Code Playgroud)

c++ crash variadic-functions

1
推荐指数
1
解决办法
897
查看次数

使用Java反射调用变量arity方法?

我想了解使用Java反射调用变量arity方法可能会发生什么.假设我们有一个简单的方法:

void doAllTheThings(Object ... things) {
  // ...which does something with all the things...
}
Run Code Online (Sandbox Code Playgroud)

我们想要动态调用它,所以我们通过反射来获取方法:

Method doItAll = Superklass.getDeclaredMethod("doAllTheThings", Object[].class);
Run Code Online (Sandbox Code Playgroud)

并传入一个数组:

Object[] allTheThings = new Object[] { "abc", true, 15 };
doItAll.invoke(allTheThings);
Run Code Online (Sandbox Code Playgroud)

现在,这似乎并不像我直觉所说的那样有效; 特别是,IllegalArgumentException当我尝试使用像这样的varargs调用方法时,我似乎得到了各种各样的阴影.

显然我在这里缺少一些东西.我的猜测是,这与变量如何被编组到varargs中有关.我发现这篇四年前的博客文章似乎在谈论同样的问题,但我无法重现那里的"成功"案例.关于这里可能会发生什么的任何想法?

java reflection variadic-functions arity

1
推荐指数
1
解决办法
1630
查看次数

具有可变函数的char之前的预期表达式

我得到错误表达式"char之前的预期表达式"

char *set_buffer(char *buf, int num_str, ...) { 
    va_list args;
    va_start(args, num_str); 
    for (int i = 0, offset = 0; i < num_str; ++i) {
         char *str = va_args(args, char *); // error here
         offset += snprintf(buf+offset, strlen(str), str); 
    }
    va_end(args);
}
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么?c

c variadic-functions

1
推荐指数
1
解决办法
461
查看次数

Char和int16数组元素都显示为32位十六进制?

在下面的示例中:

int main(int argc, char *argv[])
{
    int16_t array1[] = {0xffff,0xffff,0xffff,0xffff};
    char array2[] = {0xff,0xff,0xff,0xff};
    printf("Char size: %d \nint16_t size: %d \n", sizeof(char), sizeof(int16_t));

    if (*array1 == *array2)
        printf("They are the same \n");
    if (array1[0] == array2[0])
        printf("They are the same \n");

    printf("%x \n", array1[0]);
    printf("%x \n", *array1);

    printf("%x \n", array2[0]);
    printf("%x \n", *array2);
}
Run Code Online (Sandbox Code Playgroud)

输出:

Char size: 1 
int16_t size: 2 
They are the same 
They are the same 
ffffffff 
ffffffff 
ffffffff 
ffffffff
Run Code Online (Sandbox Code Playgroud)

32位值为什么印刷两种charint16_t,为什么他们能进行比较和被认为是一样的吗?

c variadic-functions integer-promotion

1
推荐指数
1
解决办法
234
查看次数

Variadic函数在Win32中有效,但在Win64中无效

我已经使用了以下功能很长一段时间了:

void AddRow(int iNumOfColumns,...)
{
    int* pValuePerColumn = (int*)&iNumOfColumns+1;

    for (int i=0; i<iNumOfColumns; i++)
    {
        // Do something with pValuePerColumn[i]
    }
}
Run Code Online (Sandbox Code Playgroud)

现在事实证明它在Win64上为我们的一个客户崩溃了.

我手头没有64位平台,但我假设原因是:

调用该函数时,参数将作为64位值推入堆栈.

在这个假设下,我认为,更换int*size_t*应解决的问题.


我的问题是:

  • 我的分析是否正确?
  • 我的解决方案是否正确
  • 是否有更"常规"的解决方法?

c 64-bit variadic-functions

1
推荐指数
1
解决办法
67
查看次数

C - Sprintf的变量参数?

我有一个功能;

void foo(const char* format, ...)
{
    char buffer[1080];

    // Supposed way to handle C Variable Arguments?
    va_list argptr;
    va_start(argptr, format);
    sprintf(buffer, format, argptr);
    va_end(argptr);

    printf_s("%s.\n", buffer);
}

int main()
{
    int val = 53;
    foo("%d", val);
}
Run Code Online (Sandbox Code Playgroud)

每次运行时,我都会得到每次运行时都会发生变化的大量数字.12253360, 5306452等我不明白为什么.

这是我的sprintf电话,还是我正在做的事情va_list argptr;?我buffer太大了吗?

谢谢.

c variadic-functions

1
推荐指数
1
解决办法
937
查看次数

C printf函数如何知道传递的整数大小?

在下面的示例代码中,printf如何知道uint8_t应该打印的大小,而上述格式只是"0x%x"而passd类型是uint32_t?printf怎么知道在第一次调用时它必须打印4个字节而第二个调用它必须只打印1个字节?

uint32_t X = 0xAABBCCDD;
printf("uint32_t 0x%x\n", (uint32_t) X);
printf("uint8_t  0x%x\n", (uint8_t) X);
Run Code Online (Sandbox Code Playgroud)

产量

uint32_t 0xaabbccdd
uint8_t  0xdd
Run Code Online (Sandbox Code Playgroud)

c printf pointers variadic-functions

1
推荐指数
1
解决办法
215
查看次数

为什么在Java varargs(int ... x,double ... y)中出现此编译错误?

static void m(int ...x,double ...y){}
Run Code Online (Sandbox Code Playgroud)

我尝试使用这种方法。但是它编译错误。我想知道原因。

int x[]=new int[2];
double y[]=new double[2];
Run Code Online (Sandbox Code Playgroud)

我这样做两个数组,我想将它们解析为方法m

m(x,y); like this.
Run Code Online (Sandbox Code Playgroud)

java methods variadic-functions

1
推荐指数
1
解决办法
114
查看次数

将“ String *”(Scala)与“ String ...”(Java)相互转换

我正在将一些Elasticsearch Java API转换为Scala。Java中有一些采用类型为变量的方法String... indices,因此我试图为Scala函数提供类型为变量的函数,该函数indices: String*封装了该Java方法。我没有找到转换String*为的方法String...

我感谢您的帮助。

java scala variadic-functions scala-java-interop

1
推荐指数
1
解决办法
66
查看次数

使用va_list和va_arg实现子功能

我有一个varargs样式的函数,我想拆分为va_list样式的子函数。原始功能:

void container_append(container_t *c, element_t *element, ...) {
  element_t *e;
  va_list ap;

  va_start(ap, element);
  while((e = va_arg(ap, element_t *)) != NULL) {
    container_append_aux(c, e);
  }
  va_end(ap);
}
Run Code Online (Sandbox Code Playgroud)

请注意,调用者必须以NULL终止元素列表,但这不会引起任何问题。重构:

void container_append(container_t *c, element_t *element, ...) {
  va_list ap;
  va_start(ap, element);
  container_vappend(c, ap);
  va_end(ap);
}

void container_vappend(container_t *c, va_list ap) {
  element_t *e;
  while ((e = va_arg(ap, element_t *)) != NULL) {
    container_append_aux(c, e);
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我这样称呼它时:

container_append(c, NULL);
Run Code Online (Sandbox Code Playgroud)

...内container_vappend()的呼叫传va_arg()回非NULL的值。

这是一个更复杂的函数的抄写,但是除非有任何错别字,否则我在设置和使用va_listand时错过了什么va_arg()吗?

c variadic-functions

1
推荐指数
1
解决办法
67
查看次数