Доброго времени суток, уважаемые эксперты. Появился у меня вопрос... Допустим есть такое описание. Смотрите в приложении. Так вот - как вызвать процедуру из переменной а? Просто a^; не проходит. Проходит asm call a end; но по определенным причинам хотелось бы обойтись без асма. Заранее благодарен за ответ. X-RayMan.
Здравствуйте, X-RayMan! Процедурные типы, однако! :-) Для вызова процедуры не нужно разыменовывать указатель! Т.е. основная процедура должна выглядить так:
begin a := @p; proc (a); { преобразование типа обязательно! } end.
Ответ отправлен: 18.03.2004, 11:19 Отправитель: Ayl Отвечает Tancho
Приложение: Ответ отправлен: 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.