【问题标题】:Copy structure without pointers没有指针的复制结构
【发布时间】:2015-04-01 22:18:26
【问题描述】:

我正在尝试在物理组件 (Arduino) 和飞行模拟器之间创建一个接口,以便控制和显示来自自建部件的模拟器事件。我在学校就开始学习 C++,但从来没有那么热衷于它。
然而,我用来与飞行模拟器通信的库是用 C++ 编写的(称为SimConnect),我的付费软件飞机的 SDK 也是如此。因此,我认为重新使用它可能比为另一种编程语言创建包装器等更容易。

每次从模拟器收到新数据时,我都会将其传递给函数ProcessNGXData

PMDG_NGX_Data* previousData;
bool alreadyProcessed = false;

void ProcessNGXData(PMDG_NGX_Data *data)
{
    if (!alreadyProcessed || data->LTS_TaxiSw != previousData->LTS_TaxiSw) {
        if (data->LTS_TaxiSw)
            printf("Taxi Lights: [ON]\n");
        else
            printf("Taxi Lights: [OFF]\n");
    }

    if (!alreadyProcessed) {
        alreadyProcessed = true;
    }
    previousData = data;
}

在其他编程语言中,这可能会很好,因此我尝试这样实现它。但是,C++ 指针对我来说稍微复杂一些。

条件data->LTS_TaxiSw != previousData->LTS_TaxiSw 永远不会计算为true。据我了解,这是因为datapreviousData 都是指向完全相同结构的指针,因此永远不会不同。

以我的知识和对这些指针的了解不多,我该怎么做?有没有办法复制结构,所以它们可以不同?

提前致谢。

【问题讨论】:

  • 保存之前的boolLTS_TaxiSw怎么样?
  • 这也是他们在 SDK 示例中所做的(他们只跟踪了两个值)。但是,稍后这将跟踪数十个结构值,我宁愿不为每个值创建另一个变量。
  • 我很困惑,所以你传入ProcessNGXData的数据也是previousData
  • 您可以将PMDG_NGX_Data* previousData; 更改为不是指针。然后previousData = *data;会复制内容。
  • 使用点运算符data.field访问结构体

标签: c++ pointers structure


【解决方案1】:

像这样声明previousData:

PMDG_NGX_Data previousData;

(不带星号)。现在,当您想“保存”结构时,请执行以下操作:

previousData = *data;

(右侧有一个星号)。请注意,这假定 PMDG_NGX_Data 是可复制的且大小固定。如果它是一个接口或一个抽象类,那么这是不可能的。也许 API 为您提供了一个可以调用的“克隆”或“复制”方法。

【讨论】:

  • 哦,而不是“previousData->LTS_TaxiSw”,您需要执行“previousData.LTS_TaxiSw”
【解决方案2】:

如果PMDG_NGX_Data 不是太大而无法复制每个ProcessNGXData,你可以试试这个:

PMDG_NGX_Data previousData;
bool alreadyProcessed = false;

void ProcessNGXData(PMDG_NGX_Data *data)
{
    if (!alreadyProcessed || data->LTS_TaxiSw != previousData.LTS_TaxiSw) {
        if (data->LTS_TaxiSw)
            printf("Taxi Lights: [ON]\n");
        else
            printf("Taxi Lights: [OFF]\n");
    }

    if (!alreadyProcessed) {
        alreadyProcessed = true;
    }
    previousData = *data;
}

如果它太大,您可以创建一个结构,它只包含您需要比较的字段,并由PMDG_NGX_Data 初始化,并在每个ProcessNGXData 初始化该结构。

【讨论】:

  • 就是这样!我没有意识到我必须将-> 更改为.,所以我只是对Error: expression must have a pointer type 感到困惑。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多