PDA

Просмотр полной версии : инициализация массива структур



drvlas
27.11.2010, 14:01
Здравствуйте!

Пытаюсь найти красивое решение для сабжа.
Определяю тип данных:


TYPE PARSCRIPT :
STRUCT
Nu: INT;
Po: INT;
Md: INT;
No: INT;
Mi: DINT;
Ma: DINT;
Na: STRING(10);
END_STRUCT
END_TYPE


В области переменных пробую создать экземпляр и инициализировать его:


VAR_GLOBAL CONSTANT
a_psPar: ARRAY [0..1] OF PARSCRIPT :=
(Nu:=101, Po:=2, Md:=0, No:=0, Mi:=0, Ma:=9999, Na:='Text1'),
(102, 2, 0, 0, 0, 9999,'Text2');
END_VAR

Первая строка инициализации массива компилируется нормально. Но у меня в массиве будет до сотни таких структур! Ручки облом натруживать многочисленными Nu:= и так далее.
Пробую выбросить присвоения и перечислить начальные значения просто в том порядке, что в объявлении (строка 2) - не компилирует. РУГАИЦЦА!

Вот и 2 вопроса:
Главный:
1) Можно ли все же инициализировать без явных присвоения (по типу второй строчки)

2) В случает невозможности - запасной вариант. Придется использовать корявые отдельные массивы. Что-то вроде такого:


VAR_GLOBAL CONSTANT
aiPar: ARRAY [0..3, 0..1] OF INT :=
101, 0, 0, 0,
102, 0, 0, 0;
adiPar: ARRAY [0..1, 0..1] OF DINT :=
0, 99999,
0, 99999;
astPar: ARRAY [0..1] OF STRING(10) :=
'Text1',
'Text2';
NU: INT := 0;
PO: INT := 1;
MD: INT := 2;
NO: INT := 3;
MI: INT := 0;
MA: INT := 1;
END_VAR

И потом при вызове использовать обращения к разным массивам:


PROGRAM PLC_PRG
VAR
i: INT;
di: DINT;
st1: STRING(10);
END_VAR

i := aiPar[ NU, 0];
di := adiPar[ MI, 1];
st1 := astPar[ 0];


Такой подход мне не нравится еще и потому, что при большом реальном массиве трудно будет без ошибок менять число параметров (размер массива), отслеживать изменения в их начальных значениях и прочее и прочее... Хотелось бы все же иметь дело с массивом структур.

Подскажите, плз, как же изящно инициализировать?
Спасибо!

drvlas
28.11.2010, 11:34
Спасибо за быстрый ответ!

Не очень понял про идеологию...
Но обратимся к примеру.

Если я правильно понял, саму структуру ты создаешь аналогично. Но не инициализируешь ее при объявлении.


var_global retain
data : array[0..max_index] of mystruct;
count : word := 0;
end_var

А потом создаешь функцию для инициализации одного элемента массива структур и при первом запуске программы вызываешь ее 100 раз, задавая в аргументах те константы, которые я вношу в текст инициализации.
Так?



(* A B ..... *)
set( a0, b0, …….. );
set( a1, b1, …….. );


То есть визуально выглядит практически так же, как я и хотел: огромный блок текста, в котором с минимальными "накладными" затратами (слово set и 2 скобки) стройными столбцами описаны начальные значения.

Мне кажется, что это замечательное решение! Во всяком случае, значительно красивее, чем записывать
a:=a0, b:=b0...

Тем более, что на самом деле имена элементов структуры у меня не такие короткие, как в примере, а осмысленные (типа Point, Node и тому подобное) - их повторять 100 раз точно обломно.

Большое спасибо!

BETEP
16.12.2010, 18:23
Но у меня в массиве будет до сотни таких структур! Ручки облом натруживать многочисленными Nu:= и так далее.

А зачем ручки натруживать, есть таблицы вроде экселя, и функция СЦЕПИТЬ, кто сказал что большой нудный код нужно обязательно делать в неудобных редакторах?
Ужасную кучу строк типа
(Nu:=101, Po:=2, Md:=0, No:=0, Mi:=0, Ma:=9999, Na:='Text1'),
в экселе можно сотворить менее чем за минуту,
из таблицы с кучей значений типа 101;2;0;0;0;9999;Text1

т.е. времени уйдёт меньше чем время на написание первого поста.
Ну вы в самом деле микроскопом гвозди забиваете

drvlas
16.12.2010, 18:31
ну вы в самом деле микроскопом гвозди забиваете

вот такой я упрямый парень :)

на самом деле все уже в прошлом. из-за того, что в структуру добавился указатель на переменную, а инициализировать указатель при компилировании оказалось в кдс низзя, актуальность создания такой таблицы стала равна нулю...