![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Код:
type TH400 = record //описываем заголовок файла b1,b2,b3:longint; b4,b5,b6,b7,b8,b9, b10,b11,b12,b13,b14, b15,b16,b17,b18,b19, b20,b21,b22,b23,b24,b25,b26,b27:word; end; THeadTras = record //описываем заголовок одной трассы b1,b2,b3,b4,b5,b6,b7:longint; b8,b9,b10,b11:word; b12,b13,b14,b15,b16,b17,b18,b19:longint; b20,b21:word; b22,b23,b24,b25:longint; b26,b27,b28,b29,b30,b31,b32,b33,b34,b35,b36,b37, b38,b39,b40,b41,b42,b43,b44,b45,b46,b47,b48,b49, b50,b51,b52,b53,b54,b55,b56,b57,b58,b59,b60,b61, b62,b63,b64,b65,b66,b67,b68,b69,b70,b71:word; b72,b73,b74,b75,b76,b77,b78,b79:longint; b80,b81,b82,b83,b84,b85,b86,b87,b88,b89,b90,b91,b92,b93:word; end; THTras = record //описываем трассу, что состоит из заголовка и массива данных HeadTras:THeadTras; Data: array[1..1000] of single; end; TFN = record // описываем ту часть файла, которая образует суть сейсмограммы и может повторятся несколько раз Tras: array of THTras; end; TForm1 = class(TForm) S1: TStringGrid; S2: TStringGrid; S3: TStringGrid; Button1: TButton; O1: TOpenDialog; E1: TEdit; E2: TEdit; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} function SwapDWorD(X:DWord):dword;assembler; //функция для свопа 32х битного целого цисла asm bswap eax end; procedure TForm1.Button1Click(Sender: TObject); var F : TFILEStream; // переменная для связи с файлом H400 : TH400; // переменная для заголовка файла FN : TFN; // переменная для сбора всех трас сейсмограммы //seg : array[1..2] of TFN; i,j,k,index:integer; //счетчики l:real; // для хранения кол-во FN buf:single; // дальше для свопа чисел с плавающей точкой IEEE dd:array [0..3] of byte absolute buf; temp:byte; begin IF O1.Execute then f:=TfileStream.Create(o1.FileName,fmOpenRead,fmShareDenyNone); f.seek(3200,soFromcurrent); f.Read(H400,sizeof(TH400)); //считываем заголовок файла s1.Cells[1, 1]:=INTtostr(swapdword(H400.b1)); s1.Cells[1, 2]:=INTtostr(swapdword(H400.b2)); s1.Cells[1, 3]:=INTtostr(swapdword(H400.b3)); s1.Cells[1, 4]:=INTtostr(swap(H400.b4)); s1.Cells[1, 5]:=INTtostr(swap(H400.b5)); s1.Cells[1, 6]:=INTtostr(swap(H400.b6)); s1.Cells[1, 7]:=INTtostr(swap(H400.b7)); s1.Cells[1, 8]:=INTtostr(swap(H400.b8)); s1.Cells[1, 9]:=INTtostr(swap(H400.b9)); s1.Cells[1,10]:=INTtostr(swap(H400.b10)); s1.Cells[1,11]:=INTtostr(swap(H400.b11)); s1.Cells[1,12]:=INTtostr(swap(H400.b12)); s1.Cells[1,13]:=INTtostr(swap(H400.b13)); s1.Cells[1,14]:=INTtostr(swap(H400.b14)); s1.Cells[1,15]:=INTtostr(swap(H400.b15)); s1.Cells[1,16]:=INTtostr(swap(H400.b16)); s1.Cells[1,17]:=INTtostr(swap(H400.b17)); s1.Cells[1,18]:=INTtostr(swap(H400.b18)); s1.Cells[1,19]:=INTtostr(swap(H400.b19)); s1.Cells[1,20]:=INTtostr(swap(H400.b20)); s1.Cells[1,21]:=INTtostr(swap(H400.b21)); s1.Cells[1,22]:=INTtostr(swap(H400.b22)); s1.Cells[1,23]:=INTtostr(swap(H400.b23)); s1.Cells[1,24]:=INTtostr(swap(H400.b24)); s1.Cells[1,25]:=INTtostr(swap(H400.b25)); s1.Cells[1,26]:=INTtostr(swap(H400.b26)); s1.Cells[1,27]:=INTtostr(swap(H400.b27)); l:=(f.Size-3600)/(240*swap(H400.b4)+4*swap(H400.b8)*swap(H400.b4)); //узнаем кол-во сейсмограмм. // для этого из всего //объема файла вычитаем его не повторяющиеся заголовки и делим на //повторяющуюся часть e1.Text:=Floattostr(l); s2.RowCount:=94; // для таблицы задаем ее свойства s2.ColCount:=swap(H400.b4)+1; //кол-во трасс храниться в переменной Н400.b4 s3.RowCount:=swap(H400.b8)+1; // кол-во дискретов, воборки хранится в переменной H400.b4 s3.ColCount:=swap(H400.b4)+1; f.Seek(340,soFromcurrent); //заголовок файла, который мы считываем //объемом 400 байт, а мы считали только 60, поэтому переводим курсор //на нужную позицию // for index :=1 to 2 do begin SETLength(fn.Tras,swap(H400.b4)); f.Read(fn,sizeof(fn)); //читаем в структуру FN переодическую часть for k:=0 to swap(H400.b4)-1 do begin //запускаем счетчик, чтобы вывести данные заголовка трассы в соответствующие ячейки таблицы s2.Cells[k, 1]:=INTtostr(swapdword(fn.tras[k].HeadTras.b1)); ...................................................................................... s2.Cells[k, 7]:=INTtostr(swapdword(fn.tras[k].HeadTras.b7)); s2.Cells[k, 8]:=INTtostr(swap(fn.tras[k].HeadTras.b8)); ........................................................................................ s2.Cells[k,11]:=INTtostr(swap(fn.tras[k].HeadTras.b11)); s2.Cells[k,12]:=INTtostr(swapdword(fn.tras[k].HeadTras.b12)); ........................................................................................ s2.Cells[k,19]:=INTtostr(swapdword(fn.tras[k].HeadTras.b19)); s2.Cells[k,20]:=INTtostr(swap(fn.tras[k].HeadTras.b20)); s2.Cells[k,21]:=INTtostr(swap(fn.tras[k].HeadTras.b21)); s2.Cells[k,22]:=INTtostr(swapdword(fn.tras[k].HeadTras.b22)); ........................................................................................ s2.Cells[k,25]:=INTtostr(swapdword(fn.tras[k].HeadTras.b25)); s2.Cells[k,26]:=INTtostr(swap(fn.tras[k].HeadTras.b26)); ............................................................................... s2.Cells[k,93]:=INTtostr(swap(fn.tras[k].HeadTras.b93)); for j:=1 to swap(H400.b8) do begin //свопируем данные выборки buf:=fn.tras[k].data[j]; for i:=0 to 1 do begin temp:=dd[i]; dd[i]:=dd[3-i]; dd[3-i]:=temp; end; s3.Cells[k,j]:=floattostr(buf); //каждой ячейке таблицы присваиваем соответсвующее значение выборки fn.tras[k].Data[j]:=buf; // заменяем данные на свопированные end; end; // seg[index]:=fn; //здесь хотелось бы прочитать второй fn, но что бы я для этого не делал результат - либо стек перегружен, либо аксес виолейшен:( // end; f.Free; end; end. ![]() |
#2
|
||||
|
||||
![]() Нельзя так работать с динамичискими массивами, копируй область памяти.
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
|||
|
|||
![]() но я пока с ними не работаю. а что значит копировать область памяти?
|
#4
|
||||
|
||||
![]() Цитата:
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#5
|
|||
|
|||
![]() а как это применить к моему коду? я не совсем понимаю. может есть литература на эту тему, посоветуйте.
|
#6
|
||||
|
||||
![]() Я литературы не знаю, но ябы твой файл читал потоком и заполнял из него структуры. А дальше все как по маслу.
ЗЫЖ а действительно record, а не packed record? Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#7
|
|||
|
|||
![]() а я разве не так делаю?
я что-то читал про классы, которые могут хранить списки структур. не знаю относится это к моему случаю или нет. |
#8
|
||||
|
||||
![]() Я тчто-то читал про изготовление деталей порошковым методом, но я не знаю как, а порошок у меня есть, подскажите... а...?
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#9
|
|||
|
|||
![]() офигеть шутка, смеялся пол часа. а по существу есть что сказать?
|
#10
|
||||
|
||||
![]() Просто же, кто создает файл - это для начала, а то у тебя слишком страшные структуры... Если сам - то зачем такое, если не сам - то протокол покажи. Реально интересная задача, но зачем ты ее через ж№;% решаешь?
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#11
|
|||
|
|||
![]() если в двух словах то файл формата segY состоит из: текстового заголовка 3200 байт в формате EBCDIC, затем идет заголовок файла 400байт в котором хранится или может хранится полезная инфа о файле, данных, формате данных, затем идет заголовок трассы и после него данные трассы, затем снова заголовок второй трассы, затем данные второй трассы. итд. набор этих трасс составляют сейсмограмму. одна сейсмограмма состоит из конечного числа трасс. в моем случае из 161 трассы. в файле нет никакого разделения на сейсмограммы. т.е если в файле записаны две сейсмограммы, то там просто будут записаны 322 трассы. я хочу прочитывать этот файл и разделять данные на соответствующие сейсмограммы. таких сейсмограмм в файле может быть порядка 500-1000. т.е 161000трасс. и каждая имеет свой заголовок и данные. трасса - это зарегистрированные колебания во времени
|
#12
|
|||
|
|||
![]() Вообще, есть подозрение, что где-то в заголовках есть информация о кол-ве сейсмограмм и трасс, либо просто длинна данных. Соответсвенно, тебе надо считать соотв. заголовок и посмотреть внутри него нужные значения. Это раз.
Два. Для разных коллекций объектов существуют разные списки: TList (если у тебя указатели)? TObjectList (если данные у тебя представлены объектами), TCollection (ну тут тоже объекты и, наверное, тебе это уже не надо - там идет кастомизация типа объекта + нужные методы для среды Дельфей). |
#13
|
|||
|
|||
![]() совершенно правильные подозрения. эти данные я и считываю из заголовков. и прочитать первую сейсмограмму т.е набор из 161 трассы не представляет сложностей. они возникают если я пытаюсь прочитать вторую сейсмограмму, т. е второй набор из 161 трассы
|
#14
|
|||
|
|||
![]() а что означает конверт со стрелочкой
|