Объявление

Свернуть
Пока нет объявлений.

Работа со строками. Удаление повторяющихся пробелов.

Свернуть
X
 
  • Фильтр
  • Время
  • Показать
Очистить всё
новые сообщения

  • Работа со строками. Удаление повторяющихся пробелов.

    Пытаюсь удалить повторяющиеся пробелы. Написал функцию:
    Код:
    FUNCTION DEL_SPACES : STRING
    VAR_INPUT
      inputString : STRING(255);
    END_VAR
    VAR
      outputString : STRING(255);
      i : INT;
      prevChar : STRING(1);
    END_VAR
    
    outputString := '';
    prevChar := '';
    
    FOR i := 1 TO LEN(inputString) DO
      IF inputString[i] <> ' ' THEN
        outputString := CONCAT(outputString, inputString[i]);
        prevChar := inputString[i];
      ELSIF prevChar <> ' ' THEN
        outputString := CONCAT(outputString, ' ');
        prevChar := ' ';
      END_IF
    END_FOR
    
    DEL_SPACES := outputString;
    Выдаёт три ошибки
    Код:
     ------ Компиляция : Приложение: Device.Sim.Device.Application -------
    типизировать код...
    генерировать код...
    [ERROR] test_frame: DEL_SPACES [Device: Plc Logic: Application](Строка 5, Столбец 1 (Реализ.)): C0066: Невозможно сравнить тип 'BYTE' с типом 'STRING(INT#1)'
    [ERROR] test_frame: DEL_SPACES [Device: Plc Logic: Application](Строка 6, Столбец 1 (Реализ.)): C0032: Невозможно конвертировать тип 'BYTE' в тип 'STRING(255)'
    [ERROR] test_frame: DEL_SPACES [Device: Plc Logic: Application](Строка 7, Столбец 1 (Реализ.)): C0032: Невозможно конвертировать тип 'BYTE' в тип 'STRING(1)'
    Компиляция завершена -- 3 ошибок, 2 предупреждений : загрузка невозможна
    Помогите разобраться?

  • #2
    Придумал вот такой костыль с функцией MID:
    Код:
    FUNCTION DEL_SPACES : STRING
    VAR_INPUT
      inputString : STRING(255);
    END_VAR
    VAR
      outputString : STRING(255);
      i : INT;
      prevChar : BYTE; // Храним предыдущий символ как BYTE
      currentChar : BYTE; // Текущий символ как BYTE
      tempString : STRING(1); // Временная строка для хранения символа
    END_VAR
    
    outputString := '';
    prevChar := 0; // Инициализируем нулем (не пробел)
    
    FOR i := 1 TO LEN(inputString) DO
      currentChar := inputString[i]; // Получаем текущий символ как BYTE
      IF currentChar <> 32 THEN // 32 — это ASCII-код пробела
        // Используем MID для извлечения символа из строки
        tempString := MID(STR := inputString, POS := i, LEN := 1);
        outputString := CONCAT(STR1 := outputString, STR2 := tempString); // Добавляем символ в результирующую строку
        prevChar := currentChar;
      ELSIF prevChar <> 32 THEN
        outputString := CONCAT(STR1 := outputString, STR2 := ' ');
        prevChar := 32;
      END_IF
    END_FOR
    
    DEL_SPACES := outputString;
    Ошибок не выдаёт, но MID не видит заглавные буквы и знак %
    Наверняка же должно быть много проще?

    Комментарий


    • #3
      Рабочий вариант. Критика приветствуется.
      Код:
      FUNCTION DEL_SPACES : STRING(255)
      VAR_INPUT
        inputString : STRING(255);
      END_VAR
      VAR
        outputString : STRING(255);
        i : INT;
        prevChar : STRING(1); // Храним предыдущий символ как STRING(1)
        currentChar : STRING(1); // Текущий символ как STRING(1)
      END_VAR
      
      FOR i := 1 TO LEN(inputString) DO
        // Извлекаем текущий символ как строку
        currentChar := MID(STR := inputString, POS := i, LEN := 1);
      
        // Проверяем, является ли текущий символ пробелом
        IF currentChar <> ' ' THEN
          outputString := CONCAT(outputString, currentChar);
          prevChar := currentChar;
        ELSIF prevChar <> ' ' THEN
          outputString := CONCAT(outputString, ' ');
          prevChar := ' ';
        END_IF
      END_FOR
      DEL_SPACES := outputString;

      Комментарий

      Обработка...
      X