繁体   English   中英

访问结构中的指针(变量)结构的成员

[英]Accessing a member of a pointer (variable) struct within a struct

达成协议:我正在开发一个C函数,该函数配置包含许多成员的结构,例如* BASE(指向结构的指针),ID,MODE; 但是BASE是一个结构,根据接口的不同,可以将其定义为“结构a”,“结构b”,“ ...”。 这是结构(和一些示例)声明:

typedef unsigned int u32_t;
typedef unsigned char u8_t;
typedef struct _interface_t{
    u32_t *BASE;
    u8_t ID;
    u32_t MODE;
} interface_t;

interface_t USART0_DEV  = {AT91C_BASE_US0, AT91C_ID_US0, 0}; // <-- Here we have a AT91C_BASE_US0 struct as *BASE
interface_t USART1_DEV  = {AT91C_BASE_US1, AT91C_ID_US1, 0};
interface_t TC0_DEV     = {AT91C_BASE_TC0, AT91C_ID_TC0, 0}; // <-- Here we have a AT91C_BASE_TC0 struct as *BASE
interface_t TC1_DEV     = {AT91C_BASE_TC1, AT91C_ID_TC1, 0};
interface_t TC2_DEV     = {AT91C_BASE_TC2, AT91C_ID_TC2, 0};
interface_t TWI_DEV     = {AT91C_BASE_TWI, AT91C_ID_TWI, 0}; // <-- Here we have a AT91C_BASE_TWI struct as *BASE

如您所见,我使用u32_t代替了该结构,因为我声明了一个指向该结构的指针。 后来我将函数定义为:

unsigned char ConfigureDevice(interface_t *Interface, u32_t config, u32_t Speed, u32_t IRQ_Trigger, void (*Interface_irq_handler)(void)){
    ...
    Interface->BASE->US_IER = IRQ_Trigger; //Note: US_IER Must receive a vector to a function
    ...
}

但是我收到错误消息“ US_IER无法解决”。 所以我尝试了AT91S_USART InterfaceBASE = Interface->BASE; InterfaceBASE->US_IER = IRQ_Trigger; AT91S_USART InterfaceBASE = Interface->BASE; InterfaceBASE->US_IER = IRQ_Trigger; 而不是Interface->BASE->US_IER = IRQ_Trigger; 并没有错误。 但是我不能使用它,因为我并不总是知道我正在处理哪种接口(直到我读完ID成员)。

更糟糕的是:当我尝试编译时,我在u32_t typedef中的conflicting type qualifiers for 'u32_t'错误和initialization from incompatible pointer type near initialization for USART0_DEV.BASE在每个interface_t定义中near initialization for USART0_DEV.BASE警告的near initialization for USART0_DEV.BASE遇到conflicting type qualifiers for 'u32_t'

我在论坛上进行了搜索,但无法弄清楚我的错误。 这些帮助:

我的代码有什么问题? 我该怎么办才能使用Interface->BASE->US_IER

编辑:嗨!,所以这就是我得到的:

typedef struct _Interface_t{
    struct PERIPH_BASE * BASE;
    u32_t ID;
    u32_t MODE;
Interface_t;

Interface_t USART0_DEV  = {(struct PERIPH_BASE *)AT91C_BASE_US0, AT91C_ID_US0, 0};
...
unsigned char ConfigureDevice(Interface_t *Interface, u32_t config, u32_t Speed, u32_t IRQ_Trigger,...
...
((AT91S_SYS)Interface->BASE)->AIC_IECR = IRQ_Trigger; //No problems marked by Eclipse Code Editor
....

}

看起来不错,但是在编译时,我cast to union type from type not present in union错误中cast to union type from type not present in union ...

如果您想保持“开放”状态,则应将BASE定义为

void *BASE;

或者,为了用信号表示/说明它是一个特殊的指针,可以使用不完整的类型:

struct hwbase * BASE;

并将其定义为

interface_t USART0_DEV  = {AT91C_BASE_US0, AT91C_ID_US0, 0};

如果您使用void *或更确切地说

interface_t USART0_DEV  = {(struct hwbase *)AT91C_BASE_US0, AT91C_ID_US0, 0};

对于第二个选项。

然后,在使用后,在确保使用正确类型的硬件(例如TWI,USART)上运行之后,就可以进行投射。

将指针从上方投射到正确的类型,例如

unsigned char ConfigureDevice(interface_t *Interface, u32_t config, u32_t Speed, u32_t IRQ_Trigger, void (*Interface_irq_handler)(void)){
    ...
    ((AT91S_USART *)Interface->BASE)->US_IER = IRQ_Trigger; //Note: US_IER Must receive a vector to a function
    ...
}

(这里我不确定AT91S_USART是否已经是指针类型-在这种情况下,您将省略* 。)

另一种选择是添加一些函数指针,以具有一种“穷人的OOP”:

typedef void config_func(struct _interface_t *, whateveryouneed...)

config_func config_usart; // forward declaration, does as well ensire you have no typo in the function
typedef struct _interface_t{
    void *BASE;
    u8_t ID;
    u32_t MODE;
    config_func * configure; // function pointer
} interface_t;

interface_t USART0_DEV  = {AT91C_BASE_US0, AT91C_ID_US0, 0, config_usart };

void config_usart(struct _interface_t * iface, whateveryouneed...)
{
    AT91S_USART * my_base = iface->BASE;
    ...
    my_base->US_IER = ...
    ...
}

您已将基本成员定义为u32_t上的指针,因此编译器认为它所指向的是u32_t,而u32_t没有名为US_IER的成员。 当您使用代码的“工作”版本时,会发生什么事,即从uint_32 *到包含所需成员的AT91S_USART *的指针的隐式转换。

BASE是u32_t pointer类型的变量,并尝试访问u32_t pointer实际上不可用的成员US_IER 但是,您可能无法实现将其定义为u32_t pointer而不是structure pointer期望,因为编译器会期望如果通过struct指针访问该成员,则应该已经定义了一个成员。

但是对于您的情况(即具有128种不同的接口类型),请定义具有这3个必需成员(在所有128个接口中通用)的结构类型US_IER, US_IAM, US_IDM ,并在该结构内定义具有必需可能成员的联合,然后尝试访问这些成员带开关盒或其他物品的物品。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM