Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 23

Тема: Указатели (POINTER)

  1. #1

    По умолчанию Указатели (POINTER)

    Взял из примеров весьма нужную функцию - two_word_to_real
    Великолепно работает, но сам код не понял. Если можно поподробней разъясните пожалуйста.

    FUNCTION two_word_to_real : REAL
    VAR_INPUT
    IN_Data: POINTER TO ARRAY[0..1] OF WORD; (*Указатель на массив регистров для Float*)
    END_VAR
    VAR
    p1: POINTER TO BYTE;
    p2: POINTER TO BYTE;
    END_VAR

    p1:=ADR(two_word_to_real);
    p2:=ADR(IN_Data^[1]);
    p1^:=p2^;
    p1:=p1+1;
    p2:=p2+1;
    p1^:=p2^;
    p1:=p1+1;
    p2:=ADR(IN_Data^[0]);
    p1^:=p2^;
    p1:=p1+1;
    p2:=p2+1;
    p1^:=p2^;

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

    По умолчанию

    Да ну, фигня это всё, это можно спокойно сделать с помощью shl, без всякого создания подобных функций, ладно бы ещ байты местами надо было бы менять

  3. #3
    Пользователь
    Регистрация
    19.11.2011
    Адрес
    г. Белгород
    Сообщений
    357

    По умолчанию

    Цитата Сообщение от ibx Посмотреть сообщение
    Взял из примеров весьма нужную функцию - two_word_to_real
    Великолепно работает, но сам код не понял. Если можно поподробней разъясните пожалуйста.

    FUNCTION two_word_to_real : REAL
    VAR_INPUT
    IN_Data: POINTER TO ARRAY[0..1] OF WORD; (*Указатель на массив регистров для Float*)
    END_VAR
    VAR
    p1: POINTER TO BYTE;
    p2: POINTER TO BYTE;
    END_VAR

    p1:=ADR(two_word_to_real);
    p2:=ADR(IN_Data^[1]);
    p1^:=p2^;
    p1:=p1+1;
    p2:=p2+1;
    p1^:=p2^;
    p1:=p1+1;
    p2:=ADR(IN_Data^[0]);
    p1^:=p2^;
    p1:=p1+1;
    p2:=p2+1;
    p1^:=p2^;
    Если коротко, то массив из двух регистров имеет 4 байта в следующей последовательности
    1-й байт, 2-й байт, 3-й байт, 4-й байт

    После выполнения функции последовательность будет такая
    3-й байт, 4-й байт, 1-й байт, 2-й байт

    Код:
    FUNCTION two_word_to_real : REAL
    VAR_INPUT
    IN_Data: POINTER TO ARRAY[0..1] OF WORD; (*Указатель на массив регистров для Float (всего 4 байта)*)
    END_VAR
    VAR
    p1: POINTER TO BYTE;	(указатель на результат функции)
    p2: POINTER TO BYTE;	(*указатель на массив регистров*)
    END_VAR
    
    p1:=ADR(two_word_to_real);		(*указатель на начало результата функции (1-й байт)*)
    p2:=ADR(IN_Data^[1]);			(*указатель на второй элемент массива (3-й байт) *)
    p1^:=p2^;			(*копируем содержимое по адресу второго указателя в адрес первого указателя *)
    p1:=p1+1;			(*смещаем адрес на 1 байт, теперь он указывает на 2-й байт результата*)
    p2:=p2+1;			(*смещаем адрес на 1 байт, теперь он указывает на 4-й байт массива*)
    p1^:=p2^;			(*копируем содержимое по адресу второго указателя в адрес первого указателя *)
    p1:=p1+1;			(*смещаем адрес на 1 байт, теперь он указывает на 3-й байт результата*)
    p2:=ADR(IN_Data^[0]);			(*указатель на первый элемент массива (1-й байт) *)
    p1^:=p2^;			(*копируем содержимое по адресу второго указателя в адрес первого указателя *)
    p1:=p1+1;			(*смещаем адрес на 1 байт, теперь он указывает на 4-й байт результата*)
    p2:=p2+1;			(*смещаем адрес на 1 байт, теперь он указывает на 2-й байт массива*)
    p1^:=p2^;			(*копируем содержимое по адресу второго указателя в адрес первого указателя *)

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

    По умолчанию

    Адресная регистрация придумана давным давно.
    А еще есть символьная.
    В Вашем случае указатели вообще не уместны.
    все давно пользуются вторым вариантом(символьная.)

  5. #5
    Пользователь
    Регистрация
    12.07.2007
    Адрес
    Воронеж
    Сообщений
    884

    По умолчанию

    Цитата Сообщение от lara197a Посмотреть сообщение
    Адресная регистрация придумана давным давно.
    А еще есть символьная.
    В Вашем случае указатели вообще не уместны.
    все давно пользуются вторым вариантом(символьная.)
    А символьная это как?
    Все пытаюсь осознать указатели, а тут еще и символьная существует

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

    По умолчанию

    при создании переменной обзавите ее как нравится.
    и используйте это слово по всей программе, где имеете данную переменную.
    см. справку..

  7. #7

    По умолчанию

    Можно поподробней - заинтриговали, но попытки изобразить нечто подобное с использованием справки ни к чему не привели.

  8. #8
    Пользователь
    Регистрация
    12.07.2007
    Адрес
    Воронеж
    Сообщений
    884

    По умолчанию

    Цитата Сообщение от lara197a Посмотреть сообщение
    при создании переменной обзавите ее как нравится.
    и используйте это слово по всей программе, где имеете данную переменную.
    см. справку..
    Ааа.. Ну так всегда делал и делаю

  9. #9
    Пользователь
    Регистрация
    20.07.2011
    Адрес
    Новосибирск
    Сообщений
    38

    По умолчанию

    В CoDeSys 3 есть Union, кто писал на С наверное предпочтёт через него сделать )

    TYPE uRealBytes :
    UNION
    rValue : REAL; // Needs 4 Bytes in memory
    abValue: ARRAY [0..3] OF BYTE;
    END_UNION
    END_TYPE

    В CoDeSys 2.3 мне надо было REAL разбить на массив байт, чтобы их передать. Сделал это следующим образом:

    P1: POINTER TO ARRAY [0..3] OF BYTE;
    TempMassiv: ARRAY[0..3] OF BYTE;
    P1 := ADR(Pressure);
    TempMassiv := P1^;
    И из TempMassiv теперь можно байты забирать куда нужно.
    Автоматизирую, как завещал нам Генри Форд

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

    По умолчанию

    кто писал на С
    Кто писал на C, тот в цирке не смеётся того ломает прежде всего от невозможности разыменовать возврат ADR. То есть нельзя сделать a := ADR(a)^ как это допускается в Си (a = *&a), потому что ADR возвращает DWORD, а не POINTER. Будь иначе, можно было бы обойтись без объявления лишних переменных и типов.

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

Похожие темы

  1. Использование указателей Pointer
    от Андрей Плеханов в разделе ПЛК3xx (архив)
    Ответов: 23
    Последнее сообщение: 24.07.2014, 20:58
  2. Ответов: 23
    Последнее сообщение: 22.12.2010, 23:36
  3. POINTER TO what?
    от drvlas в разделе ПЛК (среда CoDeSys V2.3)
    Ответов: 34
    Последнее сообщение: 04.12.2010, 23:46

Ваши права

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