我需要调用第三方库并传入一个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" );
}
但是我得到了错误'数组必须使用大括号括起来的初始化程序进行初始化。
这样做的正确方法是什么?
答案 0 :(得分:5)
首先,ParseBlinkOnCommand
返回对本地对象的引用,因此返回悬空引用。
第二个C数组不可复制,因此int pattern2[3] = ParseBlinkOnCommand(rxbuffer);
应为int (&pattern2)[3] = ParseBlinkOnCommand(rxbuffer);
。
但为什么不使用std::vector
或std::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" );
}