Читайте также:
|
|
Когда LINGO для Windows начинает работу, он разыскивает файл с библиотеками DLL, называемый MYUSER.DLL. Система LINGO ищет этот файл в вашей рабочей директории. Если в рабочей директории ничего не найдено, LINGO просматривает директорию StartUP. Рабочей директорией является та, в которой вы разместили файлы LINGO. Startup-директорий является та, где вы установили LINGO. Если LINGO находит MYUSER.DLL, он загружает его в память и вызывает каждый раз, когда модель ссылается на функцию @USER.
Следующая программа на языке C может быть откомпилирована в Microsoft Visual C с созданием DLL, содержащей простую функцию @USER, которая принимает два аргумента и возвращает их произведение. (Все файлы вы можете найти в директории \LINGO\USER\MSVC).
// Простая 16-битная DLL на Мicrospft C для создания пользовательской функции @USER
//в KINGO. Этот простой пример функции, которая просто возвращает произведение
// двух чисел (например, @USER(3, 2.1) вернет 6.3.
//
// DLL может быть построена с помощью следующей команды:
//
// wmake /f myuser.mak
#include <windows.h>
int FAR PASCAL LibMain(HINSTANCE hinst, WORD wDataSeg,
WORD cbHeapSize, LPSTR lpszCmdLine)
{
// Performs DLL initialization
// если сегмент данных DLL перемещаемый в памяти, освободите его
if (cbHeapSize!= 0) UnlockData(0);
// Дайте знать пользователю, что MyUser/DLL установлена. (Закоментитуйте этот оператор, если, хотите, чтобы
/ / никаких сообщений не выводилось.)
MessageBox(NULL, "MYUSER.DLL has beed installed!",
"MyUser", MB_ICONEXCLAMATION);
return 1;
}
void FAR PASCAL MyUser(long far *iNumberOfArgs,
double far *dX, double far *dUser)
{
// Вычисляет значение функции @USER для заданных значений входных параметров.
//
// Inputs:
// *iNumberOfArgs количество аргументов при вызове функции @USER
call
// dX указатель на массив, содержащий все значения аргументов
//
// Выходные данные:
// *dUser значение функции @USER, вычисляющей произведение двух аргументов, и возвращаемое в*dUser
*dUser = *dX++ * *dX;
return;
}
int FAR PASCAL WEP(int nParameter)
{
// Выход из процедуры Windows... всего лишь возвращает 1
return 1;
}
Используйте следующий ввод при использовании Microsoft утилиты make для построения DLL:
all: myuser.dll
myuser.obj: myuser.c myuser.mak
cl -DSTRICT -G2sw -W3 -c -ASnw \
-Zp -Zid -Od myuser.c
myuser.dll: myuser.obj myuser.def myuser.mak
link /CO /NOD /NOE myuser.obj, myuser.dll,, \
libw sdllcew, myuser.def
rc myuser.dll
implib myuser.lib myuser.def
Даже если у вас нет копии Microsoft C, вы можете попытаться использовать @USER, просто скопировав DLL, поставленную с пакетом LINGO в его рабочей директории. Для этого используйте команду DOS:
COPY \LINGO\USER\MSVC\MYUSER.DLL \LINGO\MYUSER.DLL
При этом предполагается, что вы установили LINGO в поддиректории /LINGO. В противном случае модифицируйте соответствующим образом эту команду. После этого можете загрузить LINGO и запустить на выполнение какую-либо модель, которая вызывает @USER с двумя аргументами. Ниже показано, как на экране может выглядеть сеанс такой работы:
Чтобы удалить из LINGO динамическую библиотеку @USER, используйте команду DOS:
DEL \LINGO\MYUSER.DLL
LINGO также содержит код на языке C и MAKE-файл для установки совместимой версии @USER, используя 32-битный компилятор Watkom C. Просмотрите директорию \LINGO\USER\WATCOM относительно всех необходимых файлов.
ЕЩЕ ОДИН ПРИМЕР @USER
На платформах, отличных от Windows, вы должны собрать (link) процедуру, откомпилированную на Фортране или C, с библиотеками LINGO, чтобы создать пользовательскую функцию @USER. Чтобы проиллюстрировать это, рассмотри следующую функцию на Фортране:
REAL*8 FUNCTION USER(N, Z)
INTEGER*4 N
REAL*8 Z(N)
C Inputs:
C N = число аргументов, поставляемых в @USER
C Z(J) = значение J-го аргумента
WRITE(6, *) N, Z
USER = Z(1) * Z(2)
RETURN
END
Если эта функция откомпилирована и отредактированы связи (link) с LINGO, то модель LINGO может выглядеть например так:
MODEL:
1] X = @USER(3, 2.1);
END
При выполнении этой модели подпрограмма @USER выведет на экран следующие значения:
MODEL:
2, 3.0, 2.1
…а переменная X будет содержать значение 6.2.
О том, как выполнять «линковку» вашей пользовательской программы с LINGO, см. Release Notes своей версии LINGO.
@WARN(‘text’, condition)
Функция выводит на экран сообщение «text», если выполняется условие condition. В нижеприведенном примере при выполнении модели на экран будет выведено сообщение «INVALID INTEREST RATE», если пользователь введет отрицательное значение процентной ставки (interest rate).
MODEL:
1]
2]! Модель закладной на дом
3]
4] DATA:
5] YRATE =?;
6] YEARS =?;
7] LUMP =?;
8] ENDDATA
9]
10]! количество месячных платежей;
11] MONTHS = YEARS * 12;
12]
13]! месячная процентная ставка;
14] (1 + MRATE) ^ 12 = 1 + YRATE;
15]
16]! расчет месячных платежей;
17] LUMP = PAYMENT * @FPA(MRATE, MONTHS);
18]
19] @WARN(‘INVALID INTEREST RATE’, YRATE #LT# 0);
20]
END
@WRAP(I,N)
Эта функция возвращает I, если I принадлежит интервалу [1, N ]. В противном случае вычитает N из I до тех пор, пока не окажется в интервале [1, N ], и затем возвращает I. (Формально она возвращает такое J, что J = I - K*N, где K — положительное или отрицательное целое, такое что J находится в интервале [1, N ]. Функция не определена, если N <1.
В моделях периодического планирования функция @WRAP переустанавливает конец периода планирования в его начало.
Предположим, что X(I) есть количество служащих, работающих в день I, начиная с первого по N -й день, и мы хотим узнать величину DELTA(I), чтобы измерить изменение количества служащих, работающих с I– 1-го дня по I -й день. Следующее уравнение вычисляет DELTA(I):
DELTA(I) = X(I) - X(@WRA P(I - 1, N));
Если I -1>0, то оно эквивалентно такому:
DELTA(I) = X(I) - X(I - 1);
Если I -1=0, то оно эквивалентно следующему:
DELTA(1) = X(1) - X(N);
Дата добавления: 2015-11-16; просмотров: 50 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Другие функции | | | Доступ к элементам множества — функция @FOR |