如何将void指针强制转换为int [3]?

时间:2015-07-14 16:18:21

标签: c++ arrays

我需要调用第三方库并传入一个int [3]作为void *,就像这样[作品]:

int pattern[3] = {2,4,10};
if ( OSTaskCreate( BlinkLED,
        ( void * ) pattern,
        ( void * ) &BlinkTaskStack[USER_TASK_STK_SIZE],
        ( void * ) BlinkTaskStack,
        MAIN_PRIO - 1 ) != OS_NO_ERR )
{
    iprintf( "*** Error creating blink task\r\n" );
}

但是现在我需要解析一个字符串来获取模式数组,而我似乎无法正确使用它。

首先我将字符串传递给解析器并返回数组:

int (&ParseBlinkOnCommand(char rxbuffer[3]))[3]
{
   // Code parses rxbuffer and creates the 3 ints needed

   int pattern[3] = {repeats, onTicks, offTicks};  
   return pattern;
}

然后我尝试将它传递给OSTaskCreate,就像我之前一样:

int pattern2[3] = ParseBlinkOnCommand(rxbuffer);                    
if ( OSTaskCreate( BlinkLED,
        ( void * ) pattern2,
        ( void * ) &BlinkTaskStack[USER_TASK_STK_SIZE],
        ( void * ) BlinkTaskStack,
        MAIN_PRIO - 1 ) != OS_NO_ERR )
{
    iprintf( "*** Error creating remote blink task\r\n" );
}

但是我得到了错误'数组必须使用大括号括起来的初始化程序进行初始化。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:5)

首先,ParseBlinkOnCommand返回对本地对象的引用,因此返回悬空引用。

第二个C数组不可复制,因此int pattern2[3] = ParseBlinkOnCommand(rxbuffer);应为int (&pattern2)[3] = ParseBlinkOnCommand(rxbuffer);

但为什么不使用std::vectorstd::array(或自定义结构)?

std::vector<int> ParseBlinkOnCommand(const char (&rxbuffer)[3])
{
   // Code parses rxbuffer and creates the 3 ints needed

   return {repeats, onTicks, offTicks};  
}

然后

auto pattern2 = ParseBlinkOnCommand(rxbuffer);                    
if ( OSTaskCreate( BlinkLED,
                   pattern2.data(),
                   &BlinkTaskStack[USER_TASK_STK_SIZE],
                   BlinkTaskStack,
                   MAIN_PRIO - 1 ) != OS_NO_ERR )
{
    iprintf( "*** Error creating remote blink task\r\n" );
}