-
Уничтожение переменной
Здравствуйте!
Не сумел найти ответ в поиске, поэтому пришлось создавать отдельную тему.
Ситуация, в общем-то, стандартная: чтение параметров из файла. Сделал так: читаю файл построчно, очищая от пустых строк, комментариев и прочего, и на выходе получаю массив строк. С ним уже работаю дальше. Но поскольку параметров неизвестное количество (но немало, несколько сотен), а динамически изменять размер массива нельзя (или я не знаю как), то приходится делать ARRAY [1..999] OF STRING. После чтения файла и присвоения значений всем параметрам в программе этот массив уже не нужен, только память зря занимает. Как его правильно уничтожить?
Или, может, я не с того конца подошёл, и массив тут вообще ни к чему? Или пусть висит, ничего страшного?
-
1. Пусть висит, есть не просит.
2. Почему нельзя считать 1 строку, разобрать, переложить считанные параметры в нужные места, считать в эту же строковую переменную и др. ? Без массива строк.
-
Пусть висит так пусть висит, спасибо)
Можно конечно и сразу разбирать. Но хотел сделать «красиво»: один блок читает файл, другой разбирает, что получилось. Потому как файлов конфигурации будет как минимум два с разными форматами, да и форматы эти пока нетвёрдо определёны.
-
- Велосипед: SysLibMem — динамическое выделение памяти.
- Не велосипед: реализация списков в библиотеке OSCAT.
А почему формат текстовый? Может, лучше перед заливкой в ПЛК переводить в бинарный? Я вот в своём проекте вообще сделал без всякого разбора чтение напрямую из файла:
Код:
TYPE CONFIG : (* Формат файла соответствует формату этой структуры *)
STRUCT
header: DWORD;
(* тут поля структуры *)
checksum: DWORD;
END_STRUCT
END_TYPE
FUNCTION ReadConfig : CONFIG
VAR_INPUT
filename: STRING;
END_VAR
VAR
handle: DWORD;
cfg: CONFIG;
END_VAR
(* Читаем весь файл в структуру за раз *)
SysMemSet(ADR(cfg), 0, SIZEOF(cfg));
handle := SysFileOpen(filename, 'r');
IF handle > 0 THEN
SysFileRead(handle, ADR(cfg), MIN(SysFileGetSize(filename), SIZEOF(cfg)));
SysFileClose(handle);
END_IF
(* Ну а дальше проверка на целостность по контрольной сумме с загрузкой
настроек по умолчанию при несоответствии и прочие предосторожности *)
-
Текстовый формат потому, что файлы конфигурации формируются сторонними программами, которые, скорее всего, будет писать кто-то совсем другой=) А договориться о текстовом формате и отследить в нём ошибки гораздо проще, чем в бинарном. Да и мне, прямо скажем, чем нагляднее — тем лучше. Квалификация пока низковата)
SysLibMem посмотрю, и в Oscat пороюсь, спасибо. Или, может, сразу дадите наводку, что именно в Oscat искать?
-
В библиотеке OSCAT и искать-то особо нечего. Там сразу на виду семейство функций для работы со списками. Категория так и называется — List processing. Привёл бы примеры использования, но работать со списками в кодесисе не доводилось. Не разберётесь — обращайтесь, подумаем вместе.
На мой взгляд, текст это слишком податливый интерфейс для ответственных систем. Визуально отловить ошибку, конечно, проще, но и ассортимент ошибок куда шире, нежели в бинарниках.
-
Нашёл, увидел, спасибо. Буду пробовать.