Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.10.2010, 22:16
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию работа с массивами

Помогите ответить на вопрос!
Как передать кол-во элементов массива в процессе работы программы. динамический массив в данном случае, как я считаю, не подойдет, так как массив используется в записи, и считка данных в запись происходит по размеру записи, и если сделать массив динамическим, то размер записи будет не правильным - 4 б

Последний раз редактировалось Tonyy, 18.10.2010 в 05:12.
Ответить с цитированием
  #2  
Старый 17.10.2010, 23:34
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

А теперь еще раз и подробненько, откуда 4кб взялись, какая запись и т.д. Телепатов нема.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 18.10.2010, 15:13
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

Извини страдалец не кило а просто 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. какие есть еще способы или хитрости передать кол-во элементов массива в ходе выполнения процедуры? может вместе с установкой кол-ва элементов динамического массива можно как то и объем памяти задавать?
Изображения
Тип файла: jpg пример.jpg (8.5 Кбайт, 14 просмотров)

Последний раз редактировалось Tonyy, 18.10.2010 в 15:17.
Ответить с цитированием
  #4  
Старый 18.10.2010, 15:36
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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  
Старый 19.10.2010, 16:00
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

в моем случае это не работает. все равно размер записи остается 4 байта.
Ответить с цитированием
  #6  
Старый 19.10.2010, 16:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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  
Старый 19.10.2010, 17:47
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

NumLock я ценю Ваше желание мне помочь. но видимо я плохо объяснил задачу. трудность не в том, что мне нужно вывести число определенного порядка. трудность в том, чтобы передать в массив кол-во элементов, и занять для него реальный размер. что бы массив был бы как динамический, но в то же время статичный. возможно ли такое?
Ответить с цитированием
  #8  
Старый 19.10.2010, 20:59
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

значит продолжаю не понимать, что требуется...
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #9  
Старый 23.10.2010, 20:32
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

я хочу чтобы моя запись была бы размером 4000 байт, чтобы считывать в нее сразу 4000 байт. а когда массив в записи динамический, то размер этой записи 4 байт. хочу узнать как сделать так чтобы запись была 4000 байт. и размер этот мог бы устанавливаться динамически
Ответить с цитированием
  #10  
Старый 23.10.2010, 21:24
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Несколько раз прочитал вашт посты, но все равно непонятно что вы хотите. Как-то неполучается у вас изложить доступным языком.
Если вы хотите читать писать в файл некие структуры каждая из которых может иметь произвольный размер, то забудьте про типизированный файл.
Здесь уже придется читать последовательно. Алгоритм такой:
1. Получить размерность описателя структуры.
2. Считать структуру.
3. Получить размерность данных.
4. Считать блок данных полученной размерности.
повторять операцию до нужного результата.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #11  
Старый 25.10.2010, 15:44
Tonyy Tonyy вне форума
Новичок
 
Регистрация: 05.04.2010
Сообщения: 85
Репутация: 10
По умолчанию

Уважаемый Страдалец, теперь я не смог понять Вас. виной тому
разный уровень мышления и понимания в программировании. У меня
он критически низкий у Вас сравним с Вашим опытом.

Для того, что бы сдвинуть дело с мертвой точки, я постараюсь еще раз, на этот раз очень подробно объяснить задачу, которую решаю. на прикрепленном файле изображено схематичное представление
структуры файла, с которым должна работать программа.
прямоугольниками обозначены т. н. заголовки, в первом самом
большом - описываются общие для всего файла параметры. параметры обозначены окружностями разной формы, потому что параметры разного формата - 2 байтные и 4 байтные.

вслед за большим заголовком, друг за другом, последовательно
следуют "трассы". каждая трасса состоит из своего заголовка, в
котором даются параметры описывающие трассу, также разного
формата. вслед за заголовком идут значения трассы. кол-во этих
значений для всего данного файла - одинаково и оно дается в
первом большом заголовке.
надеюсь теперь со структурой файла все ясно.

суть задачи: необходимо значения всех трасс файла, те что на
схеме представлены кружочками после маленьких прямоугольников -
умножить на 2.

в каком виде это реализовано у меня:
я считываю большой заголовок, из которого узнаю:
число трасс,
число значений, которое у каждой трассы в этом файле ,одинаково.
затем включаю цикл равный числу трасс, в теле этого цикла
я считываю заголовок,
затем включаю второй цикл равный числу значений в трассе,
начинаю считывать каждое значение, значение умножаю на 2.
подобная реализация очень медленная. потому что значений трассы в
одном файле может быть 4000, в другом файле 5000, а количество
трасс - 100 000.
программа будет работать быстрее, если делать ее только для
работы с такими файлами, в которых значения трассы например
4000. тогда использую записи и статичные массивы можно считывать
не каждое значение, а сразу всю трассу целиком.

вот. теперь у меня вопрос как же все-таки сделать так. чтобы
можно было считывать не каждое значение в отдельности, а целиком
всю трассу, и чтобы программа могла бы работать при этом с
файлами, отличающися друг от друга кол-вом значений трасс.
Изображения
Тип файла: jpg структура файла.jpg (20.4 Кбайт, 11 просмотров)
Ответить с цитированием
  #12  
Старый 25.10.2010, 20:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А поиском по форуму пройтись? Недавно был подобный вопрос.
Делается это через нетипизированные файлы, через 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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:00.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025