ВУЗ:
Составители:
Рубрика:
58
последовательно сопоставляет переменной f имена (=
адреса) всех трех
функций и выводит на экран значения интеграл ов от них, вычисленных
в одних и тех же пред елах: от 0 до 1.
Заметим , что параметр в рассмотренных функциях можно было
назвать именем , отличным от x , однако его тип и тип возвращаемого
значения однозначно определяются типом переменной f . Если здесь бу-
дет обнаружено несоответствие, ком пилятор не допустит присваивания.
Следует отметить также, что встроенные подпрограммы, напри-
мер, sin, не могут использоваться для инициализации указателей. При
необходимости их можно погрузить внутрь собственной процедуры или
функции:
function MySin(x: Real): Real; begin result:=sin(x); end;
Нельзя присвоить указателю и адрес локальной подпрограммы.
Интерпретация компилятором операции, которую следует выпол -
нить над процедурным указателем , зависит от положения, занимаемого
пос ледним в выражении. Если f и g — два указателя одного типа и prog
— подходящая для их инициализации подпрограмма, то:
1) выражения f:=prog и g:=prog приводят , как мы уже видели, к при-
сваиванию адреса подпрограммы переменным;
2) выражение f:=g копирует значение g в f;
3) любое другое использование переменных f и g воспринимается
как в ы зов адресуемой ими подпрограммы и должно сопровождаться
передачей необх одимого числа значений в качестве параметров .
Важно помнить, что указатель нельзя применять для вызова, не
инициализировав его значение корректным адресом . Нарушение этого
правила почти наверное приводит либо к возникновению исключител ь -
ной ситуации, либо просто к зависанию программы.
Показать, что переменная не определена, можно, присвоив ей зна-
чение nil (его же получают статические указатели при старте прилож е -
ния). Для проверки корректности содержимого используется функция
Assigned(const P) (задан). Она возвращает «истину» , если значение пе-
реданного указателя не nil, и «ложь» в противном случае. Таким обр а -
зом , реализацию приведенной выше функции Integral имеет смысл моди-
фицировать следующим образом .
function Integral(f: Integrand; xmin, xmax: Real): Real;
var i: Integer; dx: Real;
begin
if Assigned(f) then begin // если f<>nil, выполнить вычисления
dx:=(xmax-xmin)/100;
пос л ед ов ат ел ь но с опос т ав л яет перем енной f им ена (= ад рес а) в с ехт рех
функций и в ы в од ит на э кран з начения инт еграл ов от них, в ы чис л енны х
в од нихи т ехже пред ел ах: от 0 д о1.
Зам ет им , что парам ет р в рас с м от ренны хфункцияхм ожно бы л о
наз в ат ь им енем , отл ичны м от x, од нако его т ип и т ип в оз в ращаем ого
з начения од ноз начноопред ел яют с я т ипом перем енной f. Е с л и з д ес ь бу-
д ет обнаруженонес оот в ет с т в ие, ком пил ятор не д опус т ит прис в аив ания.
Сл ед ует от м ет ит ь т акже, чт о в с т роенны е под програм м ы , напри-
м ер, sin, не м огут ис пол ь з ов ат ь с я д л я инициал из ации указ ат ел ей. При
необход им ос т и ихм ожнопогруз ит ь в нут рь с обс т в енной процед уры ил и
функции:
function MySin(x: Real): Real; begin result:=sin(x); end;
Н ел ь з я прис в оит ь указ ат ел ю и ад рес л окал ь ной под програм м ы .
И нт ерпрет ация ком пил ятором операции, которую с л ед ует в ы пол -
нит ь над процед урны м указ ат ел ем , з ав ис ит от пол ожения, з аним аем ого
пос л ед ним в в ы ражении. Е с л и f и g — д в а указ ат ел я од ногот ипа и prog
— под ход ящая д л я ихинициал из ации под програм м а, то:
1) в ы ражения f:=prog и g:=prog прив од ят, как м ы уже в ид ел и, к при-
с в аив анию ад рес а под програм м ы перем енны м ;
2) в ы ражение f:=g копирует з начение g в f;
3) л юбое д ругое ис пол ь з ов ание перем енны х f и g в ос приним ает с я
как в ы з ов ад рес уем ой им и под програм м ы и д ол жно с опров ожд ат ь с я
перед ачей необход им огочис л а з начений в качес т в е парам ет ров .
Важно пом нит ь , что указ ат ел ь нел ь з я прим енят ь д л я в ы з ов а, не
инициал из иров ав его з начение коррект ны м ад рес ом . Н аруш ение э того
прав ил а почт и нав ерное прив од ит л ибок в оз никнов ению ис кл ючит ел ь -
ной с ит уации, л ибопрос ток з ав ис анию програм м ы .
Показ ат ь , чтоперем енная не опред ел ена, м ожно, прис в оив ей з на-
чение nil (егоже пол учают с т ат ичес кие указ ат ел и при с т арт е прил оже-
ния). Дл я пров ерки коррект нос т и с од ержим ого ис пол ь з ует с я функция
Assigned(const P) (з ад ан). Она в оз в ращает «ис т ину» , ес л и з начение пе-
ред анного указ ат ел я не nil, и «л ожь » в прот ив ном с л учае. Т аким обра-
з ом , реал из ацию прив ед енной в ы ш е функции Integral им еет с м ы с л м од и-
фициров ат ь с л ед ующим образ ом .
function Integral(f: Integrand; xmin, xmax: Real): Real;
var i: Integer; dx: Real;
begin
if Assigned(f) then begin // если f<>nil, выполнить вычисления
dx:=(xmax-xmin)/100;
58
Страницы
- « первая
- ‹ предыдущая
- …
- 56
- 57
- 58
- 59
- 60
- …
- следующая ›
- последняя »
