Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Пример для Windows

Команды LINGO | Закладка LINK | Создание источника пользовательских данных | Экспортирование данных из LINGO | Закладка I N T E R F A C E | ЗАКЛАДКА GENERAL SOLVER | Закладка NONLINEAR SOLVER | ЗАКЛАДКА INTEGER SOLVER | Функции импорта файлов | Вероятностные функции |


Читайте также:
  1. Boot (англ. загрузка. Пример: основной загрузочный сектор) -вирусы
  2. D.1. Примеры уязвимостей
  3. Doors and windows
  4. III. После этого раненую конечность лучше всего зафиксировать, например, подвесив на косынке или при помощи шин, что является третьим принципом оказания помощи при ранениях.
  5. Microsoft Windows 8
  6. SMB bug could be exploited on Windows XP, Server 2003 to hijack machines, say experts
  7. SWOT- анализ на примере ветеринарной аптечной сети.

Когда 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

mybiblioteka.su - 2015-2024 год. (0.011 сек.)