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

    По умолчанию

    Да ну, фигня это всё, это можно спокойно сделать с помощью shl, без всякого создания подобных функций, ладно бы ещ байты местами надо было бы менять
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  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
    Адрес
    Воронеж
    Сообщений
    882

    По умолчанию

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

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

    По умолчанию

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

  7. #7

    По умолчанию

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

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

    По умолчанию

    Цитата Сообщение от 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
    от Андрей Плеханов в разделе ПЛК3хх
    Ответов: 23
    Последнее сообщение: 24.07.2014, 21:58
  2. Ответов: 23
    Последнее сообщение: 22.12.2010, 23:36
  3. POINTER TO what?
    от drvlas в разделе ПЛК (среда CoDeSys V2.3)
    Ответов: 34
    Последнее сообщение: 04.12.2010, 23:46

Ваши права

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