padarom
padarom

Reputation: 3648

Copy structure without pointers

I'm trying to create an interface between physical components (Arduinos) and flight simulator in order to control and display simulator events from self-built parts. I have started learning C++ in school, but have never been quite keen on it.
Yet the library I use to communicate with my flight simulator is written in C++ (it's called SimConnect) and so is the SDK of my payware airplane. Therefore I figured it's probably easier to get back into it than creating wrappers or such for another programming language.

Every time I receive new data from the simulator, I pass it into the function 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;
}

In other programming languages, this would probably work fine, hence I tried to implement it like this. However, C++ pointers are a slight bit more complicated to me.

The condition data->LTS_TaxiSw != previousData->LTS_TaxiSw never evaluates to true. From my understanding, that is because both data and previousData are pointers to exactly the same structure and thus can never be different.

With my little knowledge and not much understanding of those pointers, how would I do this? Is there a way to copy the structure, so they can differ?

Thanks in advance.

Upvotes: 2

Views: 97

Answers (2)

Zilicon
Zilicon

Reputation: 3860

If PMDG_NGX_Data is not too big to copy every ProcessNGXData you can try this:

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;
}

If it is too big, you can create a struct that will hold only the fields you need to compare and will be initialized by PMDG_NGX_Data and initialize that struct every ProcessNGXData.

Upvotes: 1

pharring
pharring

Reputation: 2046

Declare previousData like this:

PMDG_NGX_Data previousData;

(without the asterisk). Now, when you want to 'save' the structure, do this:

previousData = *data;

(right hand side has an asterisk). Note that this assumes that PMDG_NGX_Data is copy-able and a fixed size. If it's an interface or an abstract class, then this won't be possible. Perhaps the API gives you a "Clone" or "Copy" method you can call.

Upvotes: 2

Related Questions