2015-04-22 190 views
0

我想一些代码由C转换为C++ 这是一个用带摄像头模块树莓派一个项目,我想分析的图片吧。从C代码转换到C++

但在这一段代码(别人创建)我得到这个错误

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 
+3

这是一个C99功能,不可用C++编写。你只需实例化你的'struct'变量,然后赋值给指定的成员,你不能用写成的名字成员来初始化。 – CoryKramer

+0

@Cyber​​这个问题是否解释了如何在C++中进行等价处理?如果不是,它不是重复的。 – Barmar

+0

您不应该转换工作的C代码。我建议用C++包装C代码(如果它有开发/维护的好处) –

回答

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_xm_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} ; 
+0

在C++中,聚合初始化仍然可以正常工作。 –

+0

@BenVoigt:我没有说过,否则(虽然我编辑澄清 - 也许你指的是预先编辑的文本?);你的答案仍然有效 - 我选择不复制它。我建议C99命名成员初始化,因为它没有构造函数,同样C++没有命名成员初始化*因为它有构造函数。我简单地说这种方法是选择性成员初始化的C++方法。 – Clifford

2

C++不支持名为initializers,只有位置的。

你必须阅读struct定义,并安排所有的初始化为声明顺序。

其未在C代码被命名的任何成员都被初始化为隐含零。为了不跳过职位,你可能必须明确地写明其中的一些。

如果此代码来自JVCleave,那么看起来成员已经按照正确的顺序排列,您只需注释掉名称即可。

+0

C++通过构造函数初始化列表支持使用不同语法的命名初始化程序。 – Clifford