【问题标题】:Change structure contents by pointer通过指针改变结构内容
【发布时间】:2015-10-03 18:38:47
【问题描述】:

我的结构如下

typedef struct runData{
   byte                 curentCycle = 0;
   sensorData           sensor[8];
}

其中sensorData为如下结构

    typedef struct sensorData{
    float currentValue=NULL;
    float lastValue;
    float maxValue[2] = {-50 ,-50};
    float minValue [2]= {1001,1001};
    byte trend=0;               
    byte mode = 1;              
    sensorSetPoints setPoints[2];   
};

sensorSetPoints 是

typedef struct sensorSetPoints{
  float setPoint;                   
  float rise;                       
  float drop;
};

我通过

创建和添加数据
runData     *thisRun;
thisRun->sensor[0].setPoints[0].setPoint = 26.77;

现在我想得到这个值,不是使用结构而是通过偏移指针。我得到了 thisRun 的地址并向它添加了一个偏移量,这个偏移量来自我创建的一个数组,其原则是这是结构中的第 11 项,它之前的 10 项(6 个浮点数和 4 个字节)给出了偏移量28. 当我将此添加到 thisRun 的地址时,我认为我应该有一个指向 thisRun->sensor[0].setPoints[0].setPoint

的指针

所以如果你到目前为止同意我的观点,为什么以下内容不起作用

uint16_t *baseAddress = (uint16_t *)thisRun;
uint16_t offset = readOffset(10);//returns offset
baseAddress += offset;
float *f;
memcpy(f,baseAddress,4);

当我打印 f 时,它是 0.00 我错过了什么?

【问题讨论】:

  • 你的代码编译了吗?您如何在其定义中初始化结构成员?这是 c++ 吗?
  • 你为什么在你所有的structs 上使用typedef?您从未指定新的类型名称。

标签: c pointers data-structures offset


【解决方案1】:

在您发布的代码中的许多问题中,这是最严重的一个

float *f;
memcpy(f, baseAddress, 4);

您正在尝试写入未分配的指针。

你甚至没有初始化f,这取决于你想要它可能是什么

float *f;
f = malloc(sizeof(*f));
if (f != NULL)
    memcpy(f, baseAddress, sizeof(*f));

或者可能是

float f;
memcpy(&f, baseAddress, sizeof(*f));

【讨论】:

  • thisRun 有同样的问题。
  • @JoachimPileborg 对,我没看到那个。
  • thisRun 是一个 214 项结构,在其他地方初始化并作为指针传递给此类
  • 不涉及类。显然你是一个 java 程序员,除非你真的不需要从 java 切换到 c 或 c++。
  • 当然一个未分配的指针 f 认为这是问题但是 f 仍然包含 0.00 并且 thisRun->sensor[0].setPoints[0].setPoint 包含 26.77
【解决方案2】:

好吧,如果它可以帮助别人,这是我想做的,它工作的关键是使用 reinterpret_cast

intptr_t p =(intptr_t)&thisRun;  //Integer type capable of holding object pointer
p += readOffset(10);  //function which determines the offset of, in this case the 10th item
float fval = *reinterpret_cast<float *>(p);//Cast the int back to a pointer

【讨论】:

  • 你为什么在 C 语言中使用reinterpret_cast?或者您是否错误地标记了您的问题? C 不是 C++。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多