Показано с 1 по 4 из 4

Тема: инициализация массива структур

  1. #1
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    920

    По умолчанию инициализация массива структур

    Здравствуйте!

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

    Код:
    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; 27.11.2010 в 14:15.

  2. #2
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    920

    По умолчанию

    Спасибо за быстрый ответ!

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

    Если я правильно понял, саму структуру ты создаешь аналогично. Но не инициализируешь ее при объявлении.
    Цитата Сообщение от Валенок Посмотреть сообщение
    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 раз точно обломно.

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

  3. #3

    По умолчанию

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

    т.е. времени уйдёт меньше чем время на написание первого поста.
    Ну вы в самом деле микроскопом гвозди забиваете
    Последний раз редактировалось BETEP; 16.12.2010 в 18:26.

  4. #4
    Пользователь Аватар для drvlas
    Регистрация
    30.09.2010
    Адрес
    Киев
    Сообщений
    920

    По умолчанию

    Цитата Сообщение от betep Посмотреть сообщение
    ну вы в самом деле микроскопом гвозди забиваете
    вот такой я упрямый парень

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

Ваши права

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