Модераторы: Snowy, MetalFan, bems, Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрая сортировка больших массивов данных, Наиболее быстрый метод сортировки 
:(
    Опции темы
Qu1nt
Дата 17.4.2012, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Да, можно использовать шаблонный TList.
PM MAIL   Вверх
Freimaks
Дата 17.4.2012, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Да, я его и взял.
Делаю так:
1. Объявляю класс
Код

TPoint = class
    private
      // Поля данных
      PointCoordX : Integer;
      PointCoordY : Integer;
      PointCoordZ : Integer;
      PointCode: byte;
      PointEcho: byte;
      PointFlag: byte;
      PointMark: byte;
      PointLine: word;
      PointInt:  word;
      PointTime: cardinal;
    public
      // Свойства для чтения значений данных
      property CoordX : Integer
          read PointCoordX;
      property CoordY : Integer
          read PointCoordY;
      property CoordZ : Integer
          read PointCoordZ;
      property Code : byte
          read PointCode;
      property Echo : byte
          read PointEcho;
      property Flag : byte
          read PointFlag;
      property Mark : byte
          read PointMark;
      property Line : word
          read PointLine;
      property Int : word
          read PointInt;
      property Time : cardinal
          read PointTime;

      // Коструктор
      constructor Create(
      const      PointCoordX : Integer;
      const      PointCoordY : Integer;
      const      PointCoordZ : Integer;
      const      PointCode: byte;
      const      PointEcho: byte;
      const      PointFlag: byte;
      const      PointMark: byte;
      const      PointLine: word;
      const      PointInt:  word;
      const      PointTime: cardinal);
  end;

2. Далее описываю Конструктор для класса Point
Код

// Конструктор Point
constructor TPoint.Create(
      const      PointCoordX : Integer;
      const      PointCoordY : Integer;
      const      PointCoordZ : Integer;
      const      PointCode: byte;
      const      PointEcho: byte;
      const      PointFlag: byte;
      const      PointMark: byte;
      const      PointLine: word;
      const      PointInt:  word;
      const      PointTime: cardinal);
begin
  // Сохранение переданных параметров
  self.PointCoordX := PointCoordX;
  self.PointCoordY := PointCoordY;
  self.PointCoordZ := PointCoordZ;
  self.PointCode := PointCode;
  self.PointEcho := PointEcho;
  self.PointFlag := PointFlag;
  self.PointMark := PointMark;
  self.PointLine := PointLine;
  self.PointInt  := PointInt;
  self.PointTime := PointTime;
end;

3. Ну и в заключении в процедуру чтения добавил заполнение Point
Код

procedure ReadBinPointsWithRecord(const FileName: String);
var point: tpoint;
begin
DataList:=Tlist.Create;
with TBinaryReader.Create(FileName) do
try
BaseStream.Read(BinHeader, SizeOf(BinHeader));
begin
while basestream.Position<>basestream.Size do
begin
BaseStream.Read(BinPoints_20020715_time, SizeOf(BinPoints_20020715_time));
Point:=TPoint.Create(
BinPoints_20020715_time.PointCoordX,
BinPoints_20020715_time.PointCoordY,
BinPoints_20020715_time.PointCoordZ,
BinPoints_20020715_time.PointCode,
BinPoints_20020715_time.PointEcho,
BinPoints_20020715_time.PointFlag,
BinPoints_20020715_time.PointMark,
BinPoints_20020715_time.PointLine,
BinPoints_20020715_time.PointInt,
BinPoints_20020715_time.PointTime);
DataList.Add(Point);
end

Теперь буду писать обработку инфы в TList
PM MAIL   Вверх
Freimaks
Дата 18.4.2012, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Вообще с TList получается как-то громоздко на мой взгляд.

Узнал такую вещь - в прогах на C++ данные закачиваются в память в виде динамического массива. Т.е. - каждая точка это структура (в делфи - record), а весь бин - это динамический массив структур.

Вопрос - как описать массив из record в моем случае???

Сделал вот так
Код

type
TBinPoints_20020715_time = packed record //стандартный bin без цвета
PointCoordX: integer;
PointCoordY: integer;
PointCoordZ: integer;
PointCode: byte;
PointEcho: byte;
PointFlag: byte;
PointMark: byte;
PointLine: word;
PointInt:  word;
PointTime: cardinal;
end;


далее в переменных прописал
Код

P20020715_t:TBinPoints_20020715_time;
 Parr1:array of TBinPoints_20020715_time;


И далее в процедуре чтения:
Код

procedure ReadBinPointsWithRecord(const FileName: String);
begin
i:=0;
with TBinaryReader.Create(FileName) do
try
BaseStream.Read(BinHeader, SizeOf(BinHeader));
SetLength(Parr1, BinHeader.PntCnt);
begin
while basestream.Position<>basestream.Size do
begin//проверяем версию файла, если 20020715, то
if (BinHeader.HdrVersion=20020715) then
begin //есть время, нет цвета
if (BinHeader.Time>0) and (BinHeader.Color=0) then
begin
BaseStream.Read(P20020715_t, SizeOf(P20020715_t));
parr1[i]:= P20020715_t;
i:=i+1;
end


Не знаю на сколько правильно, но ошибок не выдает...

Это сообщение отредактировал(а) Freimaks - 18.4.2012, 11:02
PM MAIL   Вверх
Qu1nt
Дата 18.4.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Я бы использовал классы. Ведь, тебе все-равно нужно будет прогонять все точки через TDictionary для поиска дубликатов. В случае с классами будет копироваться только указатель, иначе — объект.
PM MAIL   Вверх
Freimaks
Дата 18.4.2012, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Цитата(Qu1nt @  18.4.2012,  11:30 Найти цитируемый пост)
Я бы использовал классы. Ведь, тебе все-равно нужно будет прогонять все точки через TDictionary для поиска дубликатов. В случае с классами будет копироваться только указатель, иначе — объект. 

И еще - как установить этот компонент??? Я всегда работал только со встроенными компонентами и об установке сторонних никогда не слышал.
Щас читаю http://docs.embarcadero.com/products/rad_s...collections.pdf
Пока мало что понятно

Это сообщение отредактировал(а) Freimaks - 18.4.2012, 14:42
PM MAIL   Вверх
Qu1nt
Дата 18.4.2012, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Вечером. После работы и до футбола smile

@ Добавлено
TDictionary — стандартный компонент начиная c Delphi 2009. Я надеюсь у тебя не Delphi 7?

Это сообщение отредактировал(а) Qu1nt - 18.4.2012, 14:46
PM MAIL   Вверх
Freimaks
Дата 18.4.2012, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Если честно, то у меня установлено Delphi XE2...
PM MAIL   Вверх
Qu1nt
Дата 18.4.2012, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Отлично. Это самая последняя версия на данный момент. Для того, чтобы его использовать достаточно подключить соответствующий модуль.
PM MAIL   Вверх
Freimaks
Дата 18.4.2012, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



А, все завелось!!! Я просто не туда прописал   Dictionary:TDictionary<Integer, Integer>; поэтому и не пахало!!!
А я уже начал гугл рыть на предмет установки этой примочки...
PM MAIL   Вверх
Freimaks
Дата 18.4.2012, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Ну в общем вот пока что смог сделать с этим TDictionary:
Код

var
Dictionary:TDictionary<integer, TBinPoints_time>;
------------------------------------------------------------------
begin
i:=0;
Dictionary.Destroy;
Dictionary := TDictionary<integer, TBinPoints_time>.Create;
with TBinaryReader.Create(FileName) do
try
BaseStream.Read(BinHeader, SizeOf(BinHeader));
SetLength(PTimeArray, BinHeader.PntCnt); - удалю
SetLength(PTimeColorArray, BinHeader.PntCnt); - удалю
SetLength(PLiteArray, BinHeader.PntCnt); - удалю
while basestream.Position<>basestream.Size do
begin
if (BinHeader.Time>0) and (BinHeader.Color=0) then
begin
BaseStream.Read(PTime, SizeOf(PTime));
Dictionary.Add(i,PTime);
i:=i+1;

Потом просто проверил работает ли
Код

Showmessage(inttostr(dictionary.Count));

Выводит нужное число, т.е. скока было в файле. Все супер. Разбираюсь дальше.

Добавлено через 6 минут и 26 секунд
Прав ли я считая, что Key в Dictionary.Add и есть тот самый уникальный ключ, который показывает есть такая запись или нет?
Если да, то как мне этот ключ получить? Наверно нужно в качестве ключа использовать что-то типа суммы MD5???
Если то что написал - бред, не пинайте! Пока только это пришло в голову...
PM MAIL   Вверх
Freimaks
Дата 18.4.2012, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Сделал как и советовали классами (пока только один завел, тестовый). И перестало работать.
Вот чего делаю:
Завожу класс
Код

type
TBinPoints_time = class(TObject)
private
PointCoordX: integer;
PointCoordY: integer;
PointCoordZ: integer;
PointCode: byte;
PointEcho: byte;
PointFlag: byte;
PointMark: byte;
PointLine: word;
PointInt:  word;
PointTime: cardinal;
public
property CoordX : Integer
read PointCoordX;
property CoordY : Integer
read PointCoordY;
property CoordZ : Integer
read PointCoordZ;
property Code : byte
read PointCode;
property Echo : byte
read PointEcho;
property Flag : byte
read PointFlag;
property Mark : byte
read PointMark;
property Line : word
read PointLine;
property Int : word
read PointInt;
property Time : cardinal
read PointTime;

constructor Create(
      const      PointCoordX : Integer;
      const      PointCoordY : Integer;
      const      PointCoordZ : Integer;
      const      PointCode: byte;
      const      PointEcho: byte;
      const      PointFlag: byte;
      const      PointMark: byte;
      const      PointLine: word;
      const      PointInt:  word;
      const      PointTime: cardinal);
end;

Делаю конструктор:
Код

constructor TBinPoints_time.Create(
      const      PointCoordX : Integer;
      const      PointCoordY : Integer;
      const      PointCoordZ : Integer;
      const      PointCode: byte;
      const      PointEcho: byte;
      const      PointFlag: byte;
      const      PointMark: byte;
      const      PointLine: word;
      const      PointInt:  word;
      const      PointTime: cardinal);
      begin
  self.PointCoordX := PointCoordX;
  self.PointCoordY := PointCoordY;
  self.PointCoordZ := PointCoordZ;
  self.PointCode := PointCode;
  self.PointEcho := PointEcho;
  self.PointFlag := PointFlag;
  self.PointMark := PointMark;
  self.PointLine := PointLine;
  self.PointInt  := PointInt;
  self.PointTime  := PointTime;
end;

В переменных добавляю новое значение
Код

PointTime: TBinPoints_time;
Dictionary:TDictionary<integer, TBinPoints_time>;

Ну и собственно процедура чтения:
Код

procedure ReadBinPointsWithRecord(const FileName: String);
begin
i:=0;
Dictionary := TDictionary<integer, TBinPoints_time>.Create;
with TBinaryReader.Create(FileName) do
try
BaseStream.Read(BinHeader, SizeOf(BinHeader));
while basestream.Position<>basestream.Size do
begin
if (BinHeader.Time>0) and (BinHeader.Color=0) then
begin
BaseStream.Read(PointTime, SizeOf(TBinPoints_time));
PointTime:=TBinPoints_time.Create(
PointTime.PointCoordX,
PointTime.PointCoordY,
PointTime.PointCoordZ,
PointTime.PointCode,
PointTime.PointEcho,
PointTime.PointFlag,
PointTime.PointMark,
PointTime.PointLine,
PointTime.PointInt,
PointTime.PointTime);
Dictionary.AddOrSetValue(i, PointTime);
i:=i+1;
end
else
if (BinHeader.Time>0) and (BinHeader.Color>0) then
begin
BaseStream.Read(BinPoints_time_color, SizeOf(BinPoints_time_color));
end
else
begin
BaseStream.Read(BinPoints_Lite, SizeOf(BinPoints_Lite));
end;
end;
finally
Free;
end;
Showmessage(inttostr(dictionary.Count));
BinHeader.PntCnt:=Dictionary.Count;
Dictionary.Destroy;
end;


В итоге при считывании выдает ошибку Access violation at address 0053c49d in module...
PM MAIL   Вверх
Freimaks
Дата 18.4.2012, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Заменил TBinPoints_time = class(TObject) на TBinPoints_time = packed record и все заработало
PM MAIL   Вверх
Freimaks
Дата 18.4.2012, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Появился еще один вопрос. А как после загрузки в TDictionary вернуть все ее содержимое? Т.е. мне же потом надо все переписать в новый файл.
Процедуру записи я написал, но как достать то, что лежит в TDictionary я так и не понял (отдельными полями я понял как достать).
Т.е. что надо указывать в записи BaseStream.Write(???????????????, SizeOf(TBinPoints_time));


Сделал вот так, на сколько правильно я не знаю, но работает
Код

procedure WriteBinPointsWithRecord(const FileName: String);
begin
with TBinaryWriter.Create(FileName) do
try
BaseStream.Write(BinHeader, SizeOf(BinHeader));
for i := 0 to Binheader.PntCnt-1 do
begin
PointTime:=TBinPoints_time.Create(
Dictionary.Items[i].PointCoordX,
Dictionary.Items[i].PointCoordY,
Dictionary.Items[i].PointCoordZ,
Dictionary.Items[i].PointCode,
Dictionary.Items[i].PointEcho,
Dictionary.Items[i].PointFlag,
Dictionary.Items[i].PointMark,
Dictionary.Items[i].PointLine,
Dictionary.Items[i].PointInt,
Dictionary.Items[i].PointTime);
BaseStream.Write(PointTime, SizeOf(TBinPoints_time));
end;
finally
Free;
end;
Dictionary.Destroy;
end;


Это сообщение отредактировал(а) Freimaks - 18.4.2012, 19:54
PM MAIL   Вверх
Qu1nt
Дата 18.4.2012, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 22
Всего: 50



Ты не понимаешь разницы между record, packed record и class. Лучше чем в книге я тебе не объясню.

PM MAIL   Вверх
Freimaks
Дата 18.4.2012, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 31
Регистрация: 23.4.2011

Репутация: нет
Всего: нет



Да, в теории я не силен - буду читать щас
PM MAIL   Вверх
Страницы: (5) Все 1 2 [3] 4 5 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.