Страница 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
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

    Цитата Сообщение от 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
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

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

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

    По умолчанию

    Указатель работает только с 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
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

    присвоив указателю этот же указатель плюс один получим второй байт переменной, так что нижняя точка это все же байт. И у меня КДС ругается, может дело в настройках среды или в версии
    Последний раз редактировалось capzap; 26.09.2012 в 09: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 в 12:46.

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

Ваши права

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