我有一个函数应该根据格式字符串获取可变数量的参数(使用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) 我想了解使用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中有关.我发现这篇四年前的博客文章似乎在谈论同样的问题,但我无法重现那里的"成功"案例.关于这里可能会发生什么的任何想法?
我得到错误表达式"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
在下面的示例中:
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位值为什么印刷两种char及int16_t,为什么他们能进行比较和被认为是一样的吗?
我已经使用了以下功能很长一段时间了:
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*应解决的问题.
我的问题是:
我有一个功能;
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太大了吗?
谢谢.
在下面的示例代码中,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) 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) 我正在将一些Elasticsearch Java API转换为Scala。Java中有一些采用类型为变量的方法String... indices,因此我试图为Scala函数提供类型为变量的函数,该函数indices: String*封装了该Java方法。我没有找到转换String*为的方法String...。
我感谢您的帮助。
我有一个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()吗?