将wchar_t []字符串的元素添加到数组<wchar_t> ^而不用for循环</wchar_t>

时间:2014-01-11 07:59:54

标签: arrays visual-c++ c++-cli

我正在编写一个vc ++ CLR表单项目,它将通过串口控制我的机器人。机器人需要ASCII命令如下:第一个字节是A和Z之间的字符,它确定要执行的命令,第二个字符是+或 - 符号,然后恰好有5个数字。如果要发送的数字少于5位,则在开头用零填充。

我正在使用System :: IO :: Ports :: SerialPort与COM端口进行通信,该端口具有以下原型:

public:
void Write(
    array<wchar_t>^ buffer, 
    int offset, 
    int count
)

由于我需要填充数字,所以它正好是5位数,我使用的是sprintf。 (我还在学习c ++并且还没有很多使用String :: Format的经验,但我认为我可以轻松地做同样的事情 - 但是现在我想用这些数组来做,为了学习)。

sprintf返回wchar_t的字符串,我现在需要将这些wchar_t添加到&lt;数组&gt;传递给函数,但我找不到一个优雅的解决方案。我工作的解决方案,但for循环对我来说真的很讨厌:

int DeltaForm::setThetas(int th1, int th2, int th3)
{
// Cannot write more than 5 digits
if (th1 < 1000 && th2 < 1000 && th3 < 1000)
{
    wchar_t commandBuffer[8];
    array<wchar_t>^ buffer = gcnew array<wchar_t>(8);

    _snwprintf_s(commandBuffer, 8, 7, L"B+%05d", th2*100);
    for (int i = 0; i < 8; i++)
    {
        buffer->SetValue(commandBuffer[i], i);
    }
    this->serialComms->Write(buffer, 0, 7);

    _snwprintf_s(commandBuffer, 8, 7, L"A+%05d", th1*100);
    for (int i = 0; i < 8; i++)
    {
        buffer->SetValue(commandBuffer[i], i);
    }
    this->serialComms->Write(buffer, 0, 7);

    _snwprintf_s(commandBuffer, 8, 7, L"C+%05d", th3*100);
    for (int i = 0; i < 8; i++)
    {
        buffer->SetValue(commandBuffer[i], i);
    }
    this->serialComms->Write(buffer, 0, 7);
}
else
{
    return 0;
}
}

我已经查看了数组类,但找不到任何可以帮助我的方法。是否有更简单,更优雅的方式来填充数组?

由于

1 个答案:

答案 0 :(得分:2)

如果您将指针固定到数组,则可以原生对待它,例如:

array<wchar_t>^ buffer = gcnew array<wchar_t>(8);
pin_ptr<wchar_t> p = &buffer[0];
_snwprintf_s(p, 8, 7, L"B+%05d", th2*100);
this->serialComms->Write(buffer, 0, 7);

我也想详细说明@Adriano提出的观点。您似乎在整个代码中使用托管C ++,虽然它是专门为将C ++与CLR混合而设计的,但最好坚持使用一种方法。

System::String^ command = String::Format("B+{0:00000}", th2*100);
array<Byte>^ command_buffer = System::Text::Encoding::Unicode->GetBytes(command);

该示例使用Unicode,因为Windows操作系统使用UTF-16来表示wchar值,但是如果这是在线上预期的那样,则应将其切换为ASCII。