Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 11 по 20 из 35

Тема: POINTER TO what?

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

    По умолчанию

    Понесу свой крест.

    Не-а, милок. Как проктолог проктологу :

    pDWdest^ := ( pDWdest^ and 16#FFFF_0000 ) or ( ( pDWsour^ + 1 ) and 16#0000_FFFF );

    Именно pDWdest.

    Прежде чем что-то влить по адресу pDWdest^, а там ведь своё - только первое слово, ведь :

    pDWdest := ADR(W4)) ,

    а вливаться по pDWdest^ := будет дабл-слово,

    И чтоб не запороть там чужие данные ( (pDWdest+2)^ ), надоть оттуды их выковырнуть (старшее слово) :

    ( pDWdest^ and 16#FFFF_0000 )....

    А опосля, впихнуть его без изменений во вновь образуемое дабл-слово, похерив возможное переполнение первого слова в :

    pDWsour^ + 1

    т.е. :

    .... or ( ( pDWsour^ + 1 ) and 16#0000_FFFF );

    (Ессно, or можно поменять на +, характер образуемых здесь битовых полей никогда не приведет к переполнению)

    PS
    Пока незачот.

    Остальное посмотрю попозже. Щас спешу.
    Последний раз редактировалось Валенок; 02.12.2010 в 11:55.

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

    По умолчанию

    Цитата Сообщение от валенок Посмотреть сообщение
    пока незачот.
    котельне 3.14-здец... ждем михалыча

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

    По умолчанию

    Шнурую ботинки ...


    Как доступаться к параметрам, имея на руках только указатель, если параметры разные по типам?

    -Петька, прибор !!
    -100 !!
    -Чё 100 ?
    -А чё прибор.


    Сообщите про тип, например :


    struct tType
    ( tReal, t.... );


    function ...
    var_input
    typ : tType;
    ...


    А как вы думаете работает, например бейсик там, или лисп.

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

    По умолчанию

    to drvlas

    По поводу Вашей задумки.
    Идите дальше. На кой Вам массив ? Сделайте односвязный список. Данные будут реально лежать не линейно в одном месте, а там, где кому надо, и сами нижние владельцы данных не будут знать от том что их данные на учете, а верхний смотрящий будет с ними лехко и непринужденно работать хоть с данными, хоть с владельцами.
    И тут реально удобней будет сделать не структуру, а ф.б.

    И чисто совет.
    Используйте перечисления. Чем меньше чисел, тем меньше ошибок.
    Зачем вам :

    .......Point:BYTE; (* Формат вывода: 0, 1, 2, 3 знака справа от точки *)

    Пишите, например :


    ......OutFormat : ( Format0, Format1, Format2......);

    Во-первых меньше дурацких комментариев (не при объявлении, а далее по коду), без потери наглядности.
    Во-вторых, присвоение
    OutFormat := Format2 - более осмысленно, чем Point := 2; (хотя - дело вкуса)

    В третьих, код легче модифицировать
    Последний раз редактировалось Валенок; 02.12.2010 в 23:02.

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

    По умолчанию

    советы по поводу перечислений - понятно. иногда делаю, иногда нет. но согласен со всеми аргументами.

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

    в этом своем подходе я запнулся на том, что пойнтеры на разные по типам данные будут брать-записывать параметры неправильно. так как я не понял и совет "сообщать про тип", то пока на этом затыке и сижу.

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

  6. #16

    По умолчанию

    По определению в стандарте МЭК WORD – это битовая строка из 16 элементов, которые можно адресовать раздельно. UINT – это целое без знака. По стандарту их нельзя смешивать, но CoDeSys допускает такую вольность.

    Указатели в CoDeSys изначально понадобились для сериализации, при написании протоколов связи. Указатель тут понимается как физический адрес в памяти. Получил указатель на что угодно и погнал побайтно в com порт. Бывает в текстовую строчку надо залезть как в массив или сложный тип разобрать. Предполагается, что указатель использует человек разумный и сам знает чего он там адресует. Для его удобства контроль вырублен.

    Если подпрограмма получает указатель и не знает что это, то сообщить ей тип логично. Она может по CASE для возможных типов взять переменную правильно, если ей это надо.

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

    По умолчанию

    Цитата Сообщение от Игорь Петров Посмотреть сообщение
    Если подпрограмма получает указатель и не знает что это, то сообщить ей тип логично. Она может по CASE для возможных типов взять переменную правильно, если ей это надо.
    Да, я именно так и понял то, что советовал уважаемый Валенок. В функциях чтения и записи значения параметра (там, где доступ к нему идет по индексу) будет CASE на варианты
    Код:
    BYTE
    WORD
    DWORD
    STRING
    TIME
    DATE
    При этом в структуре PARSCRIPT, описывающей интимности каждого параметра, добавляется элемент

    Код:
    Typ: PARTYPE;
    В нем и будет указываться тип переменной для данного параметра. И достаточно функции доступа указать индекс параметра, чтобы она извлекла из глобального массива структур ту, что описывает наш параметр и по элементу .Type сориентироваться, как доступаться к параметру.

    Я вот думаю: если пойнтер указывает, сколько извлекать байт (и сколько записывать), то не будет ли достаточно иметь разные указатели только на те типы данных, которые различаются количеством байт?
    Тогда у нас будет:
    Код:
    BYTE
    WORD
    DWORD
    STRING
    - и все. А всякие там INT, UINT, DINT, TIME, DATE - отдыхают. И обращение к переменной типа TIME будут происходить так же, как к переменной DWORD. Выдернутся 4 байта, а потом программа сделает с ними чего надо - и они обратно запихнутся так же. Даже порядок сохранения байтов не имеет значения, ИМХО.
    Можно так?

    Спасибо за подсказки! Постараюсь это проверить и сообщить результат.
    Последний раз редактировалось drvlas; 03.12.2010 в 20:00.

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

    По умолчанию

    Последняя идея имхо не лучшая.
    Тип - это тип.

    i : int := -15000;
    w : word := 50000;

    if ( i or w ) < 0 then ?

    Лично я нехочу заморачиваться , как конкретно данный язык будет расширять данные, до longinta все расширит или i пихнет в word или w в int


    К тому же типы - это не только стандартные.

    Например TTemperatura.
    Свойства :
    1.вывод на экран : с одним знаком после запятой, с суффиксом '*С' или текстовое сообщение 'Обрыв датчика' .......
    2.время от последнего опроса.
    ....

    Если тип - ф.блок, обрабатывающий температуру и с кучей своих данных ( таймеров и др.. ) ?



    У вас жестко определенная структура PARSCRIPT
    А зачем жестко ? Кому-то нужен min-max, а кому-то нет….
    Ведь кол-во свойств и их самоё определяет сам тип.
    Да и данные у Вас хранятся отдельно от своих свойств.
    А вдруг владельцы данных захотят поменять некоторые свойства ?
    Со списком это было бы проще (имхо)

    И жаль, конечно, что в кдс-2 нет хотя бы типа-функции.

    PS
    А вдруг тип : pointer to pointer to ......
    Последний раз редактировалось Валенок; 03.12.2010 в 20:53.

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

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    К тому же типы - это не только стандартные.

    Например TTemperatura.
    ...
    Со списком это было бы проще (имхо)
    Вот он, профессорский подход! Но я сейчас так мелко плаваю, что не готов решать задачу в таком общем виде. И список меня пугает.

    А решая все же только свою задачу, я говорю: да,
    Цитата Сообщение от Валенок Посмотреть сообщение
    У вас жестко определенная структура PARSCRIPT
    жесткая. В нее входит то, что мне в этом проекте нужно. Что, кстати, не мешает в другом проекте внести иную (тоже жесткую) структуру.

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

    Более того, порядок размещения описателей данных в массиве структур apsPar[]вообще не имеет значения, ибо я собираюсь доступаться к элементам массива поиском номера параметра - перебирая индекс, просматривать массив apsPar[] до совпадения с номером параметра в apsPar[i].Numb
    То есть я в любой фазе разработки могу выбросить пару строк или добавить, переставить строки как угодно - и проект не поломается. Я имею в виду строки
    Код:
    set(...);
    set(...);
    Сейчас играюсь с примером доступа по описанным принципам - уже мажется Чуть позже предоставлю пример на строгий суд Учителей. Зачет-то нужен

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

    По умолчанию

    Цитата Сообщение от drvlas Посмотреть сообщение
    Сейчас играюсь с примером доступа по описанным принципам
    Вот и работающий пример. Параметры - очень разные. от логических до даты. Указывая на все параметры пойнтером

    Код:
    POINTER TO DWORD
    я часто вытаскиваю кучу всякого мусора, но подчищаю его, как показал Учитель. В результате, если пройти всю программу, мы увидим, что все вспомогательные переменные получили правильные значения.

    Да, для записи без повреждения котельни нужно еще поработать. Там действительно придется полагаться на то, что самый младший байт лежит по адресу переменной, а остальные - по возрастающим адресам. Это не кашерно, но иного пути не вижу. Так что SetPar ждет своего часа...

    З.Ы. И как-то странно у меня складывается с ФБ. Пока не стал записывать
    Код:
    GetPar( by1:=5, X => dw);
    ничего не работало. Т.е. конструкции вида
    Код:
    dw := GetPar( by1:=5).X;
    ну не выполняются и все тут! Вижу нулевое значение вместо Х... Что за Х...
    Вложения Вложения

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

Ваши права

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