SETLENGTH Komutunda döngü yavaşlaması

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
uğur alkan
Üye
Mesajlar: 227
Kayıt: 29 Ağu 2004 04:49
Konum: Istanbul

SETLENGTH Komutunda döngü yavaşlaması

Mesaj gönderen uğur alkan »

SETLENGTH komutunu bir döngüde kullandığım zaman döngü bu komut olmadan bir saniye sürüyorsa kullandıktan sonra 10 saniye sürüyor.
sistemi acaba neden bu kadar yavaşlatıyor. Bunu çözmenin hızlandırmanın bir yolu varmı...? Dizi boyutunu daha önceden hesaplayamıyorum. hesaplayabilsem bu sorun ortadan kalkacak.
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

döngüyü görmek lazım aslında ancak dinamik boyutlu dizilerin boyutu belli diziler kadar hızlı olmasını beklemeyin.


genede kodunuzu yapıştırın tekrar bakalım.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
uğur alkan
Üye
Mesajlar: 227
Kayıt: 29 Ağu 2004 04:49
Konum: Istanbul

Mesaj gönderen uğur alkan »

Kod: Tümünü seç

  AssignFile(Dosya, DosyaAdi);
  {$I-}
  Reset(Dosya);
  if IOResult = 0 then
  i:=0;
while not EOF(Dosya)  do
begin
ReadLn(Dosya, Satir);
Satir:=Satir+' ';
i:=i+1;
k:=i;
setlength(SATIRIM,i);
SATIRIM[i-1]:=satir;
end;
kodu bu şekilde birde daha karmaşık bi algoritmada

Kod: Tümünü seç

PROCEDURE CAPRAZ_B();
var
X1,X2,X3,X4,X5,X6,X7:EXTENDED;
V1,V2,V3,V4,V5,V6,V7:INTEGER;
K:INTEGER;
BEGIN
DIZI_BOYU:=0;
M1:=557.77;
ST();
X1:=M1/(form1.spSkinSpinEdit1.Value);//---------ÇİZGİLER ARASI MESAFE
X2:=form1.SpinEdit2.Value;   //------------ALINACAK_YOL
X3:=form1.SpinEdit3.Value;   //------------X MOTOR YOL
//-------------------------------------------------KOD OLUŞTURULUYOR
FOR K:=1 TO round(form1.SpinEdit1.Value) DO
BEGIN
PASO_GIR();
DIZI_BOYU:=DIZI_BOYU+1;
SETLENGTH(SATIR,DIZI_BOYU);
SATIR[DIZI_BOYU-1]:='X'+floatTOSTR(form1.SpinEdit3.Value)+'.'+' '+'Y'+FLOATTOSTR((X2)+(K*X1));
PASO_CIK();
DIZI_BOYU:=DIZI_BOYU+1;
SETLENGTH(SATIR,DIZI_BOYU);
SATIR[DIZI_BOYU-1]:='X0.'+' '+'Y'+FLOATTOSTR((K*X1));
END;
DIZI_BOYU:=DIZI_BOYU+1;
SETLENGTH(SATIR,DIZI_BOYU);
SATIR[DIZI_BOYU-1]:='X'+FLOATTOSTR((X3+1))+' '+'Y.0';
FOR K:=1 TO round(form1.SpinEdit1.Value) DO
BEGIN
PASO_GIR();
DIZI_BOYU:=DIZI_BOYU+1;
SETLENGTH(SATIR,DIZI_BOYU);
SATIR[DIZI_BOYU-1]:='X0.'+' '+'Y'+FLOATTOSTR((X2)+(K*X1));
PASO_CIK();
DIZI_BOYU:=DIZI_BOYU+1;
SETLENGTH(SATIR,DIZI_BOYU);
SATIR[DIZI_BOYU-1]:='X'+FLOATTOSTR((X3+1))+' '+'Y'+FLOATTOSTR((K*X1));
END;

DIZI_BOYU:=DIZI_BOYU+1;
SETLENGTH(SATIR,DIZI_BOYU);
SATIR[DIZI_BOYU-1]:='G0 Z100.';
DIZI_BOYU:=DIZI_BOYU+1;
SETLENGTH(SATIR,DIZI_BOYU);
SATIR[DIZI_BOYU-1]:='X0. Y0.';
DIZI_BOYU:=DIZI_BOYU+1;
SETLENGTH(SATIR,DIZI_BOYU);
SATIR[DIZI_BOYU-1]:='M2';
SETLENGTH(SATIR,DIZI_BOYU);
DIZI_BOYU:=DIZI_BOYU+1;
SETLENGTH(SATIR,DIZI_BOYU);
SATIR[DIZI_BOYU-1]:='%';
END;
dosyayı ben tekrar yazıyorum 1MB dosya üretmesi 1 dk dan fazla sürüyor.
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

ya vakit dar yada ben uykususuzum koddan bişey anlamadım. anlamadım derken bazı değişkenlerin tipi yok vede ilk blokta hiç açıklama olmayınca neyi neden yapıyorsunuz anlamadım.

ancak aklıma birşey geldi onuda açık edip denemiş olalım. normalde delphi string uzunluğu 0. byte içinde char olarak tutar...

yani siz

a adlı string için

a[0]:=#65 derseniz bu string 65 uzunluğuna gelmiş olur. ancak değişkenler hafızada ardarda geldiği için kodun sağplam sonuç üretme kısmını denemek lazım.
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

dr bob sana benzer bir iş yapmış ordada not sana cevap gibi..
var
X: Array of String;
i: Integer;
begin
while not eof do
begin
SetLength(X,Length(X)+1); // very inefficient...
readln(X[High(X)])
end;
for i:=0 to High(X) do writeln(X)
end.


// very inefficient... diyor amcamız
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
Kullanıcı avatarı
uğur alkan
Üye
Mesajlar: 227
Kayıt: 29 Ağu 2004 04:49
Konum: Istanbul

Mesaj gönderen uğur alkan »

Kod: Tümünü seç

  AssignFile(Dosya, DosyaAdi); 
  {$I-} 
  Reset(Dosya); 
  if IOResult = 0 then 
  i:=0; 
while not EOF(Dosya)  do 
begin 
ReadLn(Dosya, Satir); 
Satir:=Satir+' '; 
i:=i+1; 
k:=i; 
setlength(SATIRIM,i); 
SATIRIM[i-1]:=satir; 
end; 
burada setlength (dizi boyutunu sabit olarak yukarıda tanımlarsak) komutu devredışı kalırsa döngü süper hızlı bir biçimde çalışıyor. Ama setlenght komutu devreye alınınca döngü aşırı biçimde yavaşlıyor.
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Kodlara bakınca Pascal'dan delphiye geçişiniz taze denilebilir. :wink: . Bunun yerine aşağıdaki kodu incelemenizi tavsiye ederim.

Kod: Tümünü seç

var Dizi:array of String;
Liste:TStrings;
.
.
.
procedure DiziDoldur(const DosyaAdi:String);
var i:Integer;
begin
  Liste.LoadFromFile(DosyaAdi);
  SetLength(Dizi,Liste.Count);
  for i:=0 to Liste.Count-1 do Dizi[i]:=Liste[i];
end;
.
.
.
initialization
  Liste:=TStringList.Create;
finalization
  Liste.Free;
end.
Gibi bir kodla dosyadaki satırlar bir çırpıda diziye atılabilir. Hatta diziye atılmasına gerek kalmadan da Liste nesnesinden kullanılabilir. Artık DiziDoldur('c:\xyz\Dosya.adi') prosedürü ile belirttiğimiz dosya hem Dizi'de hem de Liste'de olacak. Kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
uğur alkan
Üye
Mesajlar: 227
Kayıt: 29 Ağu 2004 04:49
Konum: Istanbul

Mesaj gönderen uğur alkan »

Teşekkürler...
Bazen sert rüzgarlar eser başını öne eğmekten asla korkma
Cevapla