PDA

Tam Sürümünü Görmek İçin : hata nerede acaba?


euler
16/04/2005, 01:54
2 sayının okek'ini bulan şöyle ufak bir console application yazayım dedim ama bir hatayla karşılaştım ve nedenini anlayabilmiş değilim.
Acaba buradaki hata nerede?

Error 1 'ConsoleApplication2.Program.Okek(int, int)': not all code paths return a value Line:5



namespace ConsoleApplication2
{
class Program
{
static int Okek(int x, int y)
{
if (x < y)
{
int temp = x;
x = y;
y = temp;
}
for (int i = x; i <= x * y; i++)
{
if ((i % x == 0) && (i % y == 0))
{
return i;
}
}
}

static void Main(string[] args)
{
Console.Clear();
int sonuc = Okek(5,6);
Console.WriteLine(sonuc);
}
}
}


acehreli
16/04/2005, 02:05
Okek islevi ancak ozel bir durum oldugunda bir deger dOndUrUyor. Bir deger dOnebilmesi icin for dongusunun en az bir kere isletilmesi ve icindeki if kosulunun saglanmasi gerekiyor.

Butun bunlar da y degiskenine bagli oldugu icin, o isleve girildiginde bazen bir 'return' satiri isletilmemis olabiliyor.

Okek'in ne olursa olsun bir deger dOndUrmesini saglamak gerek...

Ali

euler
16/04/2005, 02:14
Hocam demek istediğinizi anlayamadım.
Elimizde 2 sayı var ve okek değeri bu 2 sayıdan büyük olanı ile bu iki sayının çarpımı arasında bir değere sahip olacak, ve kesinlikle olacak. Yani boş dönme ihtimali yok for döngüsünün.
Bu durumda for döngüsü içerisindeki if koşulu da en azından bir kere çalışacak.
Ancak burda göz ardı ettiğim bir şey var ki o da i değeri return edildikten sonra metottan çıkılmalı.
Yani örneğin x=4, y=8 için i=8 değerinde return etmeli ve 16,24,32 değerlerini almamalı.
Ancak return i; satırından sonra break; koyduğumda da yine hata alıyorum

İşin ilginci program pascalda takır takır çalışıyor. :)
Hata benim C# söz dizimi konusunda henüz yeterli olmayışımdan kaynaklanıyor olabilir diye düşünüyorum, ancak halen bir sonuç elde edebilmiş değilim.

acehreli
16/04/2005, 02:34
Biz insanlar o islevin mutlaka bir deger dOndUrecegini gorebiliyoruz ama bilgisayar bunu bilemiyor. Ya da, bilebilse bile o kadar derinine incelemiyor.

Ayrica, incelese bile, ornegin x==2 ve y==1 oldugunda for dOngUsune girilmeyecegini gorebiliyorum ;)

Ali

Sabahi
16/04/2005, 02:50
Okek fonksiyonunuz geriye bir integer donmek zorunda. Eger for loop icerisindeki if ((i % x == 0) && (i % y == 0)) ifadesi dogru bir deger kazanirsa geriye i degiskeninin degeri donulecek fakat herhangi bir nedenden bu ifade hic bir zaman dogru bir deger almazsa ve for loop un disina cikarsaniz fonksiyonunuzun geriye donecegi bir deger yok.

for (int i = x; i <= (x * y); i++)
{
if ((i % x == 0) && (i % y == 0))
{
break;
}
}
}
return i;

Kodunuzda yukardaki seklinde kucuk bir degisiklik yaparsaniz derleyiciniz hata vermeyecektir saniyorum.

euler
16/04/2005, 02:52
yalnız burdaki durumun verdiğiniz değerlerle bir alakası yok sanırım, çünkü değerleri dışarıdan okutmuyorum, direkt olarak x=5, y=6 alıyorum. :)

anlamadığım nokta programın pascalda çalışıyor, c#'ta çalışmıyor olması.
bu arada return i; satırından sonra break; etmem gerek ancak bu durumda da "unreachable code detected" diyor. tabi diğer hata da devam ediyor.

euler
16/04/2005, 02:56
evet Sabahi dediğin şekilde çalıştı.
Sabahi'nin örneklemesiyle demek istediğinizi şimdi anladım acehreli hocam. :)
İkinize de teşekkür ederim.

Sabahi
16/04/2005, 03:43
Probleminizi cozdugunuze sevindim yalniz unutmayin ki fonksiyonunuzda bir kac onemli noktayi goz ardi ediyorsunuz. Ilk olarak mesala Okek(0,11) gibi bir cagri yapildiginda dogru bir sonuc donecekmisiniz? Yada mesela Okek(-2, -4) gibi bir cagri yapilsa ne olur? Ikinci olarak fonksiyonunuz geriye integer donuyor ve parametreleri de integer. Her ne kadar architecture dependent olsa bile genel olarak int veri cesidinin –32768 ile +32767 arasinda bir deger oldugunu dusunursek Okek(100001, 3456878) gibi bir cagrinin sonuclari ne olur? Ve son olarak for loop icerisinde i<= (x*y) gibi bir karsilastirma yapiyorsunuz. Carpma islemi oldukca pahali bir islem(yani carpma icin kullanilan clock cycle toplamadan daha fazla ornegin) ve loop her increment oldugunda bu carpma islemi tekrar ve tekrar yapilacagi icin ozellikle buyuk sayilar girildiginde buyuk bir performans kaybina neden olmaz mi?