Указатели в разработчике в С блоке

Общие вопросы по оборудованию и программному обеспечению Компании ДЭП
IljaEl
Сообщения: 36
Зарегистрирован: 12 янв 2016, 14:40
Откуда: mupptpgh

Сообщение IljaEl » 08 апр 2019, 11:16

Алгоритм который должен менять местами старшее и младшее слово счётчика из базы счётчиков и умножая
полученный результат на коэффициент записывать его в базу аналогов, работает правильно на WinDecont и
зависает на A9. Что не так если можно объясните ! И как правильно это cделать чтобы работало на A9.
-------------------------------------------------------------------------------------------------------------
#define CG(x,y) CounterGet(x,(COUNTER*)&y)
#define AW(x,y) AnalogWrite(x,(ANALOG*)&y)
ANALOG a1; float* pf=&a1.value; int* pi=(int*)&a1.value; BYTE* pb=(BYTE*)&a1.value;
CG(15,a1); if(a1.state>0x7fff){a1.state=0; a1.value=0; CG(1,a1); goto mend;};
pb[0]=pb[3]; pb[1]=pb[2]; pb[3]=pb[2]=0;
*pf=(*pi)*5; AW(15,a1);
mend:
;
--------------------------------------------------------------------------------------------------------------

dws
Администратор
Сообщения: 118
Зарегистрирован: 29 май 2009, 13:45
Откуда: Компания ДЭП
Контактная информация:

Сообщение dws » 09 апр 2019, 16:40

Проблема с трюками С - зависимость от реализации компилятора и платформы. В данном случае - выравнивание в структуре по 2 байтам, а int - по 4.
Исправляется использованием переменной v

Код: Выделить всё

CG(15,a1)
....
float v = a1.value;
float* pf=&v; int* pi=(int*)&v;
....
a1.value = v;
AW(15,a1)

IljaEl
Сообщения: 36
Зарегистрирован: 12 янв 2016, 14:40
Откуда: mupptpgh

Сообщение IljaEl » 10 апр 2019, 15:01

Спасибо, правильно заработало в WinDec и на А9 в таком варианте
______________________________________________________________________
#define CG(x,y) CounterGet(x,(COUNTER*)&y)
#define AW(x,y) AnalogWrite(x,(ANALOG*)&y)
ANALOG a1; BYTE* pb=(BYTE*)&a1.value;
float f; int* pi=(int*)&f;
CG(15,a1); if(a1.state>0x7fff){a1.state=0; a1.value=0; CG(1,a1); goto mend;};
pb[0]=pb[3]; pb[1]=pb[2]; pb[3]=pb[2]=0;
f=a1.value; a1.value=(*pi)*5; AW(15,a1);
mend:
;