Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.30;
Скачать: CL | DM;

Вниз

Наезд на авторов толстой книги   Найти похожие ветки 

 
palva ©   (2005-01-10 23:45) [0]

Из книги Тейксейра Пачеко Delphi 5 Руководство разработчика.
т. 1 стр. 361 и далее:

PenniesInt.pas

{
Copyright й 1998 by Delphi 4 Developer"s Guide - Xavier Pacheco and Steve Teixeira
}

unit PenniesInt;
{ Interface routine for PENNIES.DLL }

interface
type

 { This record will hold the denominations after the conversion have
   been made }
 PCoinsRec = ^TCoinsRec;
 TCoinsRec = record
   Quarters,
   Dimes,
   Nickels,
   Pennies: word;
 end;

{$IFNDEF PENNIESLIB}
{ Declare function with export keyword }

function PenniesToCoins(TotPennies: word; CoinsRec: PCoinsRec): word; StdCall;
{$ENDIF}

implementation

{$IFNDEF PENNIESLIB}
{ Define the imported function }
function PenniesToCoins; external "PENNIESLIB.DLL" name "PenniesToCoins";
{$ENDIF}

end.


PenniesLib.dpr

{
Copyright й 1999 by Delphi 5 Developer"s Guide - Xavier Pacheco and Steve Teixeira
}

library PenniesLib;
{$DEFINE PENNIESLIB}
uses
 SysUtils,
 Classes,
 PenniesInt;

function PenniesToCoins(TotPennies: word; CoinsRec: PCoinsRec): word; StdCall;
begin
 Result := TotPennies;  // Assign value to Result
 { Calculate the values for quarters, dimes, nickels, pennies }
 with CoinsRec^ do
 begin
   Quarters    := TotPennies div 25;
   TotPennies  := TotPennies - Quarters * 25;
   Dimes       := TotPennies div 10;
   TotPennies  := TotPennies - Dimes * 10;
   Nickels     := TotPennies div 5;
   TotPennies  := TotPennies - Nickels * 5;
   Pennies     := TotPennies;
 end;
end;

{ Export the function by name }
exports
 PenniesToCoins;
end.


Не нужно разбираться в программе, хотя здесь тоже могут быть вопросы к комментарию { Declare function with export keyword }, который не соответствует реальному описанию функции, но это мелочи.

В главной программе указано {$IFNDEF PENNIESLIB} и авторы считают, что этот макрос будет использован в юните PenniesInt, который подключается немного ниже через unit. Ну типа, как в С часто пишут:

#define STRICT
#include <windows.h>

Я долго протирал глаза, потом почти в это поверил, придумывал, как это можно реализовать в юните, сел, стал пробовать и с облегчением понял, что это одно из заблуждений многоуважаемых (без иронии) авторов. Взять например с. 83, где авторы говорят о значениях Unassigned и Null:
Еще одно отличие этих значений состоит в том, что любая попытка вычиления выражений с пустым вариантом будет приводить к возникновению исключительной ситуации: "некорректная операция с вариантом". Однако этого не будет при использовании в выражении варианта со значением Null - результат вычисления любого выражения, в состав которого входит значение Null, всегда будет равен Null.
Ни то ни другое утверждение не соответствует реальности: Пустые варианты приводятся к нулю или пустой строке. А вычисления с Null подчиняются правилам, принятым в SQL и вовсе не всегда дают Null.

Может быть я неправ? А может быть это - давно известные приколы?


 
palva ©   (2005-01-10 23:46) [1]

Поправка
В главной программе указано {$DEFINE PENNIESLIB}



Страницы: 1 вся ветка

Текущий архив: 2005.01.30;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.048 c
3-1104302393
DimaK
2004-12-29 09:39
2005.01.30
Вопрос в IBX...


1-1105612715
WhiteGuy
2005-01-13 13:38
2005.01.30
Плюсовая округлялка


14-1104219850
Satur
2004-12-28 10:44
2005.01.30
Что это за новый оператор в Украине рекламируют?


3-1104313235
korvin
2004-12-29 12:40
2005.01.30
Таблицы только на чтение или снова DeadLock ...


1-1105698951
Unknown
2005-01-14 13:35
2005.01.30
Application.CreateForm