Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-12697
Zergling
2003-04-23 06:26
2003.05.05
Копия динамического массива


14-12912
Val
2003-04-16 19:12
2003.05.05
Помогите найти шаманов TChart а


14-12886
Ron Wilson
2003-04-16 18:33
2003.05.05
ну помогите что ли! как, зная x и y из TDBGrid ...


3-12668
Sergey
2003-04-16 15:32
2003.05.05
QucikReport и ЕTQrPreview


7-12947
tv
2003-03-14 10:43
2003.05.05
Пропала возможность ввода на немецком языке





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский