на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Программа вычисления значения и вывода графика определенного интеграла
p align="left">При запуске нескольких экземпляров одного приложения, Windows загружает в оперативную память только одну копию кода и ресурсов - модуль приложения, создавая несколько отдельных сегментов данных, стека и очереди сообщений, каждый набор которых представляет из себя задачу, в понимании Windows. Копия приложения представляет из себя контекст, в котором выполняется модуль приложения. DLL - библиотека также является модулем. Она находится в памяти в единственном экземпляре и содержит сегмент кода и ресурсы, а также сегмент данных. DLL - библиотека, в отличие от приложения не имеет ни стека, ни очереди сообщений. Функции, помещенные в DLL, выполняются в контексте вызвавшего приложения, пользуясь его стеком. Но эти же функции используют сегмент данных, принадлежащий библиотеке, а не копии приложения.

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

Часто, в виде DLL создаются отдельные наборы функций, объединенные по тем или иным логическим признакам, аналогично тому, как концептуально происходит планирование модулей ( в смысле unit ) в Pascal. Отличие заключается в том, что функции из модулей Pascal компонуются статически - на этапе линковки, а функции из DLL компонуются динамически, то есть в run-time.

Таким образом, DLL позволяют:

- избежать громоздкости исполняемого кода прикладной программы;

- улучшить структурированность и модульность приложения;

- уменьшить занимаемый приложением объем памяти за счет того, что несколько одновременно выполняющихся программ могут использовать одну и ту же копию подпрограммы из DLL, при этом в памяти будет физически загружена только одна копия библиотеки;

- использовать любую библиотеку в любых программах, не зависимо от того, на каком языке была написана программа и библиотека.

DLL являются одними из наиболее важных ключевых элементов при написании любого приложения Windows. Само ядро Windows представлено тремя большими по объему динамическими библиотеками: KERNEL.DLL, USER.DLL и GDI.DLL. Файл KERNEL.DLL, например, отвечает за управление памятью, процессами и потоками; USER.DLL содержит функции интерфейса пользователя, необходимые для создания окон и обработки сообщений Windows; на GDI.DLL возложена работа с графикой. Общее количество используемых самой Windows динамических библиотек составляет порядка двух тысяч.

В курсовом проекте также используется методика смешанного программирования. Так подынтегральные функции, используемые для расчета интегралов вынесены в отдельную динамическую библиотеку functions.dll. Численные методы вынесены также в отдельную библиотеку integrals.dll.

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

procedure TMainForm.LoadDlls;

var

x: real;

begin

IntegralsDll:=LoadLibrary('Integrals.dll');

FunctionsDll:=LoadLibrary('Functions.dll');

if IntegralsDll=0 then

begin

Application.MessageBox('Не найден модуль ''Integrals.dll''.

Работа приложения будет прекращена',

'Ошибка!!!', MB_Ok or MB_ICONERROR);

Application.Terminate;

end;

if FunctionsDll=0 then

begin

Application.MessageBox('Не найден модуль ''Functions.dll''. Работа приложения будет прекращена',

'Ошибка!!!', MB_Ok or MB_ICONERROR);

Application.Terminate;

end;

@Simpson:=GetProcAddress(IntegralsDLL,'Simpson');

@CountTrap:=GetProcAddress(IntegralsDLL,'CountTrap');

if (@CountTrap=nil) or (@Simpson=nil) then

begin

Application.MessageBox('Ошибка в модуле ''Integrals.dll''.

Работа приложения будет прекращена',

'Ошибка!!!', MB_Ok or MB_ICONERROR);

Application.Terminate;

end;

@Integral1Function:=GetProcAddress(FunctionsDLL,'Integral1Function');

@Integral2Function:=GetProcAddress(FunctionsDLL,'Integral2Function');

if (@Integral1Function=nil) or (@Integral1Function=nil) then

begin

Application.MessageBox('Ошибка в модуле ''Functions.dll''.

Работа приложения будет прекращена',

'Ощибка!!!', MB_Ok or MB_ICONERROR);

end;

2.9 Контроль неквалифицированных действий пользователя

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

Выполнение данной задачи достигалось путем использования структурной обработки исключительных ситуаций - системы, позволяющей программисту при возникновении ошибки (исключительной ситуации) связаться с кодом программы, подготовленным для обработки такой ошибки. Это выполняется с помощью языковых конструкций, которые как бы “охраняют” фрагмент кода программы и определяют обработчики ошибок, которые будут вызываться, если что-то пойдет не так в “охраняемом” участке кода. В данном случае понятие исключительной ситуации относится к языку и не нужно его путать с системными исключительными ситуациями (hardware exceptions), такими как General Protection Fault. Исключительные ситуации в Delphi же независимы от “железа”, не используют прерываний и используются для обработки ошибочных состояний, с которыми подпрограмма не готова иметь дело. Системные исключительные ситуации, конечно, могут быть перехвачены и преобразованы в языковые исключительные ситуации, но это только одно из применений языковых исключительных ситуаций.

При традиционной обработке ошибок, ошибки, обнаруженные в процедуре обычно передаются наружу (в вызывавшую процедуру) в виде возвращаемого значения функции, параметров или глобальных переменных (флажков). Каждая вызывающая процедура должна проверять результат вызова на наличие ошибки и выполнять соответствующие действия. Часто, это просто выход еще выше, в более верхнюю вызывающую процедуру и т.д. : функция A вызывает B, B вызывает C, C обнаруживает ошибку и возвращает код ошибки в B, B проверяет возвращаемый код, видит, что возникла ошибка и возвращает код ошибки в A, A проверяет возвращаемый код и выдает сообщение об ошибке либо решает сделать что-нибудь еще, раз первая попытка не удалась.

Структурная обработка исключительной ситуации замещает ручную обработку ошибок автоматической, сгенерированной компилятором системой уведомления. В приведенном выше примере, процедура A установила бы “охрану” со связанным обработчиком ошибки на фрагмент кода, в котором вызывается B. B просто вызывает C. Когда C обнаруживает ошибку, то создает (raise) исключительную ситуацию. Специальный код, сгенерированный компилятором и встроенный в Run-Time Library (RTL) начинает поиск обработчика данной исключительной ситуации. При поиске “защищенного” участка кода используется информация, сохраненная в стеке. В процедурах C и B нет такого участка, а в A - есть. Если один из обработчиков ошибок, которые используются в A, подходит по типу для возникшей в C исключительной ситуации, то программа переходит на его выполнение. При этом, область стека, используемая в B и C, очищается; выполнение этих процедур прекращается.

Если в A нет подходящего обработчика, то поиск продолжается в более верхнем уровне, и так может идти, пока поиск не достигнет подходящего обработчика ошибок среди используемых по умолчанию обработчиков в RTL. Обработчики ошибок из RTL только показывают сообщение об ошибке и форсированно прекращают выполнение программы. Любая исключительная ситуация, которая осталась необработанной, приведет к прекращению выполнения приложения.

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

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

Пример использования структурной обработки исключительных ситуаций с использованием блока try-except в процедуре TMainForm.btnSimpsonRunClick приведен на рисунке 11.

try

a:=StrToFloat(edSimpA.Text);

b:=StrToFloat(edSimpB.Text);

n:=StrToInt(edSimpN.Text);

if a>b then

begin

Application.MessageBox('Нижний предел больше верхнего', 'Ошибка!',MB_OK or MB_ICONError);

exit;

end;

except

on EConvertError do

begin

Application.MessageBox('Ошибка ввода численных значений', 'Ошибка!',MB_OK or MB_ICONError);

exit;

end;

end;

Также в программе применяется методика создания и обработки пользовательской исключительной ситуации. Так в модуле evalComp.pas создается класс EvalException, являющийся потомком класса EAbort. В процессе работы с модулем может произойти генерация исключительной ситуации, которую в свою очередь будет обрабатывать вызывающий модуль (в нашем случае процедура TEvalForm.btnOkClick). Листинг примера работы с пользовательскими исключительными ситуациями приведен на рисунке 12.

type

EvalException = class(EAbort)

end;

function myfac(x,y:real):real;

var

begin

if x<0 then begin raise EvalException.Create(''); halt; end;

if x = 0 then myfac := 1

else

end;

procedure TEvalForm.btnOkClick(Sender: TObject);

begin

Dispose(calc, done);

try

new(calc, init(edEval.Text)); Close;

except

on EvalException do ShowMessage('Ошибка в формуле');

end;

end;

Кроме того, в программе для предотвращения возникновения непредвиденных ситуаций применяется защищенный блок try-finally-end. Листинг приведен на рисунке 13.

procedure TChart.SaveToFile(filename: string);

var temporary: TPicture;

begin

temporary:=TPicture.Create;

try

temporary.Bitmap.Width:=width; temporary.Bitmap.Height:=height;

Temporary.Bitmap.Canvas.CopyRect(Temporary.Bitmap.Canvas.ClipRect,MainCanvas, MainCanvas.ClipRect);

Temporary.SaveToFile(filename);

finally

temporary.Destroy;

end;

end;

3. ЭЛЕМЕНТЫ ИНТЕРФЕЙСА ПРОГРАММНОГО КОМПЛЕКСА

3.1 Шаблоны окон

На рисунках 12 и 13 изображено главное окно программы, которое может изменять свой вид в зависимости от выбранной закладки. На рисунке 14 изображено окно, предназначенное для ввода произвольной функции. На рисунке 15 представлена форма окна отображающего сведения о системе. Окно на рисунке 16 изображено окно сведений о разработчике.

Рисунок 12 - Главное окно программы - закладка «Расчет интегралов»

Рисунок 13 - Главное окно программы - закладка «Построение графика»

Рисунок 14 - Окно «Произвольная функция»

Рисунок 15 - Окно отображающее информацию о текущей системе

Рисунок 16 - Окно сведений о программе

Все компоненты, которые расположены на формах представленных на рисунках 12-16, описаны в таблицах 1-4.

3.2 Структурно-функциональная схема программного комплекса

Файл формы - MainUnit.pas

Имя формы - MainForm

Заголовок - Курсовая работа по СПр

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

Страницы: 1, 2, 3, 4, 5, 6



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.