То ли я где-то вирей набрался, то ли совсем крыша едет, но у меня компиллер вылетает на этом простейшем примере с грозным предупреждением о неизвестной фатальной ошибке.
Причем на низких уровнях оптимизации все ОК. Также перестает вылетать, если раскомментарить закоментаренный код.
Что это может быть: баг компилятора, погрызенный вирем комп, глюки лицензионного менеджера? Проверьте у кого 5.11 и подскажите, что делать. Глючит аналогично на двух компах. Но поиск вирей пока ничего не дал.
Пардон, с файлом что-то не получилось. Код вот:
Код
typedef unsigned short WORD;
typedef struct
{
float fKp;
float fKi;
float fKd;
float fLastProcessValue;
float fLastIterm;
float fSumError;
float fMaxPID;
float fMinPID;
} PID_DATA;
WORD ControllPID(float fSetPoint, float fProcessValue, PID_DATA *pid)
{
static float fmProcessValue[16], fmError[16], fmPterm[16], fmDterm[16], fmIterm[16], fmRet[16];
static int index=0;
float fError, fPterm, fDterm, fIterm, fRetPD, fRet;
fError = fSetPoint - fProcessValue;
fmProcessValue[index] = fProcessValue;
fmError[index] = fError;
fPterm = pid->fKp * fError;
fmPterm[index] = fPterm;
fDterm = pid->fKd * (fProcessValue - pid->fLastProcessValue);
fmDterm[index] = fDterm;
pid->fLastProcessValue = fProcessValue;
fIterm = pid->fKi * (pid->fSumError + fError);
fmIterm[index] = fIterm;
fRetPD = fPterm + fDterm + pid->fMinPID;
fRet = fRetPD + fIterm;
fmRet[index] = fRet;
/*
if (++index == 16)
return (WORD)pid->fMinPID;
*/
if (fRet > pid->fMaxPID)
return (WORD)pid->fMaxPID;
else if (fRet < pid->fMinPID)
return (WORD)pid->fMinPID;
pid->fLastIterm = fIterm;
pid->fSumError += fError;
return (WORD)fRet;
}