Алгоритм который должен менять местами старшее и младшее слово счётчика из базы счётчиков и умножая
полученный результат на коэффициент записывать его в базу аналогов, работает правильно на 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:
;
--------------------------------------------------------------------------------------------------------------
Указатели в разработчике в С блоке
-
- Администратор
- Сообщения: 118
- Зарегистрирован: 29 май 2009, 13:45
- Откуда: Компания ДЭП
- Контактная информация:
Проблема с трюками С - зависимость от реализации компилятора и платформы. В данном случае - выравнивание в структуре по 2 байтам, а int - по 4.
Исправляется использованием переменной v
Исправляется использованием переменной v
Код: Выделить всё
CG(15,a1)
....
float v = a1.value;
float* pf=&v; int* pi=(int*)&v;
....
a1.value = v;
AW(15,a1)
Спасибо, правильно заработало в 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:
;
______________________________________________________________________
#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:
;