Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

CompareMem?   Найти похожие ветки 

 
Dema-X   (2004-11-17 19:56) [0]

Почему не отрабатывает как нужно ?
procedure TForm1.Button1Click(Sender: TObject);
var
s1,s2:string;
res:Boolean;
ss1:Integer;
begin
Edit1.Text:="ABCD" ;
Edit2.Text:="ABCD";
s1:=Edit1.Text;
s2:=Edit2.Text;
res:=CompareMem(@s1,@s2,length(s1)-1);
if res then ShowMessage("OK") else ShowMessage("Cancel")
end;
текст одинаковый а CompareMem выдает что нет


 
Anatoly Podgoretsky ©   (2004-11-17 20:10) [1]

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


 
begin...end ©   (2004-11-17 20:11) [2]

Ну и правильно, указатели s1 и s2 не равны.


 
begin...end ©   (2004-11-17 20:13) [3]


> Dema-X   (17.11.04 19:56)

Кстати, тебя тот факт, что SizeOf(s1) = 4, даже если s1 = "ABCDEFG", ни на какие мысли не наводит?


 
wnew ©   (2004-11-17 20:25) [4]

StrIComp
StrComp
StrLComp
StrLIComp
CompareStr
AnsiCompareStr


 
Юрий Зотов ©   (2004-11-17 20:57) [5]

> Dema-X

Длинная строка - это указатель. Вы сравниваете адреса, а не тела строк.  

Res := CompareMem(@S1[1], @S2[1], Length(S1) - 1);


 
Юрий Зотов ©   (2004-11-17 20:59) [6]

Сорри, Length(S1), конечно. "Минус единица" - убрать.


 
Defunct ©   (2004-11-17 21:38) [7]

Res := S1 = S2;


 
Dema-X   (2004-11-18 18:53) [8]

а при чем здесь s1 у меня стоит @s1 что есть указатель то есть поинтер а

> Юрий Зотов ©   (17.11.04 20:59) [6]
> Сорри, Length(S1), конечно. "Минус единица" - убрать.

это я так пробовал думал может есть какой знак в конце не нужный


 
Dema-X   (2004-11-18 19:07) [9]


> Юрий Зотов ©   (17.11.04 20:57) [5]
> Длинная строка - это указатель
Извиняюсь,не сразу просёк :)


 
Dema-X   (2004-11-18 19:08) [10]

А кстати что будет быстрее работать сравнение тика if  с1=с2 или эти функции&\?


 
Anatoly Podgoretsky ©   (2004-11-18 19:21) [11]

Dema-X   (18.11.04 19:08) [10]
В общем случае c1=c2


 
Dema-X   (2004-11-19 10:42) [12]

просто у меня стоит необходимость прогонки строки по массиву из более чем 1МЛН а сравнений типа = медленно а как можно по быстрому сравнивать


 
Defunct ©   (2004-11-19 15:15) [13]

Dema-X   (19.11.04 10:42) [12]

что вы напишете =, что CompareMem все равно как минимум 1Млн байт придется сравнить. Как минимум 1 млн раз придется вызвать функцию сравнения. IMHO "=" быстрее всего.


 
Palladin ©   (2004-11-19 15:26) [14]

Чем вызвана эта необходимость прогонки?


 
Dema-X   (2004-11-20 12:24) [15]

удалить из массива строк повтроряющиеся сообщения,в данном случае удалить одинаковые обьявления из всех обьявлений в газете или архиве газет за разные месяцы


 
Palladin ©   (2004-11-20 12:46) [16]

Сортировка и поиск, ключевые слова.


 
Dema-X   (2004-11-22 06:18) [17]

Сортировка такого массива занимет не меньше места,сам подсчитай если размер файла около 100мегабайт


 
Dema-X   (2004-11-22 16:32) [18]


> Palladin ©   (20.11.04 12:46) [16]
> Сортировка и поиск, ключевые слова.

а как её осущесвить?


 
Dema-X   (2004-11-22 19:02) [19]


> Palladin ©   (20.11.04 12:46) [16]
> Сортировка и поиск, ключевые слова.

Сказал слово и замолк как рыба,что за отношение к людям ё-моё :(


 
jack128 ©   (2004-11-22 23:01) [20]

на алголисте, наверно, десяток алгоритмов сортировки описано...


 
Palladin ©   (2004-11-22 23:29) [21]


> 17] Dema-X   (22.11.04 06:18)

У меня под 2-4 милионна строк крутится и что?
Пример простой QuickSort есть в %Delphi%\Demos\Threads
Это первое. Второе: Лучше сразу сортировать на входе в массив, искать нужное для строки место.


> Сказал слово и замолк как рыба,что за отношение к людям
> ё-моё :(

Не борзей. Сам появился через два дня.


 
Palladin ©   (2004-11-22 23:33) [22]

Вообще говоря можешь не мучится, этот механизм уже реализован в TStringList. Читай справку на предмет TStringList.Sorted .


 
Dema-X   (2004-11-23 05:51) [23]


> Palladin ©   (22.11.04 23:33) [22]
> Вообще говоря можешь не мучится, этот механизм уже реализован
> в TStringList. Читай справку на предмет TStringList.Sorted
> .

Да хрен с с сортировкой я уже скажем быстрой сортировкой отсортировал,а как с поиском по ключевым словам быть,что за принцып такой?


 
Palladin ©   (2004-11-23 09:46) [24]

Я не знаю что ты имеешь в виду под "ключевое слово".


 
VMcL ©   (2004-11-23 09:51) [25]

>>Dema-X  (23.11.04 05:51) [23]

TStringList.Find()


 
Dema-X   (2004-11-24 06:21) [26]


> Palladin ©   (23.11.04 09:46) [24]
> Я не знаю что ты имеешь в виду под "ключевое слово".

сам писал
> Palladin ©   (20.11.04 12:46) [16]
> Сортировка и поиск, ключевые слова.

а теперь не понимаешь?.


> VMcL ©   (23.11.04 09:51) [25]
> >>Dema-X  (23.11.04 05:51) [23]
>
> TStringList.Find()

всё дело в том что у меня тип array(0..20000000)of string;
где адресация происходит через массив array(0..20000000)of integer;
потому что как можно к примеру удалить 1 элемент или средний надо чтобы все сдвинулись вверх на одну строку а это очень долго со строками гораздо быстрее переправить индексы,или может в TStringList уже продуманы эти нюансы?


 
Palladin ©   (2004-11-24 12:32) [27]


> [26] Dema-X   (24.11.04 06:21)

Ключевые слова для поиска информации в интернете, чудик...


 
Dema-X   (2004-11-26 12:02) [28]

что идей нет?


 
Digitman ©   (2004-11-26 12:10) [29]


> или может в TStringList уже продуманы эти нюансы?


там уже все продумано - и сортировка, и быстрая вставка/удаление в отсортированном списке, и поиск/выбор по индексу, и быстрый поиск по значению ..

просто нет никакого видимого резона изобретать собственную реализацию, когда уже есть готовое, удовлетворяющее всем требованиям


 
Dema-X   (2004-11-27 14:27) [30]

я же обьяснил в чем проблема,вы попробуйте мемо или ричем открыть файл мегов на 20


 
VMcL ©   (2004-11-27 16:20) [31]

>>Dema-X  (27.11.04 14:27) [30]

Пробовал. Открывает.


 
Dema-X   (2004-11-27 19:32) [32]

и сколько времени на это уходит? минут 5 да?а если строку или удалить или ксатити как в TStringList в середине добавить или удалить строку?


 
VMcL ©   (2004-11-27 22:52) [33]

>>Dema-X  (27.11.04 19:32) [32]

А можно еще раз, только так, чтобы я понял?

WBR.


 
Dema-X   (2004-11-28 14:33) [34]


> VMcL ©   (27.11.04 22:52) [33]
> >>Dema-X  (27.11.04 19:32) [32]
>
> А можно еще раз, только так, чтобы я понял?

загрузи значит тексовый файл размеров магабайт на 20-100 и попробуй его редактировать чтоб без тормозов было.Так ясно.


 
Dema-X   (2004-11-28 18:34) [35]

вот у меня из 3х мегабайтного файла удаляет 1 строку ровно 3,5 секунды а файлы большы 10 вообще не отрывает меньше чем за 10 минут


 
Dema-X   (2004-11-29 16:52) [36]

люди!


 
VMcL ©   (2004-11-30 21:52) [37]

>>Dema-X  (28.11.04 14:33) [34]

Разницу между визуальными компонентами и классами Вы, я надеюсь, знаете. Тогда код:

Unit1.pas

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls;

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   RichEdit1: TRichEdit;
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
 FN = "T:\MP\ufMain.pas";
var
 SL: TStrings;
 t: DWORD;
begin
 Memo1.Clear;
 SL := TStringList.Create;
 try
   t := GetTickCount;
   SL.LoadFromFile(FN);
   t := GetTickCount - t;
   Memo1.Lines.Add(Format("[TStringList] Loading: %u msec", [t]));
   Memo1.Update;

   t := GetTickCount;
   SL.Delete(0);
   t := GetTickCount - t;
   Memo1.Lines.Add(Format("[TStringList] Deleting first line: %u msec", [t]));
   Memo1.Update;

   t := GetTickCount;
   RichEdit1.Lines.BeginUpdate;
   try
     RichEdit1.Lines.LoadFromFile(FN);
   finally
     RichEdit1.Lines.EndUpdate;
   end;
   t := GetTickCount - t;
   Memo1.Lines.Add(Format("[TRichEdit] Loading: %u msec", [t]));
   Memo1.Update;

   t := GetTickCount;
   RichEdit1.Lines.Delete(0);
   t := GetTickCount - t;
   Memo1.Lines.Add(Format("[TRichEdit] Deleting first line: %u msec", [t]));
   Memo1.Update;
 finally
   FreeAndNil(SL);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Memo1.Clear;
 RichEdit1.Clear;
end;

end.


Unit1.dfm

object Form1: TForm1
 Left = 31
 Top = 108
 Width = 696
 Height = 478
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 PixelsPerInch = 96
 TextHeight = 13
 object Memo1: TMemo
   Left = 5
   Top = 5
   Width = 676
   Height = 131
   Color = clBtnFace
   Lines.Strings = (
     "Memo1")
   ReadOnly = True
   ScrollBars = ssBoth
   TabOrder = 0
 end
 object RichEdit1: TRichEdit
   Left = 5
   Top = 145
   Width = 676
   Height = 256
   Lines.Strings = (
     "RichEdit1")
   ScrollBars = ssBoth
   TabOrder = 1
 end
 object Button1: TButton
   Left = 5
   Top = 410
   Width = 75
   Height = 25
   Caption = "Button1"
   TabOrder = 2
   OnClick = Button1Click
 end
end


Тестовый файл (T:\MP\ufMain.pas): 76 025 492 байт, 3 009 335 строк. CPU: AthlonXP @ 1533 MHz; RAM: 512 MB DDR; HDD: 7200 rpm.

Результаты, полученные в Memo1:
[TStringList] Loading: 8332 msec
[TStringList] Deleting first line: 70 msec
[TRichEdit] Loading: 48280 msec
[TRichEdit] Deleting first line: 480 msec

Выводы писать?


 
Dema-X   (2004-12-01 18:05) [38]

Выводы(что использовать невизуальные компоненты)? А к этим выводам я ещё 2 месяца назат пришёл только вот никто и этим помочь не может может вы подскажете как же мне в таком случае работать с мемо где мемо будет работать в качесве виртуального просмотрщика массива а так же редактировать его за разумное время
P.S.зря вы строки  private
   { Private declarations }
 public
   { Public declarations }
 end;

удалили без них нифига не работает :)


 
VMcL ©   (2004-12-01 21:22) [39]

>>Dema-X  (01.12.04 18:05) [38]

>А к этим выводам я ещё 2 месяца назат пришёл только вот никто и этим помочь не может может вы подскажете как же мне в таком случае работать с мемо где мемо будет работать в качесве виртуального просмотрщика массива а так же редактировать его за разумное время

Судя по всему, придется писАть свой визуальный компонент (или найти готовый в Сети), который будет более грамотно работать с TStrings"ами, содержащими большое количество строк (стандартные VCL-компоненты Memo и RichEdit являются оболочками стандартных элементов управления Windows). У стандартного же TStringList"а скорость, вроде, вполне приемлимая.


 
Dema-X   (2004-12-05 07:33) [40]

не обязательно свой компонент нужно хотя бы поместить строку типа Application.processmessages в загрузчик мемо грузить будет дольше но зато создастся ощущуние что работает быстро это как в ворде,он же по частям открывает :)



Страницы: 1 2 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.024 c
3-1100682019
IgorMish
2004-11-17 12:00
2004.12.19
Расскажите про IB


1-1102107387
Bobby Digital
2004-12-03 23:56
2004.12.19
PopUpmenu


14-1101666074
OneFragLeft
2004-11-28 21:21
2004.12.19
Net Send


14-1101728392
КаПиБаРа
2004-11-29 14:39
2004.12.19
А зачем все время ИМХО приписывать?


14-1101456985
gn
2004-11-26 11:16
2004.12.19
SN Hotmail - взломали или пошутили?