这是我放在微控制器上的 C 问题。
我有一个结构体,其中包含我的硬件实例“节点”的值,每个值都与一个“寄存器”相关。
“寄存器”是一个包含读/写权限详细信息的结构。状态标志...等以及指向 Node 结构中相关值的指针。
我有一个这些寄存器的数组。请参阅下面的代码:
typedef struct
{
uint8_t Address;
uint32_t *Value;
typebool ReadOnly;
uint8_t Type;
typebool QueryRequest; //Has host queried this register?
typebool UpdateOccured; //has a register been updated?
} typeRegister;
struct typeNode
{
uint32_t FlagSetter;
uint32_t FlagClearer;
uint32_t Flags;
uint32_t Colour;
uint32_t HeldFor;
uint32_t Team;
uint32_t UpdateOccured; //has a register been updated?
} Node;
typeRegister Registers[6] =
{
{0,&Node.FlagSetter,False,type_int32,False,False},
{1,&Node.FlagClearer,False,type_int32,False,False},
{2,&Node.Flags,False,type_int32,False,False},
{3,&Node.Colour,False,type_int32,False,False},
{4,&Node.HeldFor,False,type_int32,False,False},
{5,&Node.Team,False,type_int32,False,False}
};
根据我对指针的理解,这应该允许使用语法
uint32_t Value3 = *Registers[3].Value
或 *Registers[3].Value = 100
访问寄存器值。
但是,当我尝试执行此操作时,值从未被正确分配或读取。
但是,如果我在运行时分配指针(即
Registers[3].Value = &Node.Colour;
),它确实可以工作。
在运行时之外声明结构内的指针是否有限制?
我已经完成了一堆值和指针设置、获取和分配,似乎如果我在运行时分配 Registers[n].Value = &Node.Colour,它就可以工作,但如果在编译时分配它就不行了:
uint32_t Value = 0;
Value = Node.Colour; // Value == 0xAB || &Node.Colour == 0x0047
uint32_t *ValuePtr;
ValuePtr = &Node.Colour; // ValuePtr == 0x0047 | *ValuePtr == 0xAB
uint32_t Value2 = *ValuePtr; // Value2 == 0xAB
uint32_t Value3 = *Registers[3].Value; // Value3 == 0xFE04FE00
uint32_t *ValuePtr2;
ValuePtr2 = Registers[3].Value; // ValuePtr2 == 0x0000 | *ValuePtr2 = 0x00470000 <-- WRONG
Registers[3].Value = &Node.Colour; // Assign pointer at run time
uint32_t *ValuePtr3;
ValuePtr3 = Registers[3].Value; // ValuePtr3 == 0x0047 | *ValuePtr3 == 0xAB <-- RIGHT
为任何帮助干杯。
在 C 中,数组本质上是内存中数据的集合,您赋予该数组的变量名称是指向第一个元素的指针,然后您可以对其进行索引。我相信你已经知道了,我只是想打基础。
当您像这样引用指针时
*Registers[3].Value = 100
,C 按照从左到右的顺序进行。
因为首先您使用
*Registers
引用指向数组的指针,然后使用 [3]
索引取消引用的数组指针,因此您实际上是在索引第一个元素,然后使用 3 索引第一个元素。
如果您只是用一些简单的参数包围它应该可以解决您的问题:
*(Registers[3]).Value = 100