标签: variadic-functions

c使用va_list打印参数列表

我有一个简单的参数列表.我只是想把它打印到stdout,但我在打印"结束"之前得到了有线输出.有谁知道空行和不可读的字符来自哪里?

输出:

start
hello
hello2
hello3
hello 4

UH??AWAVAUATE1?S1?H??HH?E?
end



void printTest(const char* msg, ...) {

    va_list ap;
    int i;
    const char* curMsg=0;
    va_start(ap, msg);
    printf("start\n");

    for(curMsg= msg ;  curMsg!=0 ; curMsg = va_arg(ap,  const char*)){
        printf("%s\n", curMsg);
    }
    printf("end\n");
    va_end(ap);
}



int main(){

    printTest("hello", "hello2", "hello3", "hello 4");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c printf variadic-functions

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

使用反射/将List转换为Var Args调用方法

我有一个参数列表,我有方法名称.我想使用反射调用方法.当我检查Method.invoke的java文档时,它就像Method.invoke(object o,Object args ...).我知道第一个参数传递的内容(即实例方法调用哪个方法的实例)和args是方法的参数.

但是现在我有了包含要传递给方法的值的列表.

比如说:我想调用方法ClassName.methodName(String,int,int),我有一个包含{val1,3,4}的List.

使用反射可能类似于Method.invoke(classNameInstance,??????).但我不知道如何将参数列表转换为varargs并传递.

一种方法可能是如果我知道列表大小是3然后我可以编写Method.invoke(classNameInstance,list.get(0),list.get(1),list.get(2)).

但是我想动态调用的一些方法需要0到12个参数.所以创建switch case并编写12个案例看起来并不"好".每个都将检查参数的数量,并使用参数构建单独的调用.

除了使用开关盒外,还有什么方法可以解决这个问题?

任何帮助将不胜感激.

java reflection list invoke variadic-functions

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

将Java类型表示为varargs

是否可以使用Java功能执行此类操作?

class myClass {int i; String s;}

static void myMethod(myClass... args)
{
...
}

main()
{
   myMethod(2,"two",3,"three");
}
Run Code Online (Sandbox Code Playgroud)

java variadic-functions

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

在Matlab中处理可变参数函数调用

我已经制作了一些辅助函数,它们使用其中的许多函数运行模拟.

为了使这些辅助函数更加用户友好,我想让用户选择使用较少的参数调用函数(未传递给函数的参数被赋予预定义的值).

例如,如果我有一个功能

function [res, val, h, v, u] = compute(arg1, arg2, arg3, arg4)
    if nargin < 4 || isempty(arg4) arg4 = 150; end
Run Code Online (Sandbox Code Playgroud)

以及像这样定义的函数runsim

function [res, val, h, v, u] = runsim(v, arg1, arg2, arg3, arg4)
Run Code Online (Sandbox Code Playgroud)

这种愚蠢的方式是

if nargin < 5 || isempty(arg4)
    compute(arg1, arg2, arg3)
else
    compute(arg1, arg2, arg3, arg4)
end
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是将参数更改为向量,但我不允许触及模拟背后的函数.是否有Matlab方法来处理这种情况,或者我必须用较少的参数一次又一次地编写相同的代码?

matlab variadic-functions

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

为什么将(Object)null结果变为null?

我使用java 7,并创建了一个varargs方法

public class JavaApplicationTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        addBundleMessage("b", Integer.SIZE, "key", (Object) null);
    }

    public static void addBundleMessage(String bundleName, Integer severity, String key, Object... params) {
        if (params == null)
            System.out.println("params Is null");
        else
            System.out.println("Params not null");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我不转换对象,IDE Netbeans或Eclipse会抱怨,但它会编译:

非varargs调用varags方法,最后一个参数的参数类型不精确

No cast:它显示params为null

当我将null转换为(Object)时,它显示Params not null

当我将null转换为(Object [])时,它显示params为null

这是正常的行为吗?

java variadic-functions

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

__VA_ARGS__宏扩展

我试图让我的宏工作,就像NSLog()接受变量参数.下面的代码导致解析问题.

定义这个的正确方法是什么?

#define TF_CHECKPOINT(f, ...) \
do { \
NSString *s = [[NSString alloc] initWithFormat:f arguments:__VA_ARGS__] autorelease]; \
[TestFlight passCheckpoint:[NSString stringWithFormat:@"%@: %@", [self class], s]]; \
} while (0)
Run Code Online (Sandbox Code Playgroud)

macros objective-c variadic-functions

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

为什么抛出vararg函数参数很重要?

最近我遇到了一个函数接受可变数量的参数的问题,并期望最后一个参数是一个空指针.我没有访问它的实现.

将最后一个参数转换为void*有效但直接传入NULL(nullptr不可用)不会:

foo(x,y,(void*)NULL);   //okay
foo(x,y,NULL);          //crash
Run Code Online (Sandbox Code Playgroud)

国际海事组织这不应该有所作为,但话说回来,我以前错了.你能想出演员会有什么不同的原因吗?或者这只是一个意外(一些不连续或错误的构建或smth.沿着这些线)

提前抱歉,我无法提供更多详细信息.

c++ casting variadic-functions

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

在C标准的可变参数函数中描述了什么?

我正在寻找C11标准中可变函数的描述,但我发现的唯一信息几乎没有提到这个主题.有人可以向我展示可以在其中找到的有关它们的所有主题吗?

到目前为止我发现自己的是§6.9.1.8:

如果定义了接受可变数量参数的函数而没有以省略号表示法结尾的参数类型列表,则行为未定义.

在§7.16中描述了<stdarg.h>头文件.但是我非常怀疑这是关于标准中可变函数的所有信息.

c variadic-functions language-lawyer c11

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

或作为计划中的程序

我想应用于or列表的每个元素,例如: (apply or '(#t #t #f))预期结果#t,但我收到错误:

'#'到'apply'的类型错误(kawa.lang.Macro)(预期:过程,序列或其他运算符)

据我所知,or这不是一个程序. 有没有可以用来代替的程序or

macros scheme functional-programming variadic-functions apply

3
推荐指数
2
解决办法
131
查看次数

将可变参数函数参数转发给另一个可变参数函数而无需成本

我有一个LogDebug用于日志写入的可变函数.记录以两种模式进行.LogDebugEx在大多数情况下,我的应用程序将可变参数转发给另一个可变参数函数,因此该路径需要优化.具体来说vsnprintf,我对callgrind图上的一些请求需要38%.请注意,此功能可针对单个请求多次调用.

void LogDebug(const char* zFormat, ...)
{
    char zDesc[5000];
    va_list ap;
    va_start(ap, zFormat);
    vsnprintf(zDesc, 5000, zFormat, ap);  // Need to optimize in remode mode.
    va_end(ap);

    if (m_logMode == LOG_MODE_LOCAL)    // Does not need to optimize this mode.
    {
        // This mode is not interested.
    }
    else // m_logMode == LOG_MODE_REMOTE, critical path
    {
        LogDebugEx("%s", zDesc);   // Forwarded to new variadic function
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:我需要避免zDesc在转发到LogDebugEx函数之前将整个参数列表复制到数组.有没有一种办法可以完全向前可变参数来LogDebugLogDebugEx功能?

如果不改变函数调用,任何其他奇特的方法也可以 …

c++ optimization variadic-functions perfect-forwarding c++11

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