如何传递可变参数?

时间:2014-07-01 12:26:25

标签: c++ variadic-functions

我试图传递一些可变参数,但我没有成功。

代码:

void Dispositivo::enviarComandoPTZ( AcaoPTZEnum in_acao, DirecaoPTZEnum in_direcao )
{
    std::string direcao = direcaoPTZMap[in_direcao];
    std::string acao = StringUtil::to_string(in_acao);

    char* buf = ByteUtil::hexStringToRawBytes( ComandoUtil::gerarComando( PTZ, m_sessao, acao.c_str(), direcao.c_str(), "4") ); // IT CRASHES HERE

    int len = sizeof(buf);
    m_pSocket->Write( buf, len );
}

std::string ComandoUtil::gerarComando(TipoComandoEnum in_tipo, std::string in_sessao, ...)
{
    va_list parametros;
    va_start ( parametros, in_sessao );

    std::string payload = obterPayload(in_tipo,parametros);

    Requisicao requisicao = Requisicao(in_tipo, payload, in_sessao);

    return requisicao.gerarDados();
}

std::string ComandoUtil::obterPayload( TipoComandoEnum tipo, va_list parametros)
{
    return (wxString::FormatV(_(payloadMap[tipo]),parametros)).ToStdString();
}

payloadMap是一个包含我需要格式化的字符串的映射。

我在enviarComandoPTZ()的第3行遇到了分段错误;

2 个答案:

答案 0 :(得分:0)

看看this。也许你的字符串大于1024个符号?

可能是因为ToStdStringstd::string的实现不等于wxWidget的实现。试着打电话:

return (wxString::FormatV(_(payloadMap[tipo]),parametros)).c_str();

将此调用分解为此类步骤

wxString str = payloadMap[ tipo ];
wxString fmt = _( str ); // BTW, what is this ?
wxString res = wxString::FormatV( fmt, parametros );
return res.c_str();

并使用调试器

运行它

答案 1 :(得分:0)

问题与可变参数无关。其中一个函数参数(m_sessao)无法访问,因为对象Dispositivo为null。

我花了一段时间才注意到这一点,因为我已经习惯了Java,我期待任何“nullpointerexception”发生,如果我试图访问一个null对象的函数,而不是在尝试访问该属性之后;一旦我调用的函数进入“Dispositivo”并且它不是静态的,我认为它不是空的。

感谢那些试图提供帮助的人。我有一些很好的技巧来修复代码。