Форум: "Основная";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];
ВнизКак менять размер массива, являющегося полем записи Найти похожие ветки
← →
AlexOld (2003-04-20 10:12) [0]Уважаемые мастера!
Можно ли устанавливать размер массива, который является полем записи. Дельфи запрещает использовать в вариантной части массива типы с управляемым времененм жизни. Конкретно:
type
InRec = record
InAr: array[0..Height,0..Width] of word;
....................
end;
Очень бы хотелось Height и Width устанавливать или менять в ходе работы приложения.
← →
Guerrilero (2003-04-20 10:21) [1]ищи в справке Multidimensional dynamic arrays
← →
AlexOld (2003-04-20 15:41) [2]К сожалению, динамические массивы нельзя использовать в record.
← →
Anatoly Podgoretsky (2003-04-20 16:00) [3]К счастью можно
← →
anod (2003-04-20 16:09) [4]AlexOld
Отлично работает
type a=record
b:array of integer;
end;
var k:a;
SetLength(k.b,10);
← →
shodan (2003-04-20 16:14) [5]Все делается, как обычно, но сохранять нужно в нетипизированный файл, отдельно задавая размер, и т.д.
P.S.
Проверял – работает
← →
Palladin (2003-04-20 16:19) [6]при чем тут файлы
← →
Snap (2003-04-20 16:29) [7]Просто к слову. Есди и получится записать такую запись в типизированный файл, то результат будет непредскауем.
← →
shodan (2003-04-20 18:06) [8]Правильно Snap!
Некоторые просто не думают с шагом вперед....
← →
Palladin (2003-04-20 18:20) [9]а некоторые думают только на полшага...
написал бы тогда уж как сохранять в нетипизированный...
← →
Anatoly Podgoretsky (2003-04-20 18:25) [10]А зачем, про файлы даже и намека не было.
Может заодно рассказать и про базы, оле, сом
← →
AlexOld (2003-04-20 18:56) [11]Виноват, не туда смотрел. Действительно, запись с динамическим массивом проходит, но попытка объявить типизированный файл с этой записью пресекается:
type
InRec = record
InAr: array of array of word;
end;
procedure....
var
k:InRec;
begin
SetLength(k.InRec,100,200); //Все проходит
TipFile:file of InRec; // Здесь ошибка
Как-нибудь можно это обойти?
← →
Anatoly Podgoretsky (2003-04-20 19:00) [12]Естественно, даже если и удастся записать, то попытка чтений кончится плачевно, нет смысла читать-писать адреса.
Выход у тебя один, если надо записывай в файл, то отказ от типизированный файлов в пользу нетипизированных.
← →
Palladin (2003-04-20 19:07) [13]1 тебе не кажется что объявление файла немножечко не на том месте, это так к слову... здесь тут вам не си...
2 см TFileStream или Block{Read/Write}
← →
shodan (2003-04-20 19:35) [14]если не прикол, то слушай..
1. begin
SetLength(k.InRec,100,200); //Все проходит
TipFile:file of InRec; // Здесь ошибка
<< после begin не бъявляются типы, переменные
2. Зделать можно так:
var
MyFile : File; // нетипизированный
i:Cardinal;
begin
ReWrite(MyFile,1);
i:=Length(inrec.inar); //определили размер в одном измерении
BlockWrite(MyFile,I,SizeOf(i)); // записали размер в файл
if i > 0 then
for a:=0 to Length(inrec.inar)-1 do
begin
i:=Length(inrec.inar[a]); // определили размер массива по другим измерениям
BlockWrite(MyFile,I,SizeOf(i)); // записали размер в файл
end;
....
reset(myfile,1);
BlockRead(Myfile,i,Sizeof(i));
if i > 0 then
begin
SetLength(inrec.inar,i);
for a:=0 to Length(inrec.inar)-1 do
begin
BlockRead(Myfile,i,Sizeof(i));
SetLength(inrec.inar[a],i);
end;
end;
приблизительно так
← →
AlexOld (2003-04-21 07:18) [15]Спасибо всем!
Надо было сразу сказать, что я считываю из файла цифровой ТВ-сигнал разного формата и большого объема, каждое поле которого содержит еще и дополнительную служебную информацию. Поэтому удобно было пользоваться типизированным файлом. Теперь понятно, что нужно объявлять его нетипизированным и считывать блоками отдельно видео и служебную. Shodan"у отдельная благодарность.
← →
Anatoly Podgoretsky (2003-04-21 13:11) [16]AlexOld (21.04.03 07:18)
Это как, в типизированном файле все записи одного типа и естественно одинаковой длины, то что ты описываешь это нетипизированный файл, с записями переменной структуры и длины.
Вот для заголовков записей можно создать типы для удобства.
← →
AlexOld (2003-04-21 15:43) [17]Anatoly Podgoretsky © (21.04.03 13:11)
Структура файла такая: всего N кадров, каждый из двух полей одинакового размера - нечетного и четного (чересстрочная развертка). В каждом поле после видеоинформации (например, 288х768х12) несколько байт служебной информации (здесь поля записи неоднородные: № кадра, дата, время, температура и т.д.). Каждый файл имеет одинаковый формат, но он может меняться от файла к файлу.
← →
Anatoly Podgoretsky (2003-04-21 15:54) [18]Размер то одинаковый?
← →
AlexOld (2003-04-21 16:00) [19]Anatoly Podgoretsky © (21.04.03 15:54)
Размеры файлов разные.
← →
Anatoly Podgoretsky (2003-04-21 16:37) [20]AlexOld (21.04.03 16:00)
Да не файлов а записей, нужна одинаковая структура и соотвественно размер каждой записи, а количество записей роли не играет
← →
AlexOld (2003-04-21 17:35) [21]Anatoly Podgoretsky © (21.04.03 16:37)
Для каждого поля строго определенный размер записей, и он одинаков для всех полей.
← →
Anatoly Podgoretsky (2003-04-21 17:37) [22]Тогда подходят типизированные файлы, а как определяется тип файла, ты писал, что их несколько и приведи формат записи
← →
AlexOld (2003-04-21 18:23) [23]Anatoly Podgoretsky © (21.04.03 17:37)
От ТВ камеры идет цифровой поток и записывается в файл по полям. Размер поля (привожу для одного формата) 288х768х12бит. Далее к каждому полю пишется служебная информация: № кадра (Cardinal), номер поля (Byte), время (Cardinal) и т.д. - для примера достаточно. Записывается в файл как непрерывный цифровой поток. Отдельным файлом сообщается число записанных кадров, т.е. размер.
Но ведь читать такой файл как типизированный не проходит, если массив в записи динамический, разве не так?
← →
Snap (2003-04-21 18:28) [24]К слову типизированные файлы и при маленьких размерах записей и при больших размерах самих файлов работают раз в 10 медленней нетипизированных.
← →
AlexOld (2003-04-21 18:43) [25]Anatoly Podgoretsky © (21.04.03 17:37)
От ТВ камеры идет цифровой поток и записывается в файл по полям. Размер поля (привожу для одного формата) 288х768х12бит. Далее к каждому полю пишется служебная информация: № кадра (Cardinal), номер поля (Byte), время (Cardinal) и т.д. - для примера достаточно. Записывается в файл как непрерывный цифровой поток. Отдельным файлом сообщается число записанных кадров, т.е. размер.
Но ведь читать такой файл как типизированный не проходит, если массив в записи динамический, разве не так?
← →
Anatoly Podgoretsky (2003-04-21 18:56) [26]Snap © (21.04.03 18:28)
К слову работает на многие порядки быстрее, при произвольном порядке доступа и практически одинаково при последовательном.
Типизированные файлы впервую очередь созданы для удобства и ускорения работы.
Нетипизированные тогода, когда нельзя обойтись типизироваными, поскольку они обеспечивают низкоуровневый доступ на понятии байт.
AlexOld (21.04.03 18:43)
Тебе нужен примерно следующий тип
Type
TFrame = Record
KadrNumber: Cardinal;
FieldNumber: Byte;
KadrTime: Cardinal;
Kadr: array[1..288, 1..768] of Word;
end;
var
Frame: file of TFrame;
← →
AlexOld (2003-04-21 19:06) [27]Anatoly Podgoretsky © (21.04.03 18:56)
Спасибо, но я так и делал. Просто хотел не создавать exe-файл для каждого формата, а задавать его программно.
Для меня эта дискуссия была очень полезной. Спасибо всем.
← →
Anatoly Podgoretsky (2003-04-21 19:19) [28]Тогда это разные ТИПЫ
Но кто мешает иметь их несколько или все таки перейти на нетипизированные файлы, если скорость не волнует и по задаче обработки подходит
← →
AlexOld (2003-04-21 19:31) [29]Anatoly Podgoretsky © (21.04.03 19:19)
Уже перехожу на нетипизированные. А для часто встречающихся форматов все-таки оставил екзешник с типизированными.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.05.05;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c