IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Для Тех Кто Реально разбирается в "turbo Pascal", Срочно!!!!
Reople
сообщение 28.05.2005 19:52
Сообщение #1





Группа: Пользователи
Сообщений: 2
Пол: Мужской

Репутация: -  0  +


Доброго времени суток, знаток Turbo Pascal'я (если нет, то можешь дальше не читать).

У меня Есть 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 вопроса

Сообщение отредактировано: Oleg_Z - 29.05.2005 20:12
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
Closed Topic Открыть новую тему 
Ответов
hiv
сообщение 1.06.2005 15:08
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 660
Пол: Мужской
Реальное имя: Михаил

Репутация: -  11  +


Если по человечески - то если начал писать в ООП, то и пиши все в ООП. Т.е. твоя ф-ция наверняка будет тобой или еще кем-то меняться на свою, вот и определи ее как один из методов твоего объекта и сделай ее виртуальной, чтобы потом ее можно было перегружать. А то что ты ее хоть и прописал внутри своего виртуального метода, то вызвать ее можешь только находясь внутри него, а хочешь использовать ее еще где-то. Ты сам себе противоречишь!
Цитата
Возможны ошибки, так как к данным типа rBuff получают доступ все методы модуля, выше которых они описаны.
Так опиши rBuff как поле твоего объекта и тогда все методы будут иметь к нему доступ.

Сообщение отредактировано: hiv - 1.06.2005 15:12


--------------------
Никогда не жадничай. Свои проблемы с любовью дари людям!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Reople   Для Тех Кто Реально разбирается в "turbo Pascal"   28.05.2005 19:52
volvo   Полностью согласен... Неоднократно убеждался в эт...   28.05.2005 20:28
-reople-   Во-первых, выражаю вам благодарность Volvo за сооб...   29.05.2005 20:00
volvo   Ну, в таком случае - вот ответ на второй вопрос: ...   30.05.2005 0:02
-reople-   thx Oleg_Z. И вправду красиво получилось..... и чт...   29.05.2005 23:06
Romtek   Я так и не понял в чём проблема. Не получается выз...   29.05.2005 23:59
AlienEmperor   2 Reople: вот сейчас все брошу и буду над Вашими п...   30.05.2005 15:00
-Reople-   Volvo ты самый ЛУЧШИЙ! БОЛЬШОЕ спасибо за реал...   30.05.2005 15:38
Guest   На чем писать руководство скажет на том и будешь, ...   30.05.2005 15:41
-reople-   последнее сообщение моё. про <руководство и С++...   30.05.2005 15:41
Romtek   Вот состряпал пример, надеюсь поможет (с указателе...   30.05.2005 19:08
-reople-   Romtek, thx - но это не поможет, это мы и сами уме...   30.05.2005 21:02
volvo   :no: Не думай об этом... Для тебя то, что функци...   30.05.2005 21:36
Romtek   Приведи всё же пример, гость -reople-. На примере...   30.05.2005 21:30
Reople   Ладно. ВОт шаблон (уреза вроде все, а проблему ост...   31.05.2005 8:38
-reople-   Значит мне удалось выяснит следующие: 1) Функция ...   31.05.2005 21:18
-reople-   Народ просил исходники - я дал их. Кажется, после ...   1.06.2005 13:09
hiv   Вот и все! Замени свой код:Procedure TMass.Job...   1.06.2005 13:50
-reople-   :) Молодец Hiv, долго думал? - наверно нет. Пока...   1.06.2005 14:56
hiv   Если по человечески - то если начал писать в ООП, ...   1.06.2005 15:08
-reople-   сделал методом - не помогает. Может у тебя получи...   1.06.2005 15:58
-reople-   Ну что, народ, сдались? Volvo и ты тоже? :huh:   1.06.2005 17:39


Closed Topic Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.06.2025 2:17
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"