微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指针在引用后给出异常值

如何解决指针在引用后给出异常值

我正在尝试复制一个大型C ++库。它具有以下代码结构

RobotRunner.h

class RobotRunner
{
public:
    VectorNavData* vectorNavData;
};

RobotRunner.cpp

void RobotRunner::run()
{
printf("Quaternion[0]: %f \n",vectorNavData->quat[0]); //Output: 243235653487854 - Abnormal values
}

SimulationBridge.h

class SimulationBridge
{
private:
    VectorNavData _vectorNavData; // Actual value of vectornavdata from the robot is stored here
    
    RobotRunner* _robotRunner = nullptr; //Pointer to the RobotRunner Object
}

SimulationBridge.cpp

void SimulationBridge::init()
{
_robotRunner = new RobotRunner();

printf("Quaternion[0]: %f \n",_vectorNavData.quat[0]); // Output: 0.43 - normal and expected
_robotRunner->vectorNavData = &_vectorNavData;
}

void SimulationBridge::run()
{
_robotRunner->run();
}

//This function runs continuously and updates the _vectorNavData in a separate thread
void SimulationBridge::readIMU()
{
    while(true)
    { 
        //_lowState stores the values of different robot parameters at a given time

        _vectorNavData.accelerometer[0] = _lowState.imu.accelerometer[0];
        _vectorNavData.accelerometer[1] = _lowState.imu.accelerometer[1];
        _vectorNavData.accelerometer[2] = _lowState.imu.accelerometer[2];

        _vectorNavData.quat[0] = _lowState.imu.quaternion[1];
        _vectorNavData.quat[1] = _lowState.imu.quaternion[2];
        _vectorNavData.quat[2] = _lowState.imu.quaternion[3];
        _vectorNavData.quat[3] = _lowState.imu.quaternion[0];

        _vectorNavData.gyro[0] = _lowState.imu.gyroscope[0];
        _vectorNavData.gyro[1] = _lowState.imu.gyroscope[1];
        _vectorNavData.gyro[2] = _lowState.imu.gyroscope[2];
    }
}

VectorNavData是一个结构,用于存储有关机器人方向的详细信息。它具有以下定义

struct VectorNavData {
  Vec3<float> accelerometer;
  Vec3<float> gyro;
  Quat<float> quat;
};

为了简洁起见,我仅在此处包括代码的必要部分。

代码说明:

SimulationBridge类在模拟中与机器人通信。它接受vectorNavData并将其存储在成员变量_vectorNavData中。 SimulationBridge还包含指向RobotRunner类的指针作为其成员之一。我正在将_vectorNavData对象的地址分配给指针_robotRunner-> vectorNavData(检查SimulationBridge.cpp)。在RobotRunner类中,我引用了此指针,并在代码的其他部分中使用了值。

问题:

如果我在SimulationBridge.cpp中打印vectorNavData,则值似乎是正常的。但是在将同一对象的指针分配给机械手之后,如果我打印这些值,那么这些值似乎异常高。我的问题是,是否建议使用这种将指针用于动态分配的方式?如果不是,我可以使用的最佳替代方法是什么?

要注意的另一个重要点是,我正在使用CMake编译代码,并且将“ -O3”优化标志设置为CMAKE_CXX_FLAGS。如果删除此标志,则代码sorta可以很好地用于上述对象指针,但是对于代码另一部分中的另一个对象指针,我仍然会遇到类似的错误。我之所以没有在此加入,是因为描述代码结构非常复杂,而且问题本质上是相同的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。