Генератор
Проектов

Проект utlarrstr

Проект демонстрирует использование типов структур и массивов.

В пакете orgarr описаны структурные типы t_info и t_org. Структурный тип задается в описании ключевым словом struct, далее в скобках через запятую перечисляются компоненты структуры в виде пар тип, имя компоненты. Структуры могут быть вложенными. В нашем случае в структуре типа t_org располагается компонента yinfo типа t_info.

Структурные переменные описываются как и простые - имя типа и имя процедуры. Доступ к компонентам структуры обеспечивается так называемыми точечными выражениями. А именно, переменная структурного типа (или выражение структурного типа) обозначает всу структуру целиком. Таким переменным можно присваивать значения в виде аналогичных структурных выражений. Если после выражения, представляющего структуру поставить точку и, далее, имя компоненты, то полученное выражение означает эту компоненты. Ей можно присваивать подходящие по типу значения или использовать ее в составе другого выражения. Если такая компонента в свою очередь является структурой, то после нее снова можно ставить точку и имя подкомпоненты. Таким образом можно строить точечные выражения произвольной вложенности.

Тип массива задается в описании ключевыми словами farray of, далее идет ссылка на тип элемента массива. После типа элемента массива в квадратных скобках либо задается длина, либо указывается просто пара скобок.

Если указана длина (числом или константным выражением), то мы имеем полноценный фиксированный массив, который может быть использован в любом контексте.

Если длина в описании массива отсутствует, то этот тип может быть использован только в описании формальных параметров процедур или функций. Соответствие типов формальных и фактических параметров в таком случае проверяется по совпадению типов элементов массивов.

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

Выражение LENGTH(...) применительно к массиву выдает в качестве значения количество элементов.

В утилите utlarrstr описаны две процедуры test_fix и test_var. В первой процедуре формальный параметр использует тип фиксированного массива из пакета orgarr. Во второй процедуре формальный параметр имеет тип описанного ранее в этой же утилите типа массива без длины, но с типом элемента как и в массиве из пакета orgarr. В остальном процедуры одинаковы, одинаковы и их вызовы.

В данном проекте задействованы системные пакеты rand и rand_test для генерации случайных тестовых данных.

Файл utlarrstr.gen:

project utlarrstr
  /version="01.001"
  /firm="УСТ"
  /http="http://www.ustech.ru"
  /email="managers@ustech.ru"

package orgarr

utility utlarrstr

Файл utlarrstr.utility:

utility utlarrstr:"UTLARRSTR"

fproc test_fix(orgarr.t_orgarr yorgarr)
{ var
    int iorg;

  for ( iorg := 0; iorg < LENGTH(orgarr.t_orgarr); iorg += 1 )
  { dprint("\n");
    dprint(U"Наименование: ",yorgarr[iorg].orgname,"\n");
    dprint(U"Адрес: ",yorgarr[iorg].yinfo.addr,"\n");
    dprint(U"Телефон: ",yorgarr[iorg].yinfo.phone,"\n");
  }
}

type t_orgarr : farray of orgarr.t_org[];

fproc test_var(t_orgarr yorgarr)
{ var
    int iorg;

  for ( iorg := 0; iorg < LENGTH(orgarr.t_orgarr); iorg += 1 )
  { dprint("\n");
    dprint(U"Наименование: ",yorgarr[iorg].orgname,"\n");
    dprint(U"Адрес: ",yorgarr[iorg].yinfo.addr,"\n");
    dprint(U"Телефон: ",yorgarr[iorg].yinfo.phone,"\n");
  }
}

main
{ var
    orgarr.t_orgarr yorgarr;

  call orgarr.fill(yorgarr);
  call test_fix(yorgarr);
  call test_var(yorgarr);
}
Скачать проект utlarrstr