Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.02.2014, 12:21   #1
[DisAssembleR]
Пользователь
 
Регистрация: 30.06.2011
Сообщений: 28
Сообщение Динамический массив и записи произвольной длины (Delphi)

Доброго времени суток, товарищи.

Недавно задался вопросом: существует ли возможность записи данных типа Packed Record (или просто Record) в динамический массив?
Насколько я разобрался, если длина данных фиксирована, то такое возможно реализовать. Но как быть, если длина данных произвольная?
Юзать TStream или все-таки есть возможность записать даннные произвольной длины массивом?

Чтобы было что-то наподобие:
A[0].Text := 'Text';
A[1].Text := 'Text_1';
A[2].Text := 'Text'_1_2;


Я думал записывать сначала "шапку"(1), состоящую из самого массива, имеющего указатели на данные, но способ немного громоздкий, поэтому интересуюсь есть ли возможность писать данные произвольного размера прямо в массив или нет?

(1)
"Шапка":
A[0] := 10;
A[1] := 15;
A[2] := 20;


Сами данные:
A0 := 'Text';
A1 := 'Text_1';
A2 := 'Text_1_2';



Кода никакого не прошу, просто подтолкните в каком направлении копать, либо может упустил чего.

Заранее спасибо.
[DisAssembleR] вне форума Ответить с цитированием
Старый 03.02.2014, 12:46   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как быть, если длина данных произвольная?
А как ты произвольную длину вообще в Record засунул? О_о
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.02.2014, 12:58   #3
[DisAssembleR]
Пользователь
 
Регистрация: 30.06.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А как ты произвольную длину вообще в Record засунул? О_о
да, сформулировал невнятно, конечно. Хотел сказать, что имеем это:
Код:
type
  TFileHeader= Packed Record           
  sNameSize: LongInt;        
  sName: WideString;         
  sAuthorSize: LongInt;          
  sAuthor: WideString;          
end;
и можно ли "это" присвоить элементу массива и записать целиком как массив?

Сейчас для строки произвольного размера я делаю так:

Сначала просто записываю массив, содержащий в себе размер строки.

Затем записываю саму строку:
Код:
procedure WriteHeadData(TF: TFileStream; const wtdData: WideString; wtdSize: LongInt); overload;
begin
if wtdSize > 0 then
  TF.WriteBuffer(wtdData[1], wtdSize*SizeOf(wtdData[1]));
end;
Вроде бы работает, но может есть иной путь?
[DisAssembleR] вне форума Ответить с цитированием
Старый 03.02.2014, 13:52   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

По прежнему не понимаю...
Ты это: http://ru.wikipedia.org/wiki/%D1%E5%...E7%E0%F6%E8%FF
хочешь сделать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.02.2014, 17:00   #5
[DisAssembleR]
Пользователь
 
Регистрация: 30.06.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
По прежнему не понимаю...
Ты это: http://ru.wikipedia.org/wiki/%D1%E5%...E7%E0%F6%E8%FF
хочешь сделать?
Не совсем. В планах сделать нечто, похожее на контейнер для данных. Данные могут иметь различный вид: текст, числа, дробные числа, картинки, все, что угоддно. И меня интересует реализация: возможно ли сделать так, чтобы данные записывались целиком массивом, без вычисления смещений в файле-носителе? То есть как это сделать с помощью потоков (TStream) я понял, но может есть возможность сделать это же с помощью динамического массива. Поясню еще разок.

Если есть сзапись фиксированного размера, то ее возможно записать в файл простым присовением n-го элемента массива.
Например запись такого вида:
Код:
type
  TFileHeader= Packed Record           
  sSize: integer;        
  sName: string[10];         
  sDataSize: integer;                
end;
запишется без проблем.
Я смогу выполнить это так:

Код:
  TFileData= array[1..10] of TFileHeader;
...
var
  TSA: TFileData;
...
for i:=1 to Length(TSA) do
begin
  TNC[i].sSize := 100;
  TNC[i].sName := 'FileName';
  TNC[i].sDataSize := 200;
end;
И легко это запишу в файл:
Код:
...
  TFileStream.WriteBuffer(TSA, SizeOf(TSA));
...
И в итоге получаем, что элемент А массива TSA содержит в себе все данные из записи.
Грубо это выглядит так: TSA[1] := sSize, sName, sDataSize;

Но как быть с данными произвольного размера?
Можно ли их присваивать элементам массива как в случае описанном выше, с использованием данных фиксированной величины?

Повторюсь: я понимаю, что можно писать сначала сам массив с данными фиксированного размера (например, с типами TDate, integer, LongInt, etc), а затем сами данные, но меня интересует как писать в каждый элемент массива данные произвольного размера?
[DisAssembleR] вне форума Ответить с цитированием
Старый 03.02.2014, 17:06   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Но как быть с данными произвольного размера?
По-моему нет какого-то универсального способа, учитывая что переменная может быть указателем. Я лично для таких записей описываю метод, который формирует стрим, для каждого типа отдельный. Кода больше зато я точно знаю что сериализация пройдет так как мне хочется.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.02.2014, 18:19   #7
[DisAssembleR]
Пользователь
 
Регистрация: 30.06.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
По-моему нет какого-то универсального способа, учитывая что переменная может быть указателем. Я лично для таких записей описываю метод, который формирует стрим, для каждого типа отдельный. Кода больше зато я точно знаю что сериализация пройдет так как мне хочется.
Жаль, но ладно.
Буду по-старинке делать: "шапка" - "тело" и т.д.
Спасибо за уделенное моему вопросу внимание
[DisAssembleR] вне форума Ответить с цитированием
Старый 03.02.2014, 18:21   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

XML не подходит?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.02.2014, 11:50   #9
[DisAssembleR]
Пользователь
 
Регистрация: 30.06.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
XML не подходит?
Полгаю, что в моей проблеме он не нужен
[DisAssembleR] вне форума Ответить с цитированием
Старый 05.02.2014, 13:20   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну почему же? Вполне и его можно использовать, даже если держать в памяти. Хотя я как-то с ним не особо дружу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива значений произвольной длины. sercher Помощь студентам 1 02.10.2012 22:34
одномерные массивы произвольной длины Александра Раш Паскаль, Turbo Pascal, PascalABC.NET 0 15.03.2012 14:08
умножение 2-х чисел произвольной длины с плавающей точкой Ferza Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 24.06.2009 19:24
сложение чисел произвольной длины Ferza Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 24.06.2009 11:16
Сортировка двумерного массива произвольной длины. Visual Basic Pekc Помощь студентам 0 25.11.2007 19:30