Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на языке Pascal


Информационный Канал Subscribe.Ru


RusFAQ.ru: Программирование на языке Pascal

Выпуск № 258
от 20.03.2004, 22:30

Администратор:
Имя: Sensey
URL: Информационный ресурс
ICQ: 105679124
Украина, Харьков
О рассылке:
Задано вопросов: 439
Отправлено ответов: 1608
Активность: 366.2 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Ayl
Статус: Профессиональный
Общий рейтинг: 116.59
[Подробней >>]
Tancho
Статус: Профессиональный
Общий рейтинг: 150.28
Телефон: сл. 0359 0391 65 631; 0359 0391 53 105
[Подробней >>]
Boriss
Статус: Профессиональный
Общий рейтинг: 155.08
URL: Программирование на Паскале
[Подробней >>]
 
sir henry
Статус: Профессиональный
Общий рейтинг: 158.59
[Подробней >>]
Strory
Статус: Доверительный
Общий рейтинг: 156.89
[Подробней >>]
Vitally
Статус: Доверительный
Общий рейтинг: 140.5
[Подробней >>]
 
samum2000
Статус: Профессиональный
Общий рейтинг: 132.48
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 433. Доброго времени суток, уважаемые эксперты. Появился у меня вопрос... Допустим есть такое описание. С... (ответов: 7)

Вопросов: 1, ответов: 7


 Вопрос № 433

Доброго времени суток, уважаемые эксперты.
Появился у меня вопрос...
Допустим есть такое описание. Смотрите в приложении.
Так вот - как вызвать процедуру из переменной а?
Просто a^; не проходит.
Проходит asm call a end; но по определенным причинам хотелось бы обойтись без асма.
Заранее благодарен за ответ. X-RayMan.


Приложение:


Вопрос отправлен: 17.03.2004, 22:21
Отправитель: X-RayMan

[Следующий вопрос >>] [Список вопросов]

Отвечает Ayl

Здравствуйте, X-RayMan!
Процедурные типы, однако! :-) Для вызова процедуры не нужно разыменовывать указатель! Т.е. основная процедура должна выглядить так:

begin
a := @p;
proc (a); { преобразование типа обязательно! }
end.


Ответ отправлен: 18.03.2004, 11:19
Отправитель: Ayl


Отвечает Tancho

п”пѕп±яЂя‹п№ пґпµпЅяЊ, X-RayMan!
пђ я‚п°пє я‚пµп±пµ яѓяЃя‚яЂп°пёпІп°я‚яЊ ( яЃпјпѕя‚яЂпё пїяЂпёп»пѕп¶пµпЅпёпµ! )?

Приложение:

Ответ отправлен: 18.03.2004, 14:19
Отправитель: Tancho


Отвечает Boriss

Приветствую Вас, X-RayMan!
1) Ваша ошибка: Функция @ возвращает "полный" адрес, то есть, сегмент и смещение в этом сегменте. А для Вашей функции компилятор сформировал только смещение в сегменте кода. Простая прибавка FAR после имени функции все исправляет (см. в прилож.)
2) можно проще :)) -
asm
call _p
end

Приложение:

Ответ отправлен: 18.03.2004, 07:55
Отправитель: Boriss


Отвечает sir henry

Добрый день, X-RayMan!
У меня встречный вопрос: а Вы сами поняли, что наваяли? Это не упрек, просто попытайтесь разобраться в собственном коде. Для сравнения привожу Вам рабочий ко в приложении.

Приложение:

Ответ отправлен: 18.03.2004, 09:22
Отправитель: sir henry


Отвечает Strory

Добрый день, X-RayMan!
Поражён тем, что ни один эксперт так и не предложил работающий вариант с использованием _именно_ указателя на процедурный тип. Это _должно_ работать именно в том варианте, в котором предложил X-RayMan! И этот вариант работает на TMT Pascal. Самое интересное заключается в том, что процедурный тип придумали в Borland, а сделать по-человечески не смогли. Руки у них не оттуда растут!!!
Ещё раз повторяю. На TMT Pascal всё работает! И никакой ошибки в варанте X-RayMan нет, а есть ошибка природы в том, что есть Borland...
Задумки Borland работают везде, но только не у них самих. А это всё потому, что люди там работают творческие, которые могут придумывать самые интересные и полезные дополнения к языку, но которые абсолютно безграмотны в программировании, или которые совершенно не любят тестировать своё программное обеспечение (ещё бы такую гадость тестировать...).
Остаётся только разочарованно развести руками :(
К экспертам:
Что Вы раскричались на парня (цитирую: "а Вы сами поняли...")? Ведь он эксперементирует с языком. А без практики программистом не станешь. Таких бы как он, да в корпорацию Borland, может и багов по-меньше было...

Ответ отправлен: 18.03.2004, 14:48
Отправитель: Strory


Отвечает Vitally

Добрый день, X-RayMan!
А зачем такие сложности?
Type proc=procedure;
Var a:proc;
будет достаточно. "а" уже является указателем. А чтобы вся эта бадяга работала, нужно включать опцию Force Far Calls или {$F+}. Тогда:
Procedure pr;
Begin
Writeln('1234');
end;
Begin
a:=pr;
a;
end;

Ответ отправлен: 18.03.2004, 17:25
Отправитель: Vitally


Отвечает samum2000

Приветствую вас,X-RayMan!
Попробуй так:
type
pProc=^proc;
proc=procedure;
var a: pProc;
procedure _p; far; {<--надо компилировать с расчетом на дальнюю модель памяти}
begin
writeln('1234');
end;
begin
a^:=_p;
a^;
end.
--------------------------
-=Experts helper: testmode=-

Ответ отправлен: 19.03.2004, 11:40
Отправитель: samum2000



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (26)
C / C++ (19)
Perl (4)
Builder / Delphi (19)
Pascal (22)
Basic / VBA (8)
Java / JavaScript (7)
PHP (14)
Криптография (7)
WinAPI (15)
Радиоэлектроника (8)
Пользователю
Windows 95/98/Me (44)
Windows NT/2000/XP (57)
"Железо" (35)
Поиск информации (21)
Администратору
Windows NT/2000/XP (27)
Linux / Unix (13)
Юристу
Гражданское право (13)
Семейное право (12)
Трудовое право (12)
КоАП (9)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу


В избранное