如何传递可变参数

How to pass variadic parameters?

本文关键字:参数 变参 何传递      更新时间:2023-10-16

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

代码:

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是一个map,它包含我需要格式化的字符串。

我在enviarComandoPTZ()的第三行得到分割错误;

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

这可能是因为ToStdString:您的std::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();

并使用调试器运行

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

我花了一段时间才注意到这一点,因为我习惯了Java,我期待任何"nullpointerexception"发生,如果我试图访问一个空对象的函数,而不仅仅是在试图访问属性之后;只要我调用的函数进入"Dispositivo"并且它不是静态的,我就假设它不是空的。

感谢那些试图帮助你的人。我得到了一些很好的技巧来修复代码。