[]
C prog. soru?
Şimdi bu kadar kolpa soru sorulurmu demeyin çünkü yeni başladım.tüm değişkenler int iken sıkıntı yok.ama x ve y short z int iken y ye verdiğim değeri z in içine atıyo.C# olsa olayı derleyicinin z max değerini istemesine bağlayacağım yani hatırladığım kadarıyla convert.Toint.. gibi bi komut.ama burda niye böyle anlamadım.
deitelin kitabı var elimde ondan başladım çalışmaya.
bi de fonksiyon niye hep int main ile başlıyo onu anlamadım.int in özel bi gerekçesi var mı.short main veya double main desek nolur.
sorular saçma gelebilir ameleyiz bu konuda mazur görün...
farklı şekillerde denedim.sadece klavyeden girilen x ve y int olunca doğru sonuç veriyo.z i short ta tanımlasam yada fonksiyonu short main diyede baslatsam sonuç doğru çıkıyo.
sebep?
deitelin kitabı var elimde ondan başladım çalışmaya.
bi de fonksiyon niye hep int main ile başlıyo onu anlamadım.int in özel bi gerekçesi var mı.short main veya double main desek nolur.
sorular saçma gelebilir ameleyiz bu konuda mazur görün...
farklı şekillerde denedim.sadece klavyeden girilen x ve y int olunca doğru sonuç veriyo.z i short ta tanımlasam yada fonksiyonu short main diyede baslatsam sonuç doğru çıkıyo.
sebep?
shortan int'e dönüşüm yok diye düşündüm.
- lord (12.03.13 14:35:14)
az önce sildiğin duyuruya verdiğim cevap aşağı yukarı şöyleydi:
scanf'lerde %d değil %hd yazman gerekiyor. short, int'ten daha küçük bellek kapladığı için short gözüne int yazmaya çalışınca taşma oluşuyor.
şurayı incelemelisin:
www.cplusplus.com
main giriş noktası dediğimiz yer. programın başlangıç noktası olarak işletim sistemine gösterilen yer mainin adresi. int ya da void döndürür çünkü işletim sistemi böyle bekler. genel konvansiyon bu yöndedir ve bütün arayüzler bu şekilde yazılır.
scanf'lerde %d değil %hd yazman gerekiyor. short, int'ten daha küçük bellek kapladığı için short gözüne int yazmaya çalışınca taşma oluşuyor.
şurayı incelemelisin:
www.cplusplus.com
main giriş noktası dediğimiz yer. programın başlangıç noktası olarak işletim sistemine gösterilen yer mainin adresi. int ya da void döndürür çünkü işletim sistemi böyle bekler. genel konvansiyon bu yöndedir ve bütün arayüzler bu şekilde yazılır.
- talemon (12.03.13 14:36:33 ~ 14:39:30)
teşekkürler hocam.da kitapta ne yazıyosa aynısını ayzdım.%hd diye bi ifade yok.
neyse o önemli değil x ile y zaten short.x ile y ye short değerler verip z i int yapıp her türlü garanti ediyorum.taşma neden olsun ki.soldaki resme bakarsanız.ben mi yanlış düşünüyorum..
neyse o önemli değil x ile y zaten short.x ile y ye short değerler verip z i int yapıp her türlü garanti ediyorum.taşma neden olsun ki.soldaki resme bakarsanız.ben mi yanlış düşünüyorum..
- bu da mı gol değil lan (12.03.13 14:45:49)
scanf %d ile okuduğunda int okuyor yani hafızada 4 byte'lık yere atıyor. short değişken ilk 2 byte'ında olduğu için o 2 byte'taki değeri veriyor sana. o yüzden değerlerin saçmalıyor.
scanf ile %hd ile okursan 2 byte'lık yere atar, sorun yaşamazsın.
scanf ile %hd ile okursan 2 byte'lık yere atar, sorun yaşamazsın.
- saygilarefendim (12.03.13 14:56:04)
main metodun programının giriş ve çıkış noktasıdır. senin programını çalıştırana, programın başarılı çalıştığını veya hata aldığını anlatmak için bir int döndürürsün. 0 döndürürsen başarılı çalışmış demektir, 0'dan farklı bir şey dönerse hata almıştır programın.
- altikereyedi (12.03.13 15:05:14)
deitel'in kitabında mı böyle bir örnek var? örnek oldukça sıkıntılı, zira short int ve int'in bellekte tutacağı yer miktarı platforma göre değişir. short her zaman 2 int her zaman 4 byte tutar diye bir kural yok. örneği okulda hoca verdiyse short ve intin aynı miktarda yer tutacağını sandığından olabilir. ya da dev-c++ gibi bozuk compilerlarla çalışıyordur.
taşma şu şekilde:
iki tane short deklare ettin, short 2 byte ise toplamda 4 byte bellek var stackte. ilk scanf ile bir int alıyorsun, bunu ilk short gözüne koymaya çalışınca, 4 byte olan int ilk shorttan taşıp ikinciye yayılıyor. 02 yerine 0002 gibi(aslında byte dizilimi ters olduğundan 0020). sonra ikinci scanf ile ikinci shortun gözüne bir int yazıyorsun, o da eldeki gözleri şu hale çeviriyor: 0008|00 (yine byte dizilimi ters olduğundan 8 içeride kaldı)
bu şekilde ikinci short da taştı ve 2 bytelık ilgisiz bir belleği de işgal etti. sonuçta elde 0 + 8 oldu. işteyim o yüzden kaba bir anlatım oldu, üzgünüm.
not: sonradan hesap ettim byte order hesabı bunu kurtarmadı ama eğer bellekte y xten önce geliyorsa x y'yi temizlemiş olabilir. ilk kodun her zaman aynı sonucu vereceğinin garantisi yok.
taşma şu şekilde:
iki tane short deklare ettin, short 2 byte ise toplamda 4 byte bellek var stackte. ilk scanf ile bir int alıyorsun, bunu ilk short gözüne koymaya çalışınca, 4 byte olan int ilk shorttan taşıp ikinciye yayılıyor. 02 yerine 0002 gibi(aslında byte dizilimi ters olduğundan 0020). sonra ikinci scanf ile ikinci shortun gözüne bir int yazıyorsun, o da eldeki gözleri şu hale çeviriyor: 0008|00 (yine byte dizilimi ters olduğundan 8 içeride kaldı)
bu şekilde ikinci short da taştı ve 2 bytelık ilgisiz bir belleği de işgal etti. sonuçta elde 0 + 8 oldu. işteyim o yüzden kaba bir anlatım oldu, üzgünüm.
not: sonradan hesap ettim byte order hesabı bunu kurtarmadı ama eğer bellekte y xten önce geliyorsa x y'yi temizlemiş olabilir. ilk kodun her zaman aynı sonucu vereceğinin garantisi yok.
- talemon (12.03.13 15:32:37 ~ 15:35:43)
1