C++ дорога к файлу — Программирование

Ребят пробую первые шаги в С++

не разберусь с дирктори.

От чего в плагине надо исходить если хочешь отрыть файл, от win.xpl или от X-Plane.exe?

Запускаю файл:

PlaySoundA(«D:\X-Plane 11\Resources\plugins\test\64\sound\test.wav», NULL, SND_ASYNC);

всё работает.

Если:

PlaySound(«sound\test.wav», NULL, SND_ASYNC);

не работает.

PlaySound(«.\sound\test.wav», NULL, SND_ASYNC); 

не работает.

PlaySound(«..sound\test.wav», NULL, SND_ASYNC); 

не работает.

 

Папка «sound» находиться там же где win.xpl.

 

Как правильно сделать.

Ответов: 21

по-моему, исходить надо от пути файла процесса, в котором крутится dll (в данном случае от D:X-Plane 11)

upd. если что, «..» — это подняться на уровень выше.

1 минуту назад, aiRoNe пишет:

по-моему, исходить надо от пути файла процесса, в котором крутится dll (в данном случае от D:X-Plane 11)

вся проблема в том, что не хотел использовать привязку к диску, то есть D:\ или C:\ 
а так:
PlaySoundA(«X-Plane 11\Resources\plugins\test\64\sound\test.wav», NULL, SND_ASYNC);
не работает.

вся проблем в том, что вы пишете PlaySoundA(«X-Plane 11\Resources\plugins\test\64\sound\test.wav», NULL, SND_ASYNC), а надо PlaySoundA(«Resources\plugins\test\64\sound\test.wav», NULL, SND_ASYNC);

 

4 минуты назад, aiRoNe пишет:

вся проблем в том, что вы пишете PlaySoundA(«X-Plane 11\Resources\plugins\test\64\sound\test.wav», NULL, SND_ASYNC), а надо PlaySoundA(«Resources\plugins\test\64\sound\test.wav», NULL, SND_ASYNC);

 

точно, спасибо большое!!!

а можно в сам проект вшить как то этот звуковой файл, что бы отдельно с папки не грузить?

не разберусь с работой по datarefs,

команды проходят:
XPLMCommandOnce(XPLMFindCommand(«sim/electrical/battery_1_on»));

а если хочу изменить параметер датарефа например с 0 на 1

XPLMSetDataf(XPLMFindDataRef(«sim/cockpit/electrical/battery_on»), 1);

не работает.

Может есть у кого примеры по командам XPLM

sim/cockpit/electrical/battery_on это массив интов (именно массив!), следовательно надо использовать http://www.xsquawkbox.net/xpsdk/mediawiki/XPLMSetDatavi

XPLMSetDatavi(                     XPLMDataRef          inDataRef,    
                                   int *                inValues,    
                                   int                  inoffset,    
                                   int                  inCount); 

подразумевается, что вы передаете указатель на массив значений (inValues), смещение (inoffset) и inCount (число замещаемых ячеек в датарефе), т.е. если вы хотите присвоить sim/cockpit/electrical/battery_on[0] = 1 и sim/cockpit/electrical/battery_on[1] = 1, то inValues это new int[2], inValues[0] = 1, inValues[1] = 1, inoffset = 0 и inCount = 2;

upd. я исправил 1 на 2

Можете на конкретном примери показать, до конца не пойму с масивом.
Например есть датареф, [1], float 1 надо передать

Gesendet von iPad mit Tapatalk

Для начала перепишите код так, чтобы эта единица, которую хотите записать в датареф, была записана как int, а не float

Если можете, вообще не используйте флоат в этом куске кода или сделайте округление вашего флоата с единицей до ближайшего целого и запишите в переменную инт

Буду пробовать, как лучше сделать пока не знаю.
В С++ это первая проба, до иногда в С# писал.
Лучше наверное масивом, но как его правильно составить надо поискать информацию.

XPLMSetDataf(XPLMFindDataRef(«sim/cockpit2/engine/actuators/mixture_ratio[1]»), 1);
Вот эту [1] надо в int передать наверное.
И использовать XPLMSetDatavi

Gesendet von iPhone mit Tapatalk

вы не держите в голове типы датарефов, с которыми вы работаете. с разными типами работают по разному. с датарефами-массивами работают нет так, как вы написали. механизм записи в датарефы-массивы я описал выше (через указатель на массив значений). sim/cockpit2/engine/actuators/mixture_ratio это массив флоатов, и записывать в него нужно массив флоатов соответственно

float* a = new float[1];
a[0] = 0.5;
XPLMSetDatavf(XPLMFindDataRef("sim/cockpit2/engine/actuators/mixture_ratio"), a, 0, 1);
delete[] a;

не через квадратные скобки, как вы написали, а только так, передавая указатель на массив. и не XPLMSetDatavi, а XPLMSetDatavf (v — это vector, f — это float). если бы датареф был не массив, а переменная float, то было бы XPLMSetDataf (потому что это уже не вектор). и если бы датареф был массив интов, только тогда было бы XPLMSetDatavi.

 типы датарефов я беру отсюда http://www.xsquawkbox.net/xpsdk/docs/DataRefs.html

Да, массив имеет 8 флотов.
Попробую таким методом, спасибо.

Через массив всё проходит на ура,

спасибо за наводку!

Gesendet von iPhone mit Tapatalk

отлично

5 часов назад, aiRoNe пишет:

не через квадратные скобки, как вы написали, а только так, передавая указатель на массив.

Но для получения указателя совершенно не обязательно создавать динамическую переменную (выделять память под переменную в куче). А потом удивляемся, что «Hello, world!» занимает гигабайт, симулятор тормозит и ему  16 гигов оперативки не хватает.

float a = 0.5;
XPLMSetDatavf(XPLMFindDataRef("sim/cockpit2/engine/actuators/mixture_ratio"), &a, 0, 1);

 

20 часов назад, aiRoNe пишет:

смещение (inoffset)

Здесь более правильно будет перевести как «индекс первого элемента».

круто, спасибо

Ещё один вопрос к знатокам:

Пытаюсь сделать согласование давления на всех приборах через ВБЭ-2А КВС,

методом считывания давления на ВБЭ-2А КВС и передачей дальше.

        int d = XPLMGetDataf(XPLMFindDataRef(«sim/custom/gauges/alt/vbe_press_left»));
        XPLMSetDatai(XPLMFindDataRef(«sim/custom/gauges/alt/vbe_press_right»), d);

передаёт не те значения, то есть синхронизация не правильная,

пробовал: XPLMSetDatai(XPLMFindDataRef(«sim/custom/gauges/alt/vbe_press_right»), XPLMGetDataf(XPLMFindDataRef(«sim/custom/gauges/alt/vbe_press_left»)));

тоже не то значение.
       int d = 1030;
        XPLMSetDatai(XPLMFindDataRef(«sim/custom/gauges/alt/vbe_press_right»), d);

так всё нормально передаётся.

В чём может быть проблема?

4 часа назад, mers пишет:

В чём может быть проблема?

Может быть в том, что вы пытаетесь считать float(XPLMGetDataf), а писать int (XPLMSetDatai) и наоборот. 

4 часа назад, mers пишет:

XPLMSetDatai(XPLMFindDataRef(«sim/custom/gauges/alt/vbe_press_right»), d);

так всё нормально передаётся.

Значит, запись int работает как и ожидается, следовательно, этот dataref содержит целое число. Значит, и работать с ним надо как с целым числом:

int d = XPLMGetDatai(XPLMFindDataRef(«sim/custom/gauges/alt/vbe_press_left»));
        XPLMSetDatai(XPLMFindDataRef(«sim/custom/gauges/alt/vbe_press_right»), d);

Точно, не заметил,  спасибо