У меня Есть 2 Вопроса по Turbo Pascal 7.0:
1) Это даже не вопрос, а факты о противоречии разных авторов об одних вещах, - вопрос касается <структуры> Множество <set of ...>
Привожу Цитаты:
a) <... Исходя из особенностей внутреннего представления множеств можно сделать два основных вывода: [...] - все операции над множествами выполняются значительно эффективней, чем над другими структурами данных>
Рапаков Г. Г. (или как там), Ржеуцкая С. У. "Программирование на языке Pascal" Spb 2004. стр 282
б)<... Одна из причин редкого применения - очень низкая скорость выполнения операции с множествами.>
Издательская группа BHV "Турбо Паскаль 7.0" Киев 1999г. стр 157
Исходя из внутреннего устройство множества в Tubo Pascal я склонен верит первому высказыванию, и смело переписал некоторые фрагменты одной своей программы с их помощью. However, работа с отдельными битами нам не разрешена (даже в asm'е мы логически складываем, умножаем отдельные БАЙТЫ, чтобы переключить нужный нам бит). У кого-нибудь есть размышления (а лучше конкретные факты в пользу одной из двух высказываний).
p.S. Если кто-то посоветует сравнить книги по остальному содержанию, то он может дальше не читать
2) Вопрос второй касается распределения памяти. Вот фрагмент программы, которая корректно работает:
Главный Pas файл.
{=============================================} 
{ Программа просит ввести аргументы и соответствующие им значения
 функции. Затем Она Интерполирует их методом Лагранжа и получает 
уравнение для зависимости. Далее Программа строит график этой функции
 } 
{ например вы знаете что x0 = 0 y0 = 0; x1 = 2 y1 = 4; x3 = 1; y3 = 1; 
а она вам скажет что f(x) = x^2 } 
{$N+} 
Uses Crt, Polynom, Graph; 
Const 
lY: longint = 0; { Количество аргументов } 
Var 
i, j : integer; { счетчики } 
pMassY: PdMass; { значения функции } 
pMassX: PdMass; { аргументы } 
pPolin: PdMass; { Указатель на полином } 
pFunk : pointer; { Указатель на функцию } 
procedure Init; 
begin 
{ Ввод pMassX и pMassY } 
end; 
{ Дальше я построю график данной функции } 
function f(x: double): Double; far; 
{ Считаем полином } 
Var 
i: integer; 
y: Double; 
begin 
y:= pPolin^[1]; 
for i:= 2 to lY do y:= y * x + pPolin^[i]; 
f:= y 
end; 
{----------------------------------------------------------------------------} 
begin 
Init; 
pPolin:= pBuildPol(lY, pMassX, pMassY); { Вот наш полином!!!!!!!!!!!!!!!! } 
{ Включаем графику } 
{ Сохраняем адрес функции, чтобы передать его в процедуру } 
pFunk:= @f; 
{ Передаем указатель на аргументы, их количество, указатель на функцию, и координаты окна в котором вывести график } 
DrawShedule(pMassX, lY, pFunk, 30, 30, 600, 400); 
{ Выключи графику } 
... 
end. 
 {---------------------------------------------------------------------------------} 
{ А вот модуль Polynom, где процедура DrawShedule }{=============================================} 
{$N+} 
Unit Polynom; 
interface 
.... 
Type 
... 
TFunk = function (x: double): Double; 
... 
procedure DrawShedule(... p: Pointer...); 
{ тут p = @f } 
.... 
implementation 
... 
procedure DrawShedule(... p: Pointer ...); { тут p = @f } 
.... 
Var 
f : TFunk; { функция, график которой надо построить } 
begin 
.... 
@f:= p; { связываю переменную f с функцией адрес, которой лежал в p} 
... 
{ И используем её } 
dX:= f(x) 
end; 
... 
end. 
{==============================================} 
 Вот таким способом я передал функцию в процедуры построения графика. Немного короче было бы передать функцию так
procedure DrawShedule(... f: TFunk ...); а вызов DrawShedule(... f ...);
Но об этом разговор дальше.
Так программа рабочая, я вставляю текст в виртуальный метод в другой программе
{==============================================} 
interfaсe 
............. 
TMass = Object(TAssembly) {TAssembly - абстрактный класс } 
Private 
{ Данные } ... 
Public 
{ Методы } ... 
Procedure Job; Virtual; {вот сюда} 
end; 
............ 
implementation 
............ 
Procedure TMass.Job; 
Var 
...... 
pPolin: PdMass; { Указатель на коэффициенты полинома } 
pFunc : Pointer; 
...... 
{----------------------------------------------------------------------------------} 
function f(x: double): Double; far; 
{ И Горнор пригодился/ или Горнер xD } 
Var 
i: integer; 
y: Double 
begin 
y:= pPolin^[1]; 
for i:= 2 to lX do y:= y * x + pPolin^[i]; 
f:= y 
end; 
{-----------------------------------------------------------------------------------} 
begin 
pFunc:= @f; { Сохраняем адрес } 
pPolin:= pBuildPol(lX, pMassX, pMassY); { Вот наш полином!!!!!!!!!!!!!!!! } 
{ Включаем графику } 
{ Покажи график } 
DrawShedule(... pFunc ...); 
{ В гробу я видел эту интерполяцию xD } 
end; 
...... 
end. 
{ Модуль Polynom остался прежним } 
{==============================================} 
 Так Вот, Господа, приверженцы передачи имени процедуры с помощью типа в данном случае компилятор даже не захочет с вами общаться, Утверждая, Что то, что вы передаете в процедуру DrawShedule(... f ...) не указывает на область памяти, это про "f".
Передавая указатель, как в данном случае я и написал, компилятор не может отследить этот факт и благополучно компилирует программу.
Но, когда программа доходит до использования функции f - начинаются проблемы....
Они связанны с.....?? Это и есть мой вопрос.
Мой рассуждения. У виртуального метода локальная функция хранится либо в стеке, либо в сегменте кода, поэтому компилятор не захочет передавать имя функции в качестве формального параметра, ведь он боится, что на этапе позднего связывания, он не сможет определить расположение функции.
Рассуждения, как решить проблему: расположить код функции по конкретному адресу в памяти ( где-то тут $C000:0000 ) - Но как это реализовать?
А еще может мои рассуждения просто чушь, Посему я и обратился к Вам! Тема покажет, какие тут программисты на форуме.
p.s.s отдельная программа работает, как и при передаче имени функции, так и при передачи её адреса (как я написал). В виртуальном методе при передачи имени функции компилятор не захочет с вами иметь дело. А вот при передачи адреса он с вами будет дружить, он то будет, а вот процессор нет...
Ну, ваши соображения, уважаемые пользователи форума!
Не Забывайте я задал 2 вопроса