PDA

Просмотр полной версии : test.0 := NOT test.1 := TRUE. На ПЛК test равняется 3, под симулятором - 2



Yegor
29.08.2014, 08:34
Следите за руками:
VAR
test: WORD;
END_VAR

test.0 := NOT test.1 := TRUE;На ПЛК110 test = 3, а на симуляторе test = 2. Делаем автоматическое (!) преобразование в IL:
LD TRUE
ST test.1
NOT
ST test.0Запускаем. Теперь на ПЛК test тоже равняется 2.

Чо за хрень?

capzap
29.08.2014, 09:55
Те кто писал компилятор, работают по старинке, одно присвоение после точка с запятой. На подобные комбинации ни кто толком не обращал внимание на тестировании,это не редко случается

Вольд
29.08.2014, 11:15
Следите за руками:
VAR
test: WORD;
END_VAR

test.0 := NOT test.1 := TRUE;На ПЛК110 test = 3, а на симуляторе test = 2. Делаем автоматическое (!) преобразование в IL:
LD TRUE
ST test.1
NOT
ST test.0Запускаем. Теперь на ПЛК test тоже равняется 2.

Чо за хрень?
Не надо заумных конструкций (test.0 := NOT test.1 := TRUE), и все нормально будет.

Валенок
29.08.2014, 12:08
Имхо, ошибка компилятора не в обработке, а в том что вообще не посчитал ошибочным весьма не очевидное выражение "test.0 := NOT test.1 := TRUE"
Присвоение справа налево в кучу переменных - это нормально и удобно, но в переменные, а не в операцию. "NOT test.1" явно операция.
Наверное было бы более очевидным test.0 := NOT (test.1 := TRUE), в чего и превращается iL и, кажется, есть в КДС3

capzap
29.08.2014, 12:11
К слову семен такую конструкцию непропускает даже со скобками и оговорился не компилятор, а интерпретатор

Yegor
29.08.2014, 15:49
Третий кодесис тоже не пропускает. Дело не в этом. Интересно то, что с одним компилятором получаются два разных результата. Понятно, что кодогенераторы разные, но у них на входе уже разобранные предложения обычно.

Валенок
29.08.2014, 16:02
Тогда внесём это в копилку где уже есть sizeof и будем продолжать следить за Вашими руками ))

PS
...
...
...
"Ж-ж-ж-ж-ж кр4?(jkvo4#%*C*()!" - сказала японская бензопила.
"А-а-а-а, б..я!" - сказали рабочие