Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-38958
Andrey V
2004-02-03 20:03
2004.02.13
Минимизация


1-38896
M!h
2004-02-04 15:13
2004.02.13
COM-технология


14-39038
Nick-From
2004-01-26 02:42
2004.02.13
Прога учета трафика на компах в интернет кафе


11-38762
Кладов
2003-05-27 21:47
2004.02.13
Версия 1.74 дождалась своего часа (в смысле моего отпуска)


1-38830
Yr2
2004-02-02 14:34
2004.02.13
Low-pass filter





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский