Сообщение от
Anton441
Так как применить библиотеку stsndart? ..
Код:
VAR CONSTANT
(*"делите и побеждайте.." (С) melky*)
DELIM : STRING := '<0x0D><0x0A>'; (*в натуре видимо нужно '$R$N', оно же '$0D$0A'*)
END_VAR
VAR
L_DELIM : DWORD;
longstr : STRING(1000) := (*1000: любое тупо большее макс ожидаемого (580?) + sizeof(тип под pstr), ниже*)
//из примера выше - как есть
'026099 1217 164<0x0D><0x0A>....<0x0D><0x0A>026106 853 1095';
cnt : INT; (*сколько строк после парсинга*)
result : ARRAY[1..40] OF STRING; (*40: любое >= чем макс кол-во "тегов", string(x) - X заведомо вмещающее "тег"*)
(*в результ класть DELIM не вижу смысла*)
i : DWORD;
pstr : POINTER TO STRING; (*string(x) - X заведомо вмещающее "тег" + DELIM*)
pz : POINTER TO BYTE;
z : BYTE;
END_VAR
-------------------------------------------------
L_DELIM := LEN(DELIM);
cnt := 0;
pstr := ADR(longstr);
REPEAT
cnt := cnt + 1;
i := FIND(pstr^, DELIM (*заместо DELIM достаточно 1-ый символ DELIM'а*));
(*//тупо быстрее MID'а*)
IF i > 0 THEN (*ненужно здесь SEL вставлять, т.к. каждый цикл LEN выполнять незачем*)
pz := pstr + i - 1;
ELSE
pz := pstr + INT_TO_DWORD(LEN(pstr^));
END_IF
z := pz^; (*либо 1-й символ DELIM'а либо #0*)
pz^ := 0;
result[cnt] := pstr^;
pz^ := z;
(*//*)
pstr := pz + L_DELIM;
UNTIL i = 0 //проверять cnt на превышение макс кол-ва строк - сами
END_REPEAT
ps
вообще задача непонятна - как можно длину длиной строки просрать если она не возникает в ПЛК из ниоткуда