![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Помогите ответить на вопрос!
Как передать кол-во элементов массива в процессе работы программы. динамический массив в данном случае, как я считаю, не подойдет, так как массив используется в записи, и считка данных в запись происходит по размеру записи, и если сделать массив динамическим, то размер записи будет не правильным - 4 б Последний раз редактировалось Tonyy, 18.10.2010 в 05:12. |
#2
|
||||
|
||||
![]() А теперь еще раз и подробненько, откуда 4кб взялись, какая запись и т.д. Телепатов нема.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
![]() Извини страдалец не кило а просто 4 байта.
ситуация примерно такая: Код:
procedure TForm1.Button1Click(Sender: TObject); type TData = record diskret: array of single; end; var Data:TData; begin Setlength(data.diskret,1000); edit1.Text:=inttostr(sizeof(data)); end; по идее я объявляю переменную, через 4 байтный формат, затем передаю кол-во элементов 1000, ожидаю что моя переменная будет размером 4000байт (так оно и было бы если бы я описал статичный массив), но она всего 4. какие есть еще способы или хитрости передать кол-во элементов массива в ходе выполнения процедуры? может вместе с установкой кол-ва элементов динамического массива можно как то и объем памяти задавать? Последний раз редактировалось Tonyy, 18.10.2010 в 15:17. |
#4
|
||||
|
||||
![]() Код:
procedure bla(var dynarr: array of Single); var i: Integer; begin for i:=0 to Length(dynarr)-1 do dynarr[i]:=Random(100); end; procedure TForm1.FormCreate(Sender: TObject); var i: Integer; begin SetLength(diskret, 100); bla(diskret); for i:=0 to Length(diskret)-1 do Memo1.Lines.Add(FloatToStr(diskret[i])); end; Пишу программы за еду. __________________ |
#5
|
|||
|
|||
![]() в моем случае это не работает. все равно размер записи остается 4 байта.
|
#6
|
||||
|
||||
![]() Код:
type TData = record dynarr: array of Integer; end; var Data: TData; begin SetLength(Data.dynarr, 1000); Caption:=IntToStr(SizeOf(Data.dynarr)*Length(Data.dynarr)); end; Пишу программы за еду. __________________ |
#7
|
|||
|
|||
![]() NumLock я ценю Ваше желание мне помочь. но видимо я плохо объяснил задачу. трудность не в том, что мне нужно вывести число определенного порядка. трудность в том, чтобы передать в массив кол-во элементов, и занять для него реальный размер. что бы массив был бы как динамический, но в то же время статичный. возможно ли такое?
|
#8
|
||||
|
||||
![]() значит продолжаю не понимать, что требуется...
Пишу программы за еду. __________________ |
#9
|
|||
|
|||
![]() я хочу чтобы моя запись была бы размером 4000 байт, чтобы считывать в нее сразу 4000 байт. а когда массив в записи динамический, то размер этой записи 4 байт. хочу узнать как сделать так чтобы запись была 4000 байт. и размер этот мог бы устанавливаться динамически
|
#10
|
||||
|
||||
![]() Несколько раз прочитал вашт посты, но все равно непонятно что вы хотите. Как-то неполучается у вас изложить доступным языком.
Если вы хотите читать писать в файл некие структуры каждая из которых может иметь произвольный размер, то забудьте про типизированный файл. Здесь уже придется читать последовательно. Алгоритм такой: 1. Получить размерность описателя структуры. 2. Считать структуру. 3. Получить размерность данных. 4. Считать блок данных полученной размерности. повторять операцию до нужного результата. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#11
|
|||
|
|||
![]() Уважаемый Страдалец, теперь я не смог понять Вас. виной тому
разный уровень мышления и понимания в программировании. У меня он критически низкий у Вас сравним с Вашим опытом. Для того, что бы сдвинуть дело с мертвой точки, я постараюсь еще раз, на этот раз очень подробно объяснить задачу, которую решаю. на прикрепленном файле изображено схематичное представление структуры файла, с которым должна работать программа. прямоугольниками обозначены т. н. заголовки, в первом самом большом - описываются общие для всего файла параметры. параметры обозначены окружностями разной формы, потому что параметры разного формата - 2 байтные и 4 байтные. вслед за большим заголовком, друг за другом, последовательно следуют "трассы". каждая трасса состоит из своего заголовка, в котором даются параметры описывающие трассу, также разного формата. вслед за заголовком идут значения трассы. кол-во этих значений для всего данного файла - одинаково и оно дается в первом большом заголовке. надеюсь теперь со структурой файла все ясно. суть задачи: необходимо значения всех трасс файла, те что на схеме представлены кружочками после маленьких прямоугольников - умножить на 2. в каком виде это реализовано у меня: я считываю большой заголовок, из которого узнаю: число трасс, число значений, которое у каждой трассы в этом файле ,одинаково. затем включаю цикл равный числу трасс, в теле этого цикла я считываю заголовок, затем включаю второй цикл равный числу значений в трассе, начинаю считывать каждое значение, значение умножаю на 2. подобная реализация очень медленная. потому что значений трассы в одном файле может быть 4000, в другом файле 5000, а количество трасс - 100 000. программа будет работать быстрее, если делать ее только для работы с такими файлами, в которых значения трассы например 4000. тогда использую записи и статичные массивы можно считывать не каждое значение, а сразу всю трассу целиком. вот. теперь у меня вопрос как же все-таки сделать так. чтобы можно было считывать не каждое значение в отдельности, а целиком всю трассу, и чтобы программа могла бы работать при этом с файлами, отличающися друг от друга кол-вом значений трасс. |
#12
|
|||
|
|||
![]() А поиском по форуму пройтись? Недавно был подобный вопрос.
Делается это через нетипизированные файлы, через TFileStream. Для более точного ответа нужно знать точную структуру блоков в файле. Вообще, обычно для работы с такими данными/файлами пишут набор классов, которые собственно и реализуют работу с файлом и хранение данных в момент выполнения программы. Однако, если тебе надо только читать, причем не весь файл, а какие-то определенные части, то действительно, можно сделать специальный читатель, который просто пропустит ненужные данные и считает только то, что нужно. Теперь по существу. 1. Тебе надо сделать структуры для чтения заголовков разных типов. 2. Теперь надо открыть файловый поток и считывать данные. Данный класс сам обеспечит кеширование и др. Кстати, тогда можно все-таки попробовать читать в динамический массив. Код:
type TFileHeader = record Traces : DWORD; AnyParams : DWORD; // какие-то параметры end; TTraceHeader = record Values : DWORD; AnyParams : DWORD; // какие-то параметры end; TTraceData = Array of DWORD; // не знаю какого типа у тебя там данные. TTracePair = record // Для удобства хранения Hdr : TTraceHeader; Data : TTraceData; end; TData = class FFileHeader : TFileHeader; FTraces : Array Of TTracePair; procedure ReadFromFile(AFileName : String); end; procedure TData.ReadFromFile(AFileName : String); var F : TFileStream; begin F := TFileStream.Create(AFileName,fmOpenRead); Try F.ReadBuffer(FFileHeader,SizeOf(TTraceHeader)); SetLength(FTraces, FFileHeader.Traces); For I := 0 To FFileHeader.Traces-1 Do Begin F.ReadBuffer(FTraces[i].Hdr,SizeOf(TTraceHeader)); SetLength(FTraces[i].Data,FTraces[i].Hdr.Values); F.ReadBuffer(FTraces[i].Data[0],SizeOf(DWORD) * FTraces[i].Hdr.Values); // Здесь тип должен соотв. данным End; Finally F.Free; End; end; |