Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МГУПБ. Лаб. практ.мод. сист. в печать конечная...doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
4.54 Mб
Скачать

Листинг 12.1. Модель QueueExp

Вызов функции Exp_Rand, возвращающей экспоненциально распределенное случайное число переменным состояния TArrive^ и TWork^, осуществляется указателем в строках 21 и 29 листинга 12.1.

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

# include "sys struct .h." /* Структуры данных */

# include "sys extern.h." /* Внешние переменные*/

# include 'rts func.h' /* Функции, выполняемые системой */

# include 'c macros.h" /* Макросы для раскрытия пути доступа */

а также как минимум одна стандартная библиотека С:

# include "stdlib.h" /* Cтандартная библиотека общего назначения языка С */

Эти головные файлы могут быть найдены в директории include \simplex при инсталляции Simplex3.

Пример С-функции Exp_Rand расчета нормального распределения случайной величины, описанной в строках 3 и 4 базисного компонента QueueExp и вызываемой в строках 21 и 29, представлен в листинге 12.2.

1 /*****************************************************/

2 /* Function Exp_Rand ( REAL: mean --> REAL ) */

3 /*****************************************************/

4 # include "sys_struct.h"

5 # include "sys_extern.h"

6 # include "rts_func.h"

7 # include "c_macros.h"

8 # include <stdlib.h>

9 # include <math.h>

10 real Exp_Rand ( real mean )

11 {

12 real x_uniform;

13 real x_exp;

14 x_uniform = ( real ) rand ( ) / ( RAND_MAX + 1.0 );

15 x_exp = -InPara ( mean) * log ( x_uniform );

16 return ( x_exp );

17 }

Листинг 12.2. С-функция для вычисления экспоненциально распределенных случайных чисел

С-процедура с несколькими возвращаемыми переменными, в отличие от С-функции с одним значением возврата, имеет как входные параметры <in_parameter>, так и выходные <out_parameter> в следующей синтаксической форме заголовка

<procedure_head> ::= 'void' identifier ' (' < type > < in_ parameter >

{ ',' < type >< in_parameter >}-->

< type > < out_parameter > { ',' <type> < out_parameter > } ')'

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

Время ожидания в очереди T - Tвх. в очередь

Время обработки = Tобр.

При этом требующие длительного обслуживания заявки с низкими исходными приоритетами будут увеличивать свой приоритет со временем и поэтому будут обработаны быстрее.

Описание такой С-процедуры имеет вид:

1 /***********************************************************/

2 /* Procedure Candidate ( ARRAY [n][m] REAL: data, */

3 /* INTEGER: number, */

4 /* REAL: time */

5 /* --> INTEGER, REAL, REAL ) */

6 /***********************************************************/

7 # include "sys_struct.h"

8 # include "sys_extern.h"

9 # include "rts_func.h"

10 # include "c_macros.h"

11 # include <stdio.h>

12 # include <stdlib.h>

13 void Candidate ( array data;

14 integ number;

15 real time;

16 integ *position;

17 real *r_entry;

18 real *r_proc;

19 )

20 {

21 int i;

22 real high_priority = 0.0;

23 real curr_priority = 0.0;

24 integ candidate = 1;

25 if ( InPara ( number ) >= 1 )

26 for ( i = 1; i <= InPara ( number ); i++ )

27 {

28 curr_priority = ( InPara ( time ) –

29 InPara2 ( data, real, i, 1 ) ) /

30 InPara2 ( data, real, i, 2 );

31 if ( curr_priority > high_priority )

32 {

33 high_priority = curr_priority;

34 candidate = i;

35 }

36 }

37 OutPara ( position ) = candidate;

38 OutPara ( r_entry ) = InPara2 ( data, real, candidate, 1 );

39 OutPara ( r_proc ) = InPara2 ( data, real, candidate, 2 );

40 }

Объявление С-процедуры в разделе LOCAL DEFINITIONS базисного компонента QueueExp (листинг 12.1):

C_PROCEDURE Candidate ( ARRAY [n][m] REAL, INTEGER, REAL

--> INTEGER, REAL, REAL )

Фрагмент основной программы [1] с оператором вызова С-процедуры определения текущего приоритета имеет вид:

ON GetPos

DO

(Position^, T_Entry^, T_Proc^ ) :=

Candidate ( ARRAY Data, IMIN 20, NUMBER (WaitP)), T );

………………

END