我正在尝试将一些代码从C转换为C ++ 这是一个使用带有相机模块的覆盆子pi的项目,我想用它来分析图片。
但是在这段代码上(其他人创建)我得到了这个错误
231:8: error: expected primary-expression before ‘.’ token
这一行:
.max_stills_w = state->width,
我尝试了我能找到的所有东西,但它一直给我其他错误
video_port = camera->output[MMAL_CAMERA_VIDEO_PORT];
still_port = camera->output[MMAL_CAMERA_CAPTURE_PORT];
// set up the camera configuration
{
MMAL_PARAMETER_CAMERA_CONFIG_T cam_config =
{
{ MMAL_PARAMETER_CAMERA_CONFIG, sizeof(cam_config) },
.max_stills_w = state->width,
.max_stills_h = state->height,
.stills_yuv422 = 0,
.one_shot_stills = 0,
.max_preview_video_w = state->width,
.max_preview_video_h = state->height,
.num_preview_video_frames = 3,
.stills_capture_circular_buffer_height = 0,
.fast_preview_resume = 0,
.use_stc_timestamp = MMAL_PARAM_TIMESTAMP_MODE_RESET_STC
};
mmal_port_parameter_set(camera->control, &cam_config.hdr);
}
// Set the encode format on the video port
答案 0 :(得分:2)
C ++不支持命名的初始值设定项,只支持位置初始值。
您必须阅读struct
定义并将所有初始化程序排列为声明顺序。
任何未在C代码中被命名的成员都被隐式初始化为零。为了不跳过职位,你可能必须明确其中一些。
如果此代码来自JVCleave,则表示成员已经按照正确的顺序排列,您只需注释掉这些名称,它仍然有效。
答案 1 :(得分:1)
C99中的命名结构成员初始化未在C ++中实现。在C ++中,您可以使用构造函数执行成员初始化。 E.g:
struct sConfig
{
int m_x ;
int m_y ;
sConfig( int x, int y ) : m_x(x),
m_y(y)
{}
} ;
或者:
struct sConfig
{
int m_x ;
int m_y ;
sConfig( int x, int y )
{
m_x = x ;
m_y = y ;
}
} ;
甚至是两种方法的组合。然后你实例化一个对象:
sConfig myConfig( 10, 20 ) ;
在此示例中,分别将m_x
和m_y
初始化为10和20。
然后,您当然只能执行由结构定义的构造函数提供的初始化;但这并不一定是坏事 - 让用户随意决定哪些成员初始化不是特别安全或可维护。您当然可以定义多个构造函数来执行不同的初始化;您通常需要定义一个默认构造函数,例如:
struct sConfig
{
int m_x ;
int m_y ;
sConfig( int x, int y ) : m_x(x),
m_y(y)
{}
sConfig( ) : m_x(0),
m_y(0)
{}
} ;
所以在这个例子中:
sConfig myConfig ;
相当于以下所有内容:
sConfig myConfig( 0, 0 ) ;
sConfig myConfig = { 0, 0 } ;
sConfig myConfig = {0} ;