2015-04-22 102 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