определить, какой тип переменной используется

lordvampir

Premium
Joined
Dec 9, 2010
Messages
35
Reaction score
10
есть такая задача (с подобной задачей я встречаюсь впервые, поэтому нахожусь в ступоре :( ). существует такое абстрактное понятие, как "поток данных". это может быть как простой string или UnicodeString/AnsiString, а так же array of char, или же вообще array of byte или даже array of integer (cardinal/word/etc); да в общем всё, что похоже на один из приведённых вариантов. необходимо определить какой размер (в байтах) или (хотя бы) какой базовый тип (byte/integer/word/char/etc) имеет базовый элемент этого потока. заголовок функции имеет примерно такой вид: function MyFunc(Data: Pointer): Byte; в эту функцию передаётся сам поток данных, результатом является размер элемента.

примеры:
если передаётся UnicodeString, результат будет 2 (символ в этой строке имеет размер 2 байта)
если - AnsiString, результат - 1
если - array of byte, результат - 1
если - array of integer, результат - 4
etc

создавать множество overload-функций не хотелось бы, так как тип потока может быть совершенно не предсказуемый, а количество вариантов достаточно много; ограничивать в выборе так же не хотелось бы...

заранее спасибо
 

MoonFox

New member
Joined
May 10, 2006
Messages
2
Reaction score
0
Location
Россия, Москва
Если в самом входном потоке данных нет информации о типе данных, никак Вы его определить не сможете, т.к. Pointer - это просто нетипизированный указатель на что угодно. Передавайте в начале потока тип данных - и задача будет решена.
Не путайте с динамическими массивами и длинными строками: они хранят дополнительно количество элементов и счетчик референсов, но не тип элементов.
 

lordvampir

Premium
Joined
Dec 9, 2010
Messages
35
Reaction score
10
^ спасибо за совет, будем пробовать...
 

vogel

Member
Joined
Nov 11, 2008
Messages
6
Reaction score
6
Age
35
А почему бы не воспользоваться Generic'ами ??
Сделать класс типа MyClass<T> в котором в качестве потока будет TList<T>
И методы которые будут работать с типом данных <T>
Тогда ты будешь беспокоиться о типе - только при инстанцировании класса, а внутри - тебе будет строго пофигу какие данные.
 

agent smith

New member
Joined
Jan 15, 2009
Messages
3
Reaction score
0
Если необходимо "узнавать" типы данных в потоке, что бы потом при чтении их правильно присваивать переменным или структурам, то в Delphi есть механизм, который способен заливать в поток целые структуры классов (даже списков из классов) и читать их потом обратно из потоков (файлов) автоматически. Этот механизм используется в Делфи уже давно для сохранения данных всех форм проектов.
Лично пользуюсь этим способом уже лет 10. Так что стоит обратить внимание на базовые Делфийские классы: TReader и TWriter. На их основе у меня собрано несколько своих модулей, которые использую, как паттерны во всех своих проектах.

Добавлено через 1 минуту
Если будет интерес, то отпишитесь в этот пост, и я вышлю пару главных модулей и небольшое описание к ним.
 
Last edited by a moderator:
Top