Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 18 из 18

Тема: Объединение двух длинных строк

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Ты не забудь, что в конце готовой строки должен быть нулевой символ (два байта с кодом 0x00).
    Возможно, его стоит явно добавлять в конец.
    Вроде, и так работает, без нулей этих... Ну, пусть будет с нулями...

    Код:
    Код:
    PROGRAM qqq3
    VAR
    	aaa1: WSTRING(1000) := "qwerty123";
    	aaa2: WSTRING(1000) := "йцукен456";
    	
    	Temp : BOOL := FALSE;
    END_VAR
    
    IF Temp = TRUE THEN
    	SuperAddWString(ADR(aaa1), ADR(aaa2));
    	Temp := FALSE;
    END_IF
    Функция:
    Код:
    FUNCTION SuperAddWString : BOOL //Добавление второй строки в хвост первой
    VAR_INPUT
    	AddressMain: POINTER TO BYTE; //Главная строка
    	AddressAdd:  POINTER TO BYTE; //Добавочный кусочек
    END_VAR
    
    //Длины строк
    VAR
    	Len1 : DWORD; //Длина главной строки
    	Len2 : DWORD; //Длина добавленного кусочка
    END_VAR
    
    //Массив двух нулевых байтов
    VAR CONSTANT
    	Null : ARRAY[0..1] OF BYTE := [0, 0];
    END_VAR
    
    //Считаем длины строк
    Len1 := TO_DWORD(STU.StrLenW(AddressMain)) * 2;
    Len2 := TO_DWORD(STU.StrLenW(AddressAdd))  * 2;
    
    //Присваиваем
    Memutils.MemCpy(AddressMain + Len1, AddressAdd, Len2);
    
    //Последние два байта запишем как нули
    Memutils.MemCpy(AddressMain + Len1 + Len2, ADR(Null), 2);
    
    //Бесполезный выход функции
    SuperAddWString := FALSE;

  2. #2

    По умолчанию

    Цитата Сообщение от aaaSashaMGGU Посмотреть сообщение
    Вроде, и так работает, без нулей этих... Ну, пусть будет с нулями...
    Блин, сколько тебе лет? Я к тому, что обычно молодняку свойственно засирать темы вида "Ой! Сделал", "А, не, вот так надо", "Ещё вот сдела", "О, ещё доделал".
    Боюсь оказаться старпёром, но ты разрабатываешь херово. С таким-то подходом. Мне хочется наорать и поохаживать тебя плёткой. Сортирую пинки:
    1. ДАВНО уже ВЕЗДЕ есть кеширование записи на диски и флешки. После вызова API записи в файл данные сначала сохраняются в оперативной памяти контроллера диска (а фунция говорит, что всё записала), а потом через некоторое время контроллером диска физически записываются на диск (Flush Buffers).
    И только если специально вызывать через API функцию сброса буферов на диск (Flush) - то запишутся сразу, чего ты и боялся.
    Мог бы сохранять всё в файл кусками по 1-2 кб, например. И не выносить людям мозги.
    2. Ты прям совсем жжошь. Кринжово. В стиле того программиста, которого я ругал на работе за то, что он указатели на NULL не проверял. После этого он уволился и пошёл в школу преподавать детям информатику. Может, ты его ученик? NULL - это НИЧЕГО, а не символ с кодом 0.
    Правильно записать надо было через MemSet (установка значений в области памяти в заданные)!
    (Надо Жене Кислову вообще рассказать этот анекдот про ADR(NULL)... как такое вообще работало?! И как компилятор пропустил зарезервированное ключевое слово?!)
    (Дополню: Ага, я потом увидел что ты, используя зарезервированное ключевое слово, объвяил массив из двух байт. Это ещё кринжовее: всё намешано в хламину, чтобы враг не понял)
    3. Конечно, "всё работало само", раз ты объявил это как WSTRING. Потому что компилятор WSTRING инициализирует нулями. Был бы это какой-то соданный на лету буфер - там валялся бы мусор из байтов, и конец строки не проставился бы автоматически.
    4. (Тут уже приходит Женя Кислов со второй плёткой и распечаткой книги про Отладку проектов на ПЛК) ГДЕ ПРОВЕРКА ГРАНИЦ ДАННЫХ?! Какие данные в памяти ПЛК перезапишет (затрёт) твоя функция, если я подсуну ей в первый параметр WSTRING(10), а во второй WSTRING(12000)? У тебя ж нет проверок, хватит ли длины буфера!
    Не задумывался, почему в функциях работы с памятью надо указывать длину буфера-то? Это не просто так.
    5. А StrLenW проверил? Какой максимальный диапазон длины строки она будет обрабатывать? Хватит её на WSTRING(15000)?

    Всё это мне напоминает моего двоюродного брательника, тоже Сашо. Он сначала делает, потом думает, потом переделывает. Ужас!
    Последний раз редактировалось Cs-Cs; 17.05.2024 в 08:14.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

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

    По умолчанию

    ,,,,,,,,,,,,,,,,,,,,,,,,,
    Последний раз редактировалось Валенок; 13.06.2024 в 19:19.

  4. #4

    По умолчанию

    Всем участникам спасибо, всё работает
    Код скидывать не буду, а то опять скажете, что так не делается и вообще
    Ну и - критиковать код, написанный на коленке в 23.30 дома, на Manjaro, в VirtualBox-е и поверхностно проверенный в эмуляторе (без реального контроллера); сама цель написания которого была в том, чтобы завтра на работе его прям с форума скопировать - и уже допилить до правильного состояния - ну такое себе

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

    По умолчанию

    ,,,,,,,,,,,,,,,,,,,,
    Последний раз редактировалось Валенок; 13.06.2024 в 19:18.

  6. #6
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    13,613

    По умолчанию

    И как компилятор пропустил зарезервированное ключевое слово?!)
    В CODESYS V3.5 оно не является зарезервированным.

    2024-05-17_9-20-17.png

    как такое вообще работало?!
    Применение к константным массивам (а также строкам и структурам) оператора ADR является синтаксически корректным.
    По умолчанию не получится применить его к константам элементарных типов (INT и т. п.), но для обхода этого ограничения есть специальная галочка в настройках компиляции:
    https://content.helpme-codesys.com/e...le_sa0007.html

  7. #7

    По умолчанию

    Евгений Кислов Я сначала увидел ADR(NULL), а потом уже посмотрел, что он массив с таким именем объявил.
    Всё равно правильно наорал: пусть границы данных в памяти проверяет.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  8. #8

    По умолчанию

    Будем справедливы: ты нас не предупредил, что это черновик. Ты сказал "Я сделал, вот код". Поэтому имеем то, что имеем.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

Страница 2 из 2 ПерваяПервая 12

Похожие темы

  1. Объединение файловых архивов
    от dzukp в разделе Master SCADA 3
    Ответов: 3
    Последнее сообщение: 05.12.2018, 11:24
  2. ТРМ500 - 3 шт. Объединение цифровых входов.
    от Рашид в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 13.09.2018, 20:40
  3. Объединение и конфигурирование МХ110 по RS-485
    от DDF в разделе Эксплуатация
    Ответов: 3
    Последнее сообщение: 24.03.2018, 17:01
  4. объединение нескольких контроллеров
    от Дмитрий Ф в разделе Подбор Оборудования
    Ответов: 4
    Последнее сообщение: 19.02.2010, 12:14
  5. УКТ38-Щ4 объединение в сеть
    от Googlegum в разделе Эксплуатация
    Ответов: 4
    Последнее сообщение: 31.07.2009, 10:21

Ваши права

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