Jump to page: 1 2
Thread overview
July 01, 2010
import std.cstream;

void main()
{
	dout.writefln("How many number do you need?");
	int number;
	int counter=0;
	din.readf(&number);
	real[ ] numbers;
	while(counter<number){
		dout.writefln("Enter the number, please!");
		din.readf(&numbers[counter]);
		counter++;
	}
	counter=0;
	numbers.sort;
	while(counter<number){
		dout.writefln(numbers[counter]);
		counter++;
	}
	counter=0;
	numbers.reverse;
	while(counter<number){
		dout.writefln(numbers[counter]);
		counter++;
	}
}

Arkadaşlar bu kodu yazdım.Çalıştırıyorum(Komut isteminden.).Kaç sayı gireceğimi yazıyorum.Sonra şöyle bir hata alıyorum ve program çöküyor.

core.exception.RangeError@arrays(12) Range violation

Ne yapabilirim?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 01, 2010

Teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 01, 2010

Teşekkürler,anladım.Zaten sorunun cevabını incelediğimde o satırı gördüm.Mantık hatası yapmışım.Tekrar anlatmanıza gerek yok.Tekrar teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 01, 2010
import std.cstream;

void main()
{
   dout.writefln("How many number do you need?");
   int number;
   int counter=0;
   din.readf(&number);
   real[] numbers;
   numbers.length=number; ///Burayı ekledim.
   while(counter<number){
       dout.writefln("Enter the number, please!");
       din.readf(&numbers[counter]);
       counter++;
   }
   counter=0;
   numbers.sort;
   while(counter<number){
       dout.writefln(numbers[counter]);
       counter++;
   }
   counter=0;
   numbers.reverse;
   while(counter<number){
       dout.writefln(numbers[counter]);
       counter++;
   }
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 01, 2010

Nedenini şöyle açıklayayım:

Dinamik diziler eleman sayısı çalıştırma sırasında değiştirilebilen dizilerdir. Ancak ilk tanımlandığında kaç tane elemanı olacağını söyleyemediğimiz için başlangıçta sıfır tane elemanı var. Sizin yazdığınız şu kodda:

       din.readf(&numbers[counter]); //counter değeri 0. Yani ilk elemana erişmeye çalışıyor.

kodda sıfır uzunluktaki bir dizinin ilk elemanına erişmeye çalışıyor. Dizide ilk eleman olmadığı için çalışma anında hata veriyor ve hata mesajında şu oluyor :
Alıntı:

>

core.exception.RangeError@arrays(12) Range violation

Bu da aralık ihlali demek. Yani program aman abi bende bilmemkaçtane eleman var sen bilmemkaçtane+1.elemana erişmeye çalışıyorsun. O eleman yok ki. Bak aralıkları ihlal ediyorsun diye hata veriyor.

Parantez içindeki sayıda hata hangi satırda onu gösteriyor.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 01, 2010

Önemli değil. Sanırım pek açıklayıcı yazamamışım. İstersen en baştan yazayım yada anlayamadığın yer varsa orayı anlatayım.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 01, 2010

Tamam. Bu arada o kodu şu şekilde de yazabilirdik:

import std.cstream;

void main()
{
   dout.writefln("How many number do you need?");
   int number;
   int counter=0;
   din.readf(&number);
   real[] numbers;
   int copy;
   while(counter<number){
       dout.writefln("Enter the number, please!");
       din.readf(&copy);
       numbers~=copy;
       counter++;
   }
   counter=0;
   numbers.sort;
   while(counter<number){
       dout.writefln(numbers[counter]);
       counter++;
   }
   counter=0;
   numbers.reverse;
   while(counter<number){
       dout.writefln(numbers[counter]);
       counter++;
   }
}

Oradaki numbers~=copy; kodu derleyici arka planda şu şekilde derler: (Ali Bey demişti :-) )

numbers.length=numbers.length+1;
numbers[numbers.length-1] = copy;

Tabi her ~= kodu her defasında bellekte yeni alan açmak için uğraşacağı için daha yavaş çalışır. Eğer dizinin uzunluğu bu örnekteki gibi belirli ise ~= şeklinde yazmak daha çok yavaşlatır. Gerek yoktur.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 01, 2010

Alıntı:

>

Çünkü dizi perde arkasında 1 adet değil, akıllıca hep o andaki uzunluğunun belirli bir oranı kadar yer ayırır. Örneğin %50'si kadar ayırı... Dizi ne kadar büyümüşse, o büyüklüğün yarısı kadar eleman için tek yer ayrılır.

Ben hatırladığım kadarıyla D böyle bir şey yapmıyor. Hep bir fazlası kadar yer ayırıyor. Daha fazlası değil. Sizde bunu söylemiştiniz. Sanırım bu kod parçasında iki tane aynı değeri ekrana yazdırırsa benim dediğim doğru oluyordur ? :

import std.cstream;
import std.random;
void main()
{
   dout.writefln("How many number do you need?");
   int counter=0;

   real[] numbers;
   int copy;
   int a = uniform(2000,200000);
   for(int b=0;a>b;b++) {
       numbers~=b;
       counter++;


   }

       dout.writefln(a);
       dout.writefln(numbers.length);

}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 01, 2010

Evet çok akıllıymış. Ayrıca hep (dizi.length * 2) + 1 formülünü uygulamıyor. Yoksa zaten ileride gereksiz bellek
hatasına yada bellek kullanımına yol açardı herhalde. Derleyici gerçekten mantıklı.

import std.stdio;
import std.array;

void bilgiVer(int[] dizi)
{
   writeln("uzunluk: ", dizi.length, " kapasite: ", dizi.capacity);
}

void main()
{
   int[] dizi;

   foreach (i; 0 .. 3153919) {
       if (i>3153917-10)
       dizi.bilgiVer();
       dizi ~= i;
   }
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 01, 2010

Faydalı olabildiysem gerçekten mutlu olurum.Peki neden?

Çünkü bu D dili yeni bir dil.Haliyle içinde bug denen hatalar vardır ve bu hataların erken farkedilmesi önemlidir.

Ayrıca burda sayın Ali Bey dersler ne kadar öncelerde fazla ilgi görmedilerse de ders yazmaya devam etti.Özellikle Ali Bey'e teşekkür ederim.Ve tabi ki canalpay'ı da unutmamak gerekir.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2