Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
ВнизКак из функции вернуть значение произвольного типа ? Найти похожие ветки
← →
NTDim (2004-02-04 08:10) [0]Как из функции вернуть значение произвольного типа ?
← →
Beat (2004-02-04 08:20) [1]Как это произвольного??? Юзай перегрузку функций.
← →
Кщд (2004-02-04 08:29) [2]variant
← →
Anatoly Podgoretsky (2004-02-04 09:15) [3]Никак, ты не сможешь описать такую функцию. Представь нам описание такой функции.
Кщд (04.02.04 08:29) [2]
Это уже значение определенного типа - variant
← →
Reindeer Moss Eater (2004-02-04 09:18) [4]type
TArbitrary = variant;
function MyFunc : TArbitrary;
begin
end;
← →
Digitman (2004-02-04 09:31) [5]
> NTDim (04.02.04 08:10)
> Как из функции вернуть значение произвольного типа ?
никак.
компилятор Паскаля не допускает таких вольностей
← →
Beat (2004-02-04 09:39) [6]Вот вот, а varint - это объект, т.е. конкретный тип.
← →
Reindeer Moss Eater (2004-02-04 09:40) [7]Зато TArbitrary - произвольный тип.
← →
Beat (2004-02-04 09:42) [8]Не произвольный, а "типа" Variant!
← →
Reindeer Moss Eater (2004-02-04 09:45) [9]Сначала надо определиться, что такое произвольный тип.
"Arbitrary" [анг] = "произвольный"
TArbitrary - произвольный тип
← →
Beat (2004-02-04 09:46) [10]Хе-хе, ну если так, то ладно... :)))
← →
SammIk (2004-02-04 09:55) [11]Народ, а про указатели забыли???
Можно вернуть указатель на область памяти,
где лежит что угодно, хоть тебе баит, хоть какая структура
Это уж тебе разбираться на что будет возвращен указатель.
Или я не то сказал, если что поправте. Пожалуиста
← →
AKul (2004-02-04 09:56) [12]
> NTDim (04.02.04 08:10)
Если функция может возвращать любые данные, то можно возвращать безтиповый указатель на эти данные (Pointer).
Можно вообще воспользоваться ассемблерными вставками: функцию объявить как процедуру, результат возвращать через ассемблерную вставку, например, в EAX. Вызывать опять же придется как процедуру, а после вызова работать с результатом в ассемблерной вставке. - НО ЭТО ПОЛНЕЙШИЙ ИЗВРАТ (тогда уже проще на ассемблере писАть).
Но в любом случае: как узнать, какой тип вернула эта функция, ведь он же произвольный??????? - придется возвращать структуру (указатель на нее), одно из полей которой содержит определение этого типа.
Может Вы не знаете, но существует такая возможность,как переопределение типов, например, из типа Char можно свободно сделать Integer или Pointer.
Может это Вам поможет?
← →
Erik (2004-02-04 09:57) [13]А зачем это надо? Может сделать процедуру и передавсть туда поитер, а дальже привести к желаемому тиру и заполнять значениями. Вобще опиши задачу.
← →
Reindeer Moss Eater (2004-02-04 09:58) [14]Функция возвращающая указатель - возвращает тип POINTER
Это не произвольный тип
← →
Beat (2004-02-04 09:58) [15]КАК ты вернешь ссылку на данные в стеке - после вызова функции стек под данные функции очищается, можно использовать динамические - но это не то.
← →
AKul (2004-02-04 10:22) [16]
> Beat © (04.02.04 09:58) [15]
А где упоминалось об возврате указателя на локальные данные?
И почему: "динамические это не то"? Кроме того, можно организовать передачу данных через глобальные переменные. Можно передавать указатель на данные на входе в функцию (что и делает компилятор, когда функция возвращает данные типа структур).
Короче говоря, вариантов много, но что нужно автору вопросу - остается загадкой....
Да и стек под данные функции не очищается, а освобождается, но это я уже придираюсь (так же как и Вы) :)
← →
Beat (2004-02-04 10:30) [17]Хе:
_вопрос был как написать ФУНКЦИЮ возвращающую а не процедуру (с указателем)_
глобальные переменные и прочее никак не вписываются сюда..
з.ы. насчет придирок - я тороплюсь, уходить надо, потому и пишу может быть не совсем понятно.
← →
AKul (2004-02-04 11:00) [18]
> Beat © (04.02.04 10:30) [17]
> _вопрос был как написать ФУНКЦИЮ возвращающую а не процедуру
> (с указателем)_
Фактически, функция, которая возвращающает структуру, - это процедура, которой передается указатель на структуру, в которою будет записан результат. Можешь проверить дизассемблером. Например, процедура, написанная в DLL, может иметь прототип
procedure GetRecord(var R:TSomeRecord);stdcall;
Думаю, ничего не измениться, если при использовании объявить ее как
Function GetRecord:TSomeRecord;stdcall;
Тот же самый фокус пройдет и с процедурными переменными.
> глобальные переменные и прочее никак не вписываются сюда..
Это почему? Что мешает, например, записать результат в какой-нибудь глобальный буфер, а возвратить тип этого результата, который и будет называться "произвольным".
P.S. Может автор вопроса просто не знал о переопределение типов, или переопределении процедур и функций.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.011 c