2017-10-05 53 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++最近才添加了这个功能。 –