Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 18

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

  1. #1

    По умолчанию Объединение двух длинных строк

    Добрый день!
    Хочу объединить две строки
    Первая Str1: WSTRING(32000), вторая Str2: WSTRING(32000)
    Обычный WCONCAT нельзя, т.к., там ограничение в 255

    STU.StrConcatW(ADR(Str1), ADR(Str2), SIZEOF(Str2)) тоже нельзя, т.к., значение буфера SIZEOF не должно превышать тип INT 16384

    Натыкался на идеи через указатели, но, может, есть у кого готовая проверенная временем функция?
    Спасибо!

    Отвечу заранее на вопрос "Зачем так много?": это нужно для формирования текстового файла-отчёта будущей длиной ~17кб

  2. #2

  3. #3

    По умолчанию

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

  4. #4

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Добрый день.
    Если хочется "простых" решений - то в MemoryUtils есть функция MemCpy.
    https://content.helpme-codesys.com/e...ns/MemCpy.html
    Спасибо, будем смотреть

  5. #5

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    А по строкам или по частям нельзя в файл писать?
    Или вместо строк вообще использовать буфер из массива байт?
    Так уж работает моя (пока ещё ненаписанная) программа. Сначала формируем длинную строку с текстом будущего письма, затем отправляем её в блок отправки Email-письма для дальнейшей обработки и отправки
    Уже на этапе формирования в основном коде там будет ~17000 символов. Без наличия нормальной функции объединения уже и в основном коде никак
    А там, где отправка письма - там да, там файл можно писать по строкам, конечно. Но и в этом случае, думаю, это не очень хорошо - дёргать жёсткий диск на запись десяти символов по сто раз. Уж про скорость всего этого отдельный вопрос

  6. #6

    По умолчанию

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

  7. #7

    По умолчанию

    На коленке получилось вот так:

    Код:
    FUNCTION SuperWConcat : BOOL //Объединение двух мега-строк в одну
    VAR_INPUT
    
    Address1: POINTER TO BYTE; Address2: POINTER TO BYTE; Address3: POINTER TO BYTE; Len1: DWORD; Len2: DWORD;
    END_VAR //Присваиваем Memutils.MemCpy(Address3, Address1, Len1 * 2); Memutils.MemCpy(Address3 + Len1 * 2, Address2, Len2 * 2); //Бесполезный выход функции SuperWConcat := FALSE;
    Основной код для вызова:
    Код:
    PROGRAM qqq2
    VAR
    
    aaa1: WSTRING(64000) := "qwerty123"; aaa2: WSTRING(64000) := "йцукен456"; aaa3: WSTRING(64000) := ""; Temp : BOOL := FALSE;
    END_VAR Temp := SuperWConcat(ADR(aaa1), ADR(aaa2), ADR(aaa3), STU.StrLenW(ADR(aaa1)), STU.StrLenW(ADR(aaa2)));
    В бою ещё не проверял, будем тестить
    Всем спасибо

  8. #8

    По умолчанию

    Хотя, чего-то я сделал не то
    В моём случае мне надо не объединять две строки в третью. А надо приписывать вторую в хвост к первой. Тогда всё работает вообще в одну строку даже без новой функции

    Код:
    PROGRAM qqq3
    VAR
    
    aaa1: WSTRING(64000) := "qwerty123"; aaa2: WSTRING(64000) := "йцукен456"; Temp : BOOL := FALSE;
    END_VAR IF Temp = TRUE THEN
    Memutils.MemCpy(ADR(aaa1) + TO_DWORD(STU.StrLenW(ADR(aaa1))) * 2, ADR(aaa2), STU.StrLenW(ADR(aaa2)) * 2); Temp := FALSE;
    END_IF
    Последний раз редактировалось aaaSashaMGGU; 16.05.2024 в 21:39.

  9. #9

    По умолчанию

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

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

    По умолчанию

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

Страница 1 из 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

Ваши права

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