![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() ![]() |
![]() |
Reople |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 2 Пол: Мужской Репутация: ![]() ![]() ![]() |
Доброго времени суток, знаток 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 файл. {=============================================} {---------------------------------------------------------------------------------} Вот таким способом я передал функцию в процедуры построения графика. Немного короче было бы передать функцию так procedure DrawShedule(... f: TFunk ...); а вызов DrawShedule(... f ...); Но об этом разговор дальше. Так программа рабочая, я вставляю текст в виртуальный метод в другой программе {==============================================} Так Вот, Господа, приверженцы передачи имени процедуры с помощью типа в данном случае компилятор даже не захочет с вами общаться, Утверждая, Что то, что вы передаете в процедуру DrawShedule(... f ...) не указывает на область памяти, это про "f". Передавая указатель, как в данном случае я и написал, компилятор не может отследить этот факт и благополучно компилирует программу. Но, когда программа доходит до использования функции f - начинаются проблемы.... Они связанны с.....?? Это и есть мой вопрос. Мой рассуждения. У виртуального метода локальная функция хранится либо в стеке, либо в сегменте кода, поэтому компилятор не захочет передавать имя функции в качестве формального параметра, ведь он боится, что на этапе позднего связывания, он не сможет определить расположение функции. Рассуждения, как решить проблему: расположить код функции по конкретному адресу в памяти ( где-то тут $C000:0000 ) - Но как это реализовать? А еще может мои рассуждения просто чушь, Посему я и обратился к Вам! Тема покажет, какие тут программисты на форуме. p.s.s отдельная программа работает, как и при передаче имени функции, так и при передачи её адреса (как я написал). В виртуальном методе при передачи имени функции компилятор не захочет с вами иметь дело. А вот при передачи адреса он с вами будет дружить, он то будет, а вот процессор нет... Ну, ваши соображения, уважаемые пользователи форума! Не Забывайте я задал 2 вопроса Сообщение отредактировано: Oleg_Z - 29.05.2005 20:12 |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата <... Исходя из особенностей внутреннего представления множеств можно сделать два основных вывода: [...] - все операции над множествами выполняются значительно эффективней, чем над другими структурами данных> Полностью согласен... Неоднократно убеждался в этом на практике... Недостатки множеств - ограниченная емкость и невозможность обращаться напрямую к элементам множества... Что касается быстродействия - множества быстрее. :yes: Если найду программку - выложу... Цитата Тема покажет, какие тут программисты на форуме. Не зарывайтесь !!! ![]() Кстати, на форуме для кода есть теги, наличие которых Вы проигнорировали... Почему? |
-reople- |
![]()
Сообщение
#3
|
Гость ![]() |
Во-первых, выражаю вам благодарность Volvo за сообщение. Я проигнорировал теги, потому что посчитал, что мои тексты и культ розового в разных ипостасях.
Насчет не зарываться....хм.... только ТЫ, ответил.... и ТОЛЬКО НА ОДИН ВОПРОС!!!!!!! Увы, но приводя нормально компилирующие тексты, я отвлеку внимания читателя массой ненужных текстов, а тут я писал только то, что нужно. Тема ведь ТЕОРИТИЧЕСКИЕ ВОПРОСЫ??? причем тут то, что можно скомпилировать. Ещё, я нашел ответ на свой второй вопрос - очень интересный недостаток TURBO PASCAL выискался, однако! Volvo, задай себе вопрос : "ПОЧЕМУ на форуме, посвященному Turbo Pascal только я смог ответь и только на один из 2 вопросов". Люди давайте развиваться! И выкладывайте своё мнение!!!!! |
-reople- |
![]()
Сообщение
#4
|
Гость ![]() |
thx Oleg_Z. И вправду красиво получилось..... и что самое ГЛАВНОЕ, БЕз РОЗОВОГО!
p.s. ещё раз thx. - в частности зато, что ты мне показал, КАК нужно выкладывать исходники. |
Romtek |
![]()
Сообщение
#5
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 303 Пол: Мужской Реальное имя: Роман Репутация: ![]() ![]() ![]() |
Я так и не понял в чём проблема. Не получается вызвать процедуру из модуля, вставив адрес передаваемой процедуры f ?
Приводи рабочие исходники, а не свои доводы. Вот писал когда-то программу с использованием процедурных типов: type -------------------- Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата(-reople- @ 29.05.05 20:00) Volvo, задай себе вопрос : "ПОЧЕМУ на форуме, посвященному Turbo Pascal только я смог ответь и только на один из 2 вопросов". Ну, в таком случае - вот ответ на второй вопрос: Вся проблема в том, что функция F() описывается локально (вложенной в один из методов объекта). Именно пожтому и невозможно передать имя процедуры, а возможно - только ее адрес. Но неужели ничего нельзя сделать для того, чтобы программа заработала? Да можно конечно. Любой, кто сталкивался с объектами TurboVision сразу найдет связь между описанием функции F() и описанием тех функций, которые передаются как параметры, ну например в TGroup.ForEach(Action: Pointer), не так ли? Та же самая локальная процедура (функция), с директивой Far... Как заставить F() работать? Точно так же, как ForEach() заставляет работать Action: procedure TGroup.ForEach(Action: Pointer); assembler; |
AlienEmperor |
![]()
Сообщение
#7
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 160 Пол: Мужской Реальное имя: Серый Репутация: ![]() ![]() ![]() |
2 Reople: вот сейчас все брошу и буду над Вашими проблемами сидеть...
![]() Сам с такой проблемой не сталкивался (все-таки Turbo Pas сегодня - это скорее развлечение, а не работа), а сидеть и решать проблемы, которые самому на фиг не нужны - несколько не интересно... Говорит ли обо мне это как о плохом программисте ? Мое руководство так не считает. 2 Volvo: А разве на Turbo Pascal такая тема: Mov ECX,Smth прокатит ? Этож 32 разрядная операция ? Или я что-то не так понял ??? -------------------- Все в жизни ботва... Кроме пчел!
|
-Reople- |
![]()
Сообщение
#8
|
Гость ![]() |
Volvo ты самый ЛУЧШИЙ! БОЛЬШОЕ спасибо за реальный ответ, но увы, мне он не подходит...
1) О библиотеке TurboVision читаю (ни разу не от кого не слышал! - хотя эта норма для всех кто программирует) второй раз. 2) Из- за чего мне не понятны следующие операнды <TGroup.Last> <TView.Next> ( кажется методы объектов) 3) Я пишу 16р программу в которой по идее не используются расширенные регистры ECX и EBX (или я дятел, который чего-то не знает и долбит?) 4) TGroup.ForEach(Action: Pointer); assembler; - МЕТОД. Я же вызываю ПРОЦЕДУРУ из другого модуля в которую и передаю адрес локальной функции метода из которого и происходит вызов. Из твоего ответа я понял, что мне надо переписать ПРОЦЕДУРУ на асме? НО её я не перепишу на асме даже за 4 дня! (потому что я знаю недостаточно и мне придется копаться в книгах, а этого времени у меня нет). и к тому же пункт 3 Да, локальные подпрограммы могут иметь только ближний тип вызова - И ОНИ не могут внешними или иметь дальний тип вызова. - это ты прав, и это надо как-то исправить. Volvo, а ты можешь доступным (для дятлов типа меня) языком об'яснить, по какому принципу это заработает. Как метод узнает адрес функции, которую нужно вызвать и из-за чего с этим адресом надо что-то делать и, вообще, где хранится локальная функция виртуального метода. И возможно ли локальную функцию вирт.метода сделать внешней (external) { просто я переписал эту функцию на асме и сравнив код могу заявить, что она будет работать быстрее} Надеюсь на твой ответ, как на жизнь после смерти. Romtek, thx за ответ, но ответы типа делай как я, мне не помогут. Может у тебя ещё что-нибудь есть? |
Guest |
![]()
Сообщение
#9
|
Гость ![]() |
На чем писать руководство скажет на том и будешь, сказано TP - твоя задача сделать. Почему я не знаю библиотек Turbo Pascal? - потому что там, где не указывают я пишу на С++
|
-reople- |
![]()
Сообщение
#10
|
Гость ![]() |
последнее сообщение моё. про <руководство и С++>
|
Romtek |
![]()
Сообщение
#11
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 303 Пол: Мужской Реальное имя: Роман Репутация: ![]() ![]() ![]() |
Вот состряпал пример, надеюсь поможет (с указателем и без):
program Using_procedural_types; -------------------- Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
|
-reople- |
![]() ![]()
Сообщение
#12
|
Гость ![]() |
Romtek, thx - но это не поможет, это мы и сами умеем. - тут проблема в другом, в том, что функция "пропадает" по адресу в котором находилась. Она находится в сегменте кода вместе с методом, я передаю её адрес в другой модуль и в нем присваиваю локальной переменной (типа функция) её адрес, но когда идет вызов "новой" функции может произойти всё, что угодно.
|
Romtek |
![]()
Сообщение
#13
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 303 Пол: Мужской Реальное имя: Роман Репутация: ![]() ![]() ![]() |
Приведи всё же пример, гость -reople-.
На примере и поможем. -------------------- Romiras HomeLab- материалы и статьи по разработке ПО, моделирование алгоритмов, обработка и анализ информации, нейронные сети, машинное зрение и прочее.
|
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Цитата(-reople- @ 30.05.05 21:02) Она находится в сегменте кода вместе с методом, я передаю её адрес в другой модуль и в нем присваиваю локальной переменной (типа функция) её адрес :no: Не думай об этом... Для тебя то, что функция находится в сегменте кода СОВСЕМ не важно. В тот момент, когда ты передаешь адрес этой функции в свою процедуру виртуальный метод активен, следовательно он (ну и естественно все его локальные функции) загружается в стек... Вот об этом тебе нужно подумать... А вообще Romtek прав, прикрепил бы ты архив с программкой... |
Reople |
![]() ![]()
Сообщение
#15
|
Группа: Пользователи Сообщений: 2 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ладно. ВОт шаблон (уреза вроде все, а проблему оставил). Практикуйтесь и рассказывайте о результатах!
p.s. Файлы Глобальный допустимый размер: размер неограничен p.s.s Вы использовали 2.37кб места для присоединений к этому сообщению.Вам осталось 20мб для этого сообщения. xex) Прикрепленные файлы ![]() |
-reople- |
![]()
Сообщение
#16
|
Гость ![]() |
Значит мне удалось выяснит следующие:
1) Функция вызывается та, что надо 2) Параметры передаваемые функции теряются, не воспринимаются, как будто их просто нет. Может не происходит "pop x"(так нельзя писать, но смысл понятный) и его надо вручную сделать, через асму. 3) из 2) возможно не восстанавливается стек нашей вызываемой функцией и из-за этого дальнейшие проблемы. p.s. Только 4 человека решила попробывать свои силы? |
-reople- |
![]() ![]()
Сообщение
#17
|
Гость ![]() |
Народ просил исходники - я дал их.
Кажется, после этого народ умер... :molitva: ГДЕ ВЫ? |
hiv |
![]()
Сообщение
#18
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Вот и все! Замени свой код:
Procedure TMass.Job;на этот: Const rBuf: real = 15;Т.Е. определение твоей ф-ции F(x) ограничивалось пространством процедуры TMass.Job, а ты пытался ее вызвать вообще из другого места программы, вот стек и сбоил. Я ее вынес - и все заработало! -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
-reople- |
![]()
Сообщение
#19
|
Гость ![]() |
![]() Пока у тебя самый реальный ответ на мой вопрос, почему пока? теме разве не закрыта? Попытаюсь прояснить... Цитата("me") f:= rBuf * x { в этой функции я использую локальные описания TMASS.JOB } В методе TMASS.Job формируется указатель на ещё один массив pPolin^. Переносить локальные описания в секцию implementation - лучше застрелите меня. - Зачем тогда вообще ООП? Можно было перенести функцию f в модуль Polynom, и передавать в DrawShedule(pMassX, lX, pPolin, 30, 30, 580, 400); локальные данные, которые использует функция f - можно, но не положено. Потому, что процедура будет строить график только для полиномов, а может для всего (процедуру я писал универсальную). Возможны ошибки, так как к данным типа rBuff получают доступ все методы модуля, выше которых они описаны. (Придется писать все время в конце... это хорошо?) Цитата Т.Е. определение твоей ф-ции F(x) ограничивалось пространством процедуры TMass.Job Идея хорошая, но виртуальный метод активен и не завершил свою работу, когда вызывается функция f из модуля Polynom. Перед вызовом процедуры f из модуля Polynom я написал следующие:
НУ есть идей, как развить мысль? или как сделать по человечески? p.s. Интересно, сколько людей используют описания в секции implementation? |
hiv |
![]()
Сообщение
#20
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 660 Пол: Мужской Реальное имя: Михаил Репутация: ![]() ![]() ![]() |
Если по человечески - то если начал писать в ООП, то и пиши все в ООП. Т.е. твоя ф-ция наверняка будет тобой или еще кем-то меняться на свою, вот и определи ее как один из методов твоего объекта и сделай ее виртуальной, чтобы потом ее можно было перегружать. А то что ты ее хоть и прописал внутри своего виртуального метода, то вызвать ее можешь только находясь внутри него, а хочешь использовать ее еще где-то. Ты сам себе противоречишь!
Цитата Возможны ошибки, так как к данным типа rBuff получают доступ все методы модуля, выше которых они описаны. Так опиши rBuff как поле твоего объекта и тогда все методы будут иметь к нему доступ.Сообщение отредактировано: hiv - 1.06.2005 15:12 -------------------- Никогда не жадничай. Свои проблемы с любовью дари людям!
|
![]() ![]() |
![]() |
Текстовая версия | 19.06.2025 1:21 |