* ИСПРАВЛЕНО * постоянное обновление консоли с использованием cpp (msfs2020 SimConnect)

#c

#c

Вопрос:

пример изображения

Я пытаюсь постоянно обновлять номер консоли, связанный с высотой. На данный момент это статический номер, и он не обновляется, пока самолет набирает или теряет высоту. В нижней части текста есть комментарий, ссылающийся на prinf(), который я использую для отправки его на консоль (не уверен, что все это нужно было увидеть, поэтому я отправил все это).

 #include <iostream>
#include <Windows.h>
#include "SimConnect.h"
#include <string>
#include <sstream>
using namespace std;




HANDLE hSimConnect = NULL;




enum DATA_DEFINE_ID
{
    DEFINITION_ID_AP,
};

enum DATA_REQUEST_ID
{
    REQUEST_AP_SETTINGS,
};

enum EVENT_ID
{
    EVENT_SET_AP_ALTITUDE,
};



struct DataRefs
{
    double altitude;
    double knots;
};



int main() {
    

        HRESULT hr;
        SIMCONNECT_RECV* pData = NULL;
        DWORD cbData = 0;
        bool bRequestProcessed = false;
        int SelectedAltitude = 0;
        SIMCONNECT_RECV_SIMOBJECT_DATA* pObjData = NULL;
        DataRefs* pDataRefs = NULL;


        if (SUCCEEDED(SimConnect_Open(amp;hSimConnect, "Client Event", NULL, NULL, NULL, NULL))) {
            printf("Connected to MSFS2020!n");
        }
        else {



            /* string str = "42";

             int num2 = stoi(str);

             cout << num2;

             */

            printf("Failed to Connect to MSFS2020n");

        }
        //simVars
        hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ID_AP, "PLANE ALTITUDE", "Feet");
        //hr = SimConnect_AddToDataDefinition(hSimConnect, DEFINITION_ID_AP, "AIRSPEED TRUE", "Knots");

        // Check simVars
        hr = SimConnect_RequestDataOnSimObject(hSimConnect, REQUEST_AP_SETTINGS, DEFINITION_ID_AP, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_ONCE);
        if (FAILED(hr))
        {
            printf("RequestDataOnSimObject for AutopilotData structure - errorn");
        }
        bRequestProcessed = false;
        while (!bRequestProcessed)
        {
            hr = SimConnect_GetNextDispatch(hSimConnect, amp;pData, amp;cbData);
            if (SUCCEEDED(hr))
            {

                pObjData = (SIMCONNECT_RECV_SIMOBJECT_DATA*)pData;
                pDataRefs = (DataRefs*)amp;pObjData->dwData;

                /* int altint;



                 altint = stoi (pDataRefs->altitude);



                 string str = "42";

                 int num2 = stoi(str);

                 cout << num2;
                 */


                 /*
                     printf("rCurrent plane altitude: %.f feet", pDataRefs->altitude);
                     fflush(stdout);
                     */
                //This line of code is what im referring to
                printf("rCurrent  altitude: %.f feet", pDataRefs->altitude);

                //printf("rCurrent speed: %.f knots", pDataRefs->knots);
            }
        }

        // Close
        hr = SimConnect_Close(hSimConnect);

    return 0;
}
  

Комментарии:

1. Вы вообще знаете, что sim возвращает несколько значений? Возможно, это не так. Попробуйте заменить r на n и посмотреть, не выводится ли несколько строк. Или используйте другие методы отладки, такие как подключение отладчика и пошаговое выполнение вашей программы. Изучите содержимое памяти и попытайтесь определить, какая фактическая часть вашей программы отвечает. Также стоит отметить, что если тип dwData элемента на самом деле DWORD (как следует из названия), то он может быть преобразован в указатель, только если ваша программа скомпилирована как 32-разрядная.

Ответ №1:

Обнаружена проблема. Если вы нажмете CTRL-F «hr = SimConnect_RequestDataOnSimObject(hSimConnect, REQUEST_AP_SETTINGS, DEFINITION_ID_AP, SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD_ONCE);», вы можете увидеть, что я использую SIMCONNECT_PERIOD_ONCE. изучение документации (https://www.prepar3d.com/SDKv4/sdk/simconnect_api/references/structures_and_enumerations.html ), я заменил SIMCONNECT_PERIOD_ONCE на SIMCONNECT_PERIOD_SECOND, чтобы обновлять его каждую секунду.