Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 21 по 30 из 35

Тема: POINTER TO what?

  1. #21
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,318

    По умолчанию

    Цитата Сообщение от drvlas Посмотреть сообщение
    Код:
    GetPar( by1:=5, X => dw);
    ничего не работало. Т.е. конструкции вида
    Код:
    dw := GetPar( by1:=5).X;
    ну не выполняются и все тут! Вижу нулевое значение вместо Х... Что за Х...
    К сожалению проза жизни. Программа не может быть операндом. А фб - это все-таки программа, хоть и с неявной передачей указателя на текущую структуру. Лобби от функций проплатили этот запрет.
    Иначе кому они нужны были б.

  2. #22
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию а зачет???

    Во всяком случае, по GetPar Михалыч не дал по шее.

    Видать, для зачета нужно еще и SetPar показать...

    Я как понимаю на сегодняшний день. Указатели сами по себе есть 32-битные переменные (ну, для ПЛК100 так, во всяком случае). В зависимости от объявления указателя, контроллер вытаскивает данные строго указанной длины -
    Код:
    1 бит для BOOL
    1 байт для BYTE, SINT, USINT
    1 слово для WORD, INT, UINT
    2 слова для DWORD, DINT, DUINT
    строка для STRING (окончание по нулю?)
    иное, если пользовательский тип данных
    При этом способ размещения данных в получаемом значении как-то зафиксирован: по указанном уадресу - младший байт, а затем по возрастающей.
    Аналогично следует размещать данные при записи. Потанцевав, ясен перец, с неразрушением данных в чужих полях (ибо наш универсальный пойнтер указывает на 4-байтный простор, который нужно засеять).

    Хочу еще попробовать просто присваивать пойнтеры разных типов. Если получится, то танцев будет меньше.

    З.Ы. Удивлен экспериментом с битовой переменной. Если пойнтер направить на некое битовое поле, в котором записать "1" не в младший разряд, то по GetPar выдернется, естественно, целый байт. А вот явное преобразование DWORD_TO_BOOL отсекает безжалостно все, кроме младшего бита
    Я-то думал, всякое ненулевое значение целого байта по указанному адресу считается TRUE. А вот нет... Берем на заметку.

  3. #23
    Пользователь Аватар для rovki
    Регистрация
    03.01.2010
    Адрес
    Чехов
    Сообщений
    12,115

    По умолчанию

    почти не чего не понял,но как приятно послушать -это как хорошая песня на иностранном языке

  4. #24
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Каюсь, многословен... Тут ведь идет мучительный процесс научения меня, сухой остаток стараюсь выкладывать время от времени, но он все равно получается мокрый. Ну, думаю, что пример (скоро уже с SetPar) покажет все понятое.

  5. #25
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,318

    По умолчанию

    1 бит для BOOL..
    Байт

    Если пойнтер направить на некое битовое поле, в котором записать "1" не в младший разряд, то по GetPar выдернется, естественно, целый байт.
    Может где и есть железки адресующие непосредственно бит, но я не слыхал.

    А вот явное преобразование DWORD_TO_BOOL отсекает безжалостно все, кроме младшего бита
    Не отсекает, а сравнивает с нулем весь DWORD. Улавливаете ?
    Последний раз редактировалось Валенок; 04.12.2010 в 12:09.

  6. #26

    По умолчанию

    Цитата Сообщение от drvlas Посмотреть сообщение
    Т.е. конструкции вида
    Код:
    dw := GetPar( by1:=5).X;
    ну не выполняются и все тут!
    Не путайте прынципиально разные штуки 1 и2:

    1. Вызов экземпляра с одновременным присваиванием данных:

    Код:
    GetPar(by1:=5);
    или просто вызов (со старыми данными)

    Код:
    GetPar();
    2. Чтение/запись переменных экземпляра,
    без вызова его кода:

    Код:
    dw := GetPar.X;
    Это при вызове функции нужно дать все, а ФБ что надо, выборочно. Поэтому приходится писать имена переменных, чтобы компилятор понял чего ему дают.

  7. #27
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,318

    По умолчанию

    Drvlas наверное имел ввиду что на нижнем уровне что ф.б., что прог,что функ. :

    ..
    CALL ...
    ...

    И что для ф.б. не сделали из

    X := FB(A := ?).X

    релиз типа :


    ..
    mov FB.A, ? ______________________;A := ?

    push @FB _______________________;FB()
    call привязаная_к_FB_прога

    mov X, FB.X ______________________;X := FB.Х


    А было б неплохо, а ?



    PS
    Замучил этот автосборщик пробелов
    Последний раз редактировалось Валенок; 04.12.2010 в 12:54.

  8. #28
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от валенок Посмотреть сообщение
    не отсекает, а сравнивает с нулем весь Dword. улавливаете ?
    проверил в отдельном примере. да, весь бай (все слово). где-то раньше я напутал... ну, так и должно быть! почему я и удивился. спасибо!

  9. #29
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию

    Цитата Сообщение от игорь петров Посмотреть сообщение
    не путайте прынципиально разные штуки 1 и2:
    ага! теперь ясно. что ж, логика фб вообще как-то до меня сложно доходит.

    перечел ваш классический труд, п.п. 5.3.2 и 5.3.3. то, что я понял сейчас, никак не противоречит изложенному там, конечно. но там неочевидна разница - обратиться к переменным экземпляра до вызова или после вызова.
    спасибо!

  10. #30
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    700

    По умолчанию о времени

    Готовлю я себе примерчик, отрабатываю даже то, что сейчас не нужно... И наткнулся на такую ругню компилятора:

    Код:
    	toda:		TOD;
    	dat:		DATE;
    ...
    toda := toda + TOD#00:01;
    dat := dat + DATE#0000-00-01;
    На первое присвоение пишет:
    Код:
    Несоответствие операнда 2 в "+": невозможно преодразовать TOD в TOD
    А на второе:
    Код:
    Неверный формат даты
    Несоответствие операнда 2 в "+": невозможно преодразовать DATE в DATE
    Вопрос: как прибавить к дате 1 день? Ко времени суток 1 минуту?
    ИСПРАВЛЕНО: Ко времени дня добавить можно

    Код:
    toda := toda + T#1m;
    А вот к дате... Даже 24 часа не помогают - дает из 2010-12-03 2013-08-29...

    Определил, что

    Код:
    dat := TIME_TO_DATE(T#1d);
    Компилируется нормально и дает 2 января 1970 года. А вот прибавить так 1 день НИЗЗЯ:

    Код:
    dat := dat  + TIME_TO_DATE(T#1d);
    Так что вопрос открытый
    Последний раз редактировалось drvlas; 04.12.2010 в 14:33.

Страница 3 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Ваши права

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