2017-10-05 8 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として定義しても、ポインタが正しく指している値については何も保証されません。 –

+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++はこの機能をかなり最近に追加しました。 –

関連する問題