Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.05;
Скачать: CL | DM;

Вниз

Как менять размер массива, являющегося полем записи   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
3-12618
jocko
2003-04-15 15:16
2003.05.05
Как создать экземпляр TADOConnection внутри dll или потока


3-12665
Erden
2003-04-05 07:47
2003.05.05
Null-параметры


3-12635
admled
2003-04-15 20:36
2003.05.05
Печать из базы одной записи


1-12728
Rise
2003-04-23 11:36
2003.05.05
Событие OnClick


6-12849
Кролик
2003-03-08 14:58
2003.05.05
Подключение к сети