2017-10-05 54 views
0

我想寫一個模塊,它將從微控制器讀取一個特定的地址值,初始化代碼自己編譯,但是當我嘗試在一個結構內編譯它似乎抱怨。在結構中初始化指針是否有限制?在結構中初始化指針成員

#include <stdio.h> 
#include <esper.h> 
#include <stdlib.h> 
#include <stdint.h> 
#include "lmk04800.h" 

#define NUM_MSS_GPIO 32 

#define SEL_NIM  3 
#define SOURCE_SEL 4 
#define SEL_EXT  5 
#define CLK0_3_EN 6 
#define CLK4_7_EN 7 
#define CLK8_11_EN 8 
#define CLK12_15_EN 9 
#define CLK16_19_EN 10 
#define CLK20_23_EN 11 
#define LMK_SYNC 12 

typedef struct { 
    int fd_gpio[NUM_MSS_GPIO]; 
    uint8_t data_gpio[NUM_MSS_GPIO]; 
    uint32_t esata_freqCounter; 
    uint32_t ext_freqCounter; 
    uint32_t esata_trgCounter; 
    uint32_t ext_trgCounter; 

    tLMK04800 settings; 
    volatile uint32_t *freqCounter_addr; 
    volatile uint32_t *trgCounter_addr; 
    volatile uint32_t *manSync_addr; 
    freqCounter_addr = (volatile uint32_t *)0x30000000; 
    trgCounter_addr = (volatile uint32_t *)0x30000100; 
    manSync_addr = (volatile uint32_t *)0x30000200; 

} tESPERModuleTest; 

的編譯錯誤我得到的是:

test/mod_test.h:32: error: expected specifier-qualifier-list before 'freqCounter_addr' 
+0

使它只是'(uint32_t *)'。 –

+0

我不確定,但將volatile指針定義爲volatile並不能保證它指向正確值的任何內容。 –

+0

只需確認 - 'lmk04800.h'文件中指定了'tLMK04800',對吧? 'lmk04800.h'被編譯器找到了,對吧? –

回答

1

當你定義類型,你不能定義結構成員的初始值。如果允許,它可能很有用,並且初始值將自動應用於該類型的任何對象。 C只是不允許它。

您只能初始化對象。

您已經定義了一個名爲tESPERModuleTest的類型。如果要定義和初始化類型的對象,你可以定義類型(未經測試的代碼)後,做這樣的事情:

tESPERModuleTest obj = { 
    .freqCounter_addr = (volatile uint32_t *)0x30000000, 
    .trgCounter_addr = (volatile uint32_t *)0x30000100, 
    .manSync_addr = (volatile uint32_t *)0x30000200 
}; 

(其他成員將是默認初始化爲零,或者您也可以提供值爲他們)。

+0

這是爲什麼這是一個特別的原因? – Lpaulson

+0

這可能只是爲了保持語言簡單。我記得,C++最近才添加了這個功能。 –