C++ 如何将空指针强制转换为int[3]?
我需要调用一个第三方库,并将int[3]作为void传入*如下[works]:C++ 如何将空指针强制转换为int[3]?,c++,arrays,C++,Arrays,我需要调用一个第三方库,并将int[3]作为void传入*如下[works]: int pattern[3] = {2,4,10}; if ( OSTaskCreate( BlinkLED, ( void * ) pattern, ( void * ) &BlinkTaskStack[USER_TASK_STK_SIZE], ( void * ) BlinkTaskStack, MAIN_PRIO - 1 ) != OS_N
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" );
}
但是我得到了一个错误“数组必须用括号内的初始值设定项初始化”
正确的方法是什么?首先,
ParseBlinkOnCommand
返回对本地对象的引用,然后返回悬挂引用
第二个C数组不可复制,因此int pattern2[3]=ParseBlinkOnCommand(rxbuffer)代码>应该是int(&pattern2)[3]=ParseBlinkOnCommand(rxbuffer)代码>
但是为什么不使用std::vector
或std::array
(或自定义结构)
首先,ParseBlinkOnCommand
返回对本地对象的引用,从而返回悬挂引用
第二个C数组不可复制,因此int pattern2[3]=ParseBlinkOnCommand(rxbuffer)代码>应该是int(&pattern2)[3]=ParseBlinkOnCommand(rxbuffer)代码>
但是为什么不使用std::vector
或std::array
(或自定义结构)
不相关,但您正在返回对int-pattern[3]
的引用,这是一个本地数组-不要这样做。int-pattern[3]={repeats,onTicks,offTicks};回报模式代码>返回局部变量的地址。这是未定义的行为。不相关,但您正在返回对int-pattern[3]
的引用,这是一个本地数组-不要这样做。int-pattern[3]={repeats,onTicks,offTicks};回报模式代码>返回局部变量的地址。这是未定义的行为。正在使用名为patternType的结构(3个整型字段),因此pattern2现在是patternType类型。由于OSTaskCreate的第二个参数必须是void*如何传入结构?我在想(void*)和pattern2。。。在函数签名为“void BlinkLED(void*pdata)”的情况下,如何在BlinkLED函数内部将其转换回patternType?patternType myPattern=(patternType)pdata;不对…回答:patternType pattern=*(patternType*)(pdata)代码>现在使用名为patternType的结构(3个整型字段),因此pattern2现在是patternType类型。由于OSTaskCreate的第二个参数必须是void*如何传入结构?我在想(void*)和pattern2。。。在函数签名为“void BlinkLED(void*pdata)”的情况下,如何在BlinkLED函数内部将其转换回patternType?patternType myPattern=(patternType)pdata;不对…回答:patternType pattern=*(patternType*)(pdata)代码>
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" );
}