#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, чтобы обновлять его каждую секунду.