Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизЗагадочный system Найти похожие ветки
← →
vertal © (2004-05-23 02:09) [0]Что из себя представляют функции , определенные в модуле system?
(Речь не о Break или continue , а о "нормальных" функциях).В частности , почему не работает
Var
p:Pointer;
Begin
p:=@cos;
...
← →
Ihor Osov'yak © (2004-05-23 03:30) [1]часть из них "functions & procedures that need compiler magic "
втч cos aka procedure _COS;
← →
Юрий Зотов © (2004-05-23 05:00) [2]> vertal © (23.05.04 02:09)
Такие функции - это стандартная библиотека языка. То есть, подпрограммы, заведомо и всегда известные компилятору. Их реальные имена могут отличаться от тех, под которыми они описаны в документации.
← →
vertal © (2004-05-23 12:43) [3]> Такие функции - это стандартная библиотека языка.
Это как раз понятно , хотя вообще-то по-моему правильнее оставить язык программирования только языком с "голым" синтаксисом , а если необходимо использовать какие-то функции , то подключать соотв. модули (так как я могу судить и сделано в C/C++), то есть как-то криво смотрится факт подключения по умолчанию system , даже если его и нет в Uses.
>Их реальные имена могут отличаться от тех, под которыми они описаны в документации.
А можно ли как-то все-таки получить адрес такой процедуры/функции (иногда требуется)?Я попробовал с несколькими функциями из system , но ни с одной не получилось. С другими модулями и моими функциями оператор @ работает без проблем.
← →
Anatoly Podgoretsky © (2004-05-23 12:52) [4]vertal © (23.05.04 12:43) [3]
Для Паскаля вообще то достаточно, поскольку включает ввод/вывод. Могли бы встроить, а часть встроена, напрямую в компилятор, но посчитали удобнее в отдельную библиотеку.
← →
Юрий Зотов © (2004-05-23 13:24) [5]> vertal © (23.05.04 12:43) [3]
> А можно ли как-то все-таки получить адрес такой
> процедуры/функции
Если не работает
P := @_cos
то вот "обходной маневр", который сработает железно:
function MyCos(X: extended): extended;
begin
Result := cos(X)
end;
P := @MyCos;
← →
vertal © (2004-05-23 15:01) [6]Видимо , только через такой обходной маневр и можно, хотя и криво
- идентификатор "_cos" компилятор не знает
← →
VMcL © (2004-05-23 15:12) [7]
function GetCosAddr: Pointer;
asm
mov eax, OFFSET System.@Cos
end;
← →
Petr V. Abramov © (2004-05-23 18:49) [8]>VMcL © (23.05.04 15:12) [7]
IMHO, минимум опасно.
до и после вызова System.@Cos компилятор вставляет команды обмена данными с сопроцессором. (на D6, по крайней мере)
← →
VMcL © (2004-05-23 20:39) [9]>>Petr V. Abramov © (23.05.04 18:49) [8]
Ну это уже проблемы программиста, рискнувшего использовать [7]. Пусть тогда руками укажет wait после вызова потенциально опасного косинуса.
← →
Юрий Зотов © (2004-05-23 22:33) [10]Не вижу, чем одна лишняя процедура в программе (MyCos) лучше или хуже другой лишней процедуры (GetCosAddr).
← →
vertal © (2004-05-24 00:17) [11]В принципе cos без посредников должен вызываться быстрее ,однако
GetCosAddr компилируется и отрабатывает , но при вызове
Type
Math_Funtion=Function(x:Extended):Extended;
Var
p:pointer;
Begin
p:=GetCosAddr;
writeln(Math_Funtion(p)(Pi));//error 207
End;
получаю runtime error 207
Я правильно понимаю , что cos принимает и возвращает аргументы типа Extended?
← →
Petr V. Abramov © (2004-05-24 03:34) [12]> vertal © (24.05.04 00:17) [11]
> Я правильно понимаю
Неправильно
см.
Юрий Зотов © (23.05.04 13:24) [5]
Юрий Зотов © (23.05.04 22:33) [10]
VMcL © (23.05.04 20:39) [9]
и (примажусь) :)
Petr V. Abramov © (23.05.04 18:49) [8]
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.035 c