Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: Помогите с синтаксисом ST!

  1. #1

    По умолчанию Помогите с синтаксисом ST!

    есть 5 входных переменных типа BOOL и массив

    можно ли каким либо образом обращаться к входным переменным в теле цикла как например к массиву

    VAR
    arr: ARRAY [1..5] OF BYTE; (*êîä îøèáêè*)
    x: INT;
    END_VAR
    VAR_INPUT
    in1: BOOL;
    in2: BOOL;
    in3: BOOL;
    in4: BOOL;
    in5: BOOL;
    END_VAR


    FOR x:=1 TO 5 DO
    IF in(x)=TRUE THEN ?????????
    arr[x]:=3; END_IF
    END_FOR
    Помогите кто знает! очень нужно!

  2. #2
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Код:
    VAR
    	in1, in2, in3, in4, in5: BOOL;
    	inp: POINTER TO BOOL;
    	x: INT;
    END_VAR
    
    FOR x := 0 TO 4 DO
    	inp := ADR(in1) + x;
    	IF inp^ THEN
    		(* Whatever *)
    	END_IF
    END_FOR
    Только надо убедиться, что все переменные друг за другом в памяти идут и не попадают под выравнивание.

    Вообще программисту, который пишет «IF что-то = TRUE THEN» вместо «IF что-то THEN», я настоятельно рекомендую не баловаться указателями и делать подобные вещи через промежуточный массив.

  3. #3
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Код:
    VAR
    	in1, in2, in3, in4, in5: BOOL;
    	inp: POINTER TO BOOL;
    	x: INT;
    END_VAR
    
    FOR x := 0 TO 4 DO
    	inp := ADR(in1) + x;
    	IF inp^ THEN
    		(* Whatever *)
    	END_IF
    END_FOR
    Только надо убедиться, что все переменные друг за другом в памяти идут и не попадают под выравнивание.

    Вообще программисту, который пишет «IF что-то = TRUE THEN» вместо «IF что-то THEN», я настоятельно рекомендую не баловаться указателями и делать подобные вещи через промежуточный массив.
    A что, компилятор пропустил указатель на буль?

  4. #4
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Почему он не должен был его пропустить?

  5. #5
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    должен был ругаться что с такими переменными работает инструкция BITADR, но это по памяти, может уже что поменялось

  6. #6
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,137

    По умолчанию

    Указатель работает только с WORD и DWORD(справка КДС)
    А компилиться с бит то же будет

  7. #7

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Код:
    VAR
    	in1, in2, in3, in4, in5: BOOL;
    	inp: POINTER TO BOOL;
    	x: INT;
    END_VAR
    
    FOR x := 0 TO 4 DO
    	inp := ADR(in1) + x;
    	IF inp^ THEN
    		(* Whatever *)
    	END_IF
    END_FOR
    Только надо убедиться, что все переменные друг за другом в памяти идут и не попадают под выравнивание.

    Вообще программисту, который пишет «IF что-то = TRUE THEN» вместо «IF что-то THEN», я настоятельно рекомендую не баловаться указателями и делать подобные вещи через промежуточный массив.
    спасибо, Yegor
    насчет промежуточного массива не совсем понятно
    ведь каждому члену массива нужно присвоить какой то вход( а если их 100) для каждого писать?
    но ведь мне и надо автоматизировать этот процесс!

  8. #8
    Banned
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,664

    По умолчанию

    присвоив указателю этот же указатель плюс один получим второй байт переменной, так что нижняя точка это все же байт. И у меня КДС ругается, может дело в настройках среды или в версии
    Последний раз редактировалось capzap; 26.09.2012 в 08:44.

  9. #9

    По умолчанию

    хулиганством занимаетесь ))
    вспомните, что битовые переменные простенько так объединяются в BYTE или WORD....
    считайте их одним байтом, а в цикле пробегите по нему битововй маской с AND для проверки установки отдельных битов, а еще выстрее сделайте CASE на интересующие комбинации битов

  10. #10
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    должен был ругаться что с такими переменными работает инструкция BITADR
    Не будет она с такими переменными работать. Даже не скомпилируется.
    Указатель работает только с WORD и DWORD(справка КДС)
    Цитата Сообщение от справка КДС
    A pointer can point to any data type or function block even to user-defined types.
    насчет промежуточного массива не совсем понятно
    ведь каждому члену массива нужно присвоить какой то вход( а если их 100) для каждого писать?
    но ведь мне и надо автоматизировать этот процесс!
    Как я вам показал — через указатели — сотню переменных автоматизировать тоже не получится. Там выравнивание всё поломает.
    вспомните, что битовые переменные простенько так объединяются в BYTE или WORD....
    считайте их одним байтом
    В данном случае эти переменные даны неупакованными. И упаковывать их это та же головная боль, что и с занесением в промежуточный массив.

    В кодесисе есть функции с переменным числом параметров, но пользователю почему-то не дают возможности их создавать.
    Последний раз редактировалось Yegor; 26.09.2012 в 11:46.

Страница 1 из 2 12 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •