Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.09.2009, 11:26   #1
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию Указатели и динамические массивы

Здравствуйте, уважаемые господа программеры!
Помогите пожалуйста разобраться. У меня есть код, где я использую динамический массив:
Код:
...
var
BArr:array of array of integer;
...
begin
...
   len:=length(BArr);
   setlength(BArr,len+1);
   setlength(BArr[len],n);
...
   inc(BArr[wordindex,TypeIndex-1]);
...
end;        
...
Мне бы надо чтобы он работал быстрее, мне посоветовали использовать указатели, но я не знаю как работать с указателями на динамическте массивы. Может кто поможет мне разобраться в этом. Буду признателен.
Спасибо!
iiunbreakableii вне форума Ответить с цитированием
Старый 04.09.2009, 12:22   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Мне бы надо чтобы он работал быстрее
Зачем быстрее? Это достаточно надежный код.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2009, 13:28   #3
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию

значит быстрее никак?
iiunbreakableii вне форума Ответить с цитированием
Старый 04.09.2009, 13:47   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну в принципе можно извратиться чем нить наподобие такого:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var    a:^integer;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var e,i:integer;
begin
 getmem(a,10*SizeOf(integer));
for i:=1 to 10 do
 begin
  asm
   mov eax,[i];
   mov ecx,[i]
   mov [ecx*4+a],eax;
  end;
 end;

 for i:=1 to 10 do begin
  asm
      mov ecx,[i]
   mov eax,[ecx*4+a];
   mov [e],eax;
  end;
  caption:=caption+' '+IntToStr(e);
 end;

end;

end.
Но зачем??
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2009, 13:59   #5
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию

Ассеммблер это конечно круто!
Теперь я думаю может не из-за этого процедурка моя подвисает.
Вот код этой самой зловещей процедуры, может Вы подскажите что больше тормозит в ней, а то я уже не знаю что делать?

Код:
procedure TMainForm.BbtnClick(Sender: TObject);
var
  i,j,q,slashpos,lspace,rspace,WordIndex,TypeIndex,len:integer;
  line, word, wtype:string; flag:boolean;
  sl:TStringList;
begin
  sl:=TStringList.Create();
  for j:=0 to box.items.Count-1 do
  begin
    Sl.LoadFromFile(box.items.Strings[j]);
    CurFile.Caption:=box.items.Strings[j];
    for i := 0 to Sl.Count-1 do
    begin
      if (i mod 1000)=0 then BBar.position:=round(i/sl.Count*100);
      Application.ProcessMessages;
      line:=sl.Strings[i]+' ';
      slashpos:=pos('/',line);
      while slashpos<>0 do
      begin
        rspace:=posex(' ',line,slashpos+1);
        lspace:=slashpos-1;
        while (lspace>0) and (line[lspace]<>' ') do dec(lspace);
        word:=copy(line,lspace+1,slashpos-lspace-1);
        WordIndex:=AnalizeWord(word);
        wtype:=copy(line,slashpos+1,rspace-slashpos-1); flag:=false;
        if wtype[1]='^' then delete(wtype,1,1);
        if (ContainsStr(wtype,'|')   or
            ContainsStr(wtype,'^'))  then
        begin
          decmult(wtype,word,box.items[j],(i+1),WordIndex); flag:=true;
        end;
        if not flag then
        begin
          TypeIndex:=b.Rows[0].IndexOf(wtype);
          if (TypeIndex<1) then log.Items.Add('Type not exists: '+wtype+'. Found in line: № '+inttostr(i+1)+', file: '+box.items.Strings[j])
                           else
          begin
            inc(NoneUniqueWords);
            if WordIndex=-1 then
            begin
              len:=length(BwordArr);
              setlength(BWordArr,len+1);
              BWordArr[len]:=word;
              setlength(BArr,len+1);
              setlength(BArr[len],n);
              wordindex:=len;
            end;
            inc(BArr[wordindex,TypeIndex-1]);
          end;
        end;
        slashpos:=posex('/',line,slashpos+1);
      end;
      BBar.position:=100;
      BFBar.Position:=Round(j/box.items.Count*100);
      Application.ProcessMessages;
    end;
  end;
  sl.Destroy;
  BBar.position:=0; BFBar.position:=0;
  inifile.WriteInteger('Statistic','Words',NoneUniqueWords);
  inifile.WriteInteger('Statistic','Unique words',len);
  CurFile.Caption:='n/a';
end;
Код:
function TMainForm.AnalizeWord(var word: string): integer;
var
  i:integer;
begin
  while pos('\/',word)<>0  do delete(word,pos('\/',word),1);
  for i:= 1 to length(word) do
    if word[i] in ['0'..'9'] then begin Result:=0; exit; end;
  result:=-1; i:=0;
  while (i<length(BWordArr)) and (BWordArr[i]<>word) do inc(i);
  if i<length(BWordArr) then result:=i;
end;
Код:
procedure TMainForm.decmult(wtype, word, filename: string; line,WordIndex: integer);
var
  i,j,signpos,TypeIndex,len:integer;
  str:string;
  sign:char;
  Types:array of string;
begin
  if pos('/',wtype)<>0 then exit;
  if pos('|',wtype)<>0 then Sign:='|' else Sign:='^';
  signPos:=pos(Sign,wtype);
  while wtype<>'' do
  begin
    SetLength(Types,Length(Types)+1);
    Types[Length(Types)-1]:=copy(Wtype,1,SignPos-1);
    delete(Wtype,1,SignPos);
    SignPos:=pos(Sign,Wtype);
    if SignPos=0 then SignPos:=Length(Wtype)+1;
  end;

  for i:=0 to Length(Types)-1 do
  begin
    TypeIndex:=b.Rows[0].IndexOf(Types[i]);
    if TypeIndex>0 then
    begin
      if WordIndex=-1 then
      begin
        len:=length(BwordArr);
        setlength(BWordArr,len+1);
        BWordArr[len]:=word;
        setlength(BArr,len+1);
        setlength(BArr[len],n);
        wordindex:=len;
      end;
      inc(BArr[wordindex,TypeIndex-1]);
    end
    else log.Items.Add('Type not exists: '+str+'. Found in line: № '+inttostr(line)+', file: '+filename);
  end;
end;
iiunbreakableii вне форума Ответить с цитированием
Старый 04.09.2009, 14:07   #6
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Жестоко.... Создай StringList и ставь чекпоинты (вывод времени выполнения куска) в процессе исполнения кода... Я таким методом нашел опечатку в SQL, который вешал приложение на треть секунды )))
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 04.09.2009, 14:42   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
iiunbreakableii
Не, так врядли кто скажет как это оптимизировать...
Тут нужно весь проект поковырять...

P.S. Есть профайлер QTime который может показать на какие операции сколько времени уходит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.09.2009, 14:43   #8
iiunbreakableii
Пользователь
 
Регистрация: 03.06.2009
Сообщений: 89
По умолчанию

Спасибо Вам за помощь, Stilet и SuperVisor.
Буду пробовать найти самый тормозный участок, а потом если повезёт подпрвлю его
iiunbreakableii вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы и указатели (С++) slavy Помощь студентам 3 26.08.2009 19:39
Указатели и массивы VladimirVB Общие вопросы Delphi 7 23.08.2009 19:55
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
Указатели, динамические списки Al-Fencer Паскаль, Turbo Pascal, PascalABC.NET 4 27.04.2009 12:44
Указатели и динамические массивы. Airou Общие вопросы C/C++ 5 16.01.2009 19:05