Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.04 c
1-1101946013
Змей
2004-12-02 03:06
2004.12.19
listview


3-1100597555
REA
2004-11-16 12:32
2004.12.19
Самый шустрый сервер


1-1101568108
Dmitry_04
2004-11-27 18:08
2004.12.19
Как скачать себе в программу ярлык сайта?


1-1102423590
Zloy
2004-12-07 15:46
2004.12.19
Как проверить Edit, введен текст или цифры?


1-1101977867
гость
2004-12-02 11:57
2004.12.19
удаление файла из listview





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский