Здравствуйте, Hard_Club, Вы писали:
H_C>Есть код:
H_C> return prvWrlCpssStatusToLuaPush(status, L, error_message) +
H_C> pvrCpssBooleanToLuaPush(status, L, chekingResult) +
H_C> pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk) +
H_C> pvrCpssStringToLuaPush(status, L, conditionWarningString);
H_C>Под Windows и Linux работает правильно, но под vxWorks "pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk)" вызывается перед "pvrCpssBooleanToLuaPush(status, L, chekingResult)".
Порядок вычисления операндов сложения не определён. Под Windows и Linux это тоже работает только чудом и может сломаться, стоит лишь поменять настройки оптимизации.
H_C>Решается проблема:
H_C> return prvWrlCpssStatusToLuaPush(status, L, error_message) +
H_C> pvrCpssBooleanToLuaPush(status, L, chekingResult) +
H_C>#ifdef VXWORKS
H_C> prvWrlCpssNothingToLuaPush() +
H_C>#endif
H_C> pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk) +
H_C> pvrCpssStringToLuaPush(status, L, conditionWarningString);
H_C>prvWrlCpssNothingToLuaPush — пустая функция, возвращает 0.
Это такое же решение, как битие в бубен для вызова дождя.
Перепишите код с внесением точек следования между вызовами. Например:
rc = prvWrlCpssStatusToLuaPush(status, L, error_message);
rc += pvrCpssBooleanToLuaPush(status, L, chekingResult);
rc += pvrCpssBooleanToLuaPush(status, L, isPortAlreadyInTrunk);
rc += pvrCpssStringToLuaPush(status, L, conditionWarningString);
return rc;