指向结构内部的元素的指针(C)

时间:2020-10-20 07:04:45

标签: c arduino embedded atmega

对于arduino平台,我想接收16个字节并将其值填充到结构中。目前,我已经有此代码

if( Serial.available() >= sizeof( newSection ) ) { // if atleast one full struct is received

    Sections newSection ;                   // declare a local Sections object and fill it
    
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ; // the other variables don't exist yet
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    newSection.leftSensor = Serial.read() ;
    
    storeLayout( &newSection ) ;
}

结构'Sections'还不存在,但是它将包含16个uint8_t类型的变量。尽管可以正常工作,但我更喜欢使用for循环。

if( Serial.available() >= sizeof( newSection ) ) { // if atleast one full struct is received

    Sections newSection ;                   // declare a local sectuin variable and fill it
    
    uint8_t *ptr ;
    ptr = &newSection.leftSensor ;          // let pointer point to the first variable of local struct object < -???
    
    for( byte i = 0 ; i < sizeof( newSection ) ; i ++ ) {
        *ptr = Serial.read() ;
        ptr ++ ;
    }
    
    storeLayout( &newSection ) ;
}

我对指针不是陌生的,但是我还没有使用这个特定的示例,并且比后悔更安全。

我的疑问:在此示例中,我是否正确使用了指针? 如果没有,它应该是什么样子?

只有“是”的遮篷就足够了。 预先感谢。

编辑: 我知道存储中的结构填充,该结构将恰好包含16个uint8_t变量。但是,编译器可能会以随机顺序重新排列结构变量的存储,这可能是一个问题。

也许我应该提到的还有重要的事情。它不在示例中。但是该函数storeLayout(&newSection)会将此局部结构的内容复制到作为数组一部分的结构对象。

因此,这些结构将有64个数组(每个结构包含16个uint8_t变量)

是否可以使用此示例的for循环,而不必在数组中转换其变量? (处理变量存储的随机编译器行为)

1 个答案:

答案 0 :(得分:1)

我认为您的路径正确无误,没关系

您可以看到this发送和接收数据包的答案

和下面的示例显示如何指向struct

typedef struct {
    uint16_t X;
    uint8_t  Y;
    uint8_t  Z;
} Packet;

Packet mPacket;

uint8_t* pY = &mPacket.Y;
uint16_t* pX = &mPacket.X;

// point to whole struct and cast it to byte array 
uint8_t* pPacketBytes = (uint8_t*) &mPacket;

如果要忽略结构中的填充,请添加以下代码

#pragma pack(push, 1)

// define your structs
typedef struct {
    uint16_t X;
    uint8_t  Y;
    uint8_t  Z;
} PacketNoPadding;

#pragma pack(pop)

您可以看到打印尺寸为(包)的结果

  • 请记住,在诸如Arduino UNO或AVR之类的8位系统中没有填充,但是存在ARM MCU中的填充