Visual Studio Derleme Hatasi
-
Bir kaç saattir metotları çalışıyorum aklıma takılan bağzı sorular:
1-) Method illaki bir sınıf içinde tanımlı olmalı yazıyor. C de ne güzel ayrı ayrı fonksiyonlar yazıp çağırıyorduk burada hep sınıf içinde mi methot olmalı ?
2-) static tanımlı metotlar a başka sınıftan ulaşılmak istenirse metoda ait sınıftan bir nesne yapmalı ve öyle çağırmalıyız diyor. Eğer metot static değilse buna gerek yokmuş. Peki static veya static olmayan metodun farkı nedir ?
3-) Az öncede yazmıştım float sayi=5.7f; da f ne işe yarıyor bazılarında double olunca d felan yazılmış.
edit//
4) Kafam biraz karıştı bilgiler eksik olduğu için. Bir kaç saattir şunu öğrendim. Bizim bu ana mainimiz olan [static void Main(string[] args)] içinde bir metoda erişmek istersek, BENİM ANLADIĞIM,
Erişmek istediğim metod static değilse onun sınıfına ait yeni bir nesne yazağım sonra nesne.değişken=() ile veriyi göndereceğim.
Erişmek istediğim metod static sede sadece sınıfadı.değişken() yazıp argüman göndereceğim.
Ama hocamın notlarına bakıyorum. Pek ala her hangi bir metod ve nesne yapmadan nede sınıf adı yazmadan veri gönderen bir örnek var ana menüde yazdir(Str,10) gibi. Notlarda EĞER METODA NESNE GÖNDERMEK istersek yeni bir nesne tanımlamamız gerektiğini yazmış. Benim anladığım ise eğer static değilse yeni bir nesne yapıp anca onun vasıtası ile metoda ulaşabilirsin. Staticsede sınıf adını kullanarak ulaşabilirim diye anlamıştım.
Kafam geçenin 3 olması nedeni ile biraz karıştı. Yüzde kaç doğru nereler yanlış yazasanız çok sevinicem.
zeybekustasi tarafından 03/Kas/13 03:06 tarihinde düzenlenmiştir -
1- evet hocam sınıf içine yazılır metodlar. c, cpp deki olay aslında global metodlar dediğin şey, eğer bir sınıf içerisinde olsaydı mesela main metodu,o zaman tanınmazdı. c# da ise olay daha farklı. bu iki dilin geleneğinde olan bir şey. mesela .net deki bir konsol uygulamasında main metodu program class ında..
2- cümlen ters olmuş.
öncelikle .net dilinde her şey bir nesnedir. o yüzden c# %100 nesneye dayalı bir dildir denir. Bir sınıftaki bir nesneye farklı bir sınıftan erişmek istiyorsan değişken public türünden olmalı (nesne türetme olayında v.s. farklıdır onlara girmiyorum genel olarak bahsediyorum)
public değişken/metoda diğer sınıflardan ulaşabilirsin.Eğer aynı namespace (isim uzayı) altında ise direk olarak o sınfı kullanabilirsin, eğer farklı bir namespace altındaysa using kullanarak o namespace i cs dosyasının başına yazman gerek. kodlama yaparken görmüşsündür using system.windows.forms diye.. bunu eklemenin sebebi senin projendeki namespace ile kullandığın nesnenin namespaceleri farklı o yüzden projene referans olarak belirtiyorsun (aynı zamanda solution exporerda references klasöründe o namespacelere ait dll leri görebilrsin)
genel tanımları verdikten sonra,
B sınıfnda, A sınfındaki bir X metoduna ulaşmak için öncelikle bir nesne türetmen gerekiyor B sınfında ve sonra ilgili metodu çağırmana izin verir
class B() { void metod1() { A nesne = new A(); nesne.metod1(); } } class A() { public void metod1() { } private void metod2() { } }
ilk olarak A sınıfndan nesne isimli bir nesne oluşturdum, bu nesne A sınıfı temsil eden bir örnektir ve A sınfının erişim belirleyicileri izin verdikçe A sınıfndaki her şeyi barındırır. Bu oluşturduğumuz nesne A sınıfı temsil etiğinden metod1 i de içinde barındırır. dolayısla A sınfından oluşturduğumuz bir nesneyi kullanarak metod1 i çağırabiliyorum.
Ama aynı nesneyi kullanarak metod2 yi çağıramıyorum çünkü private türünde ve B sınıfında buna izin yok. metod2 ye sadece A sınıfı içerisinde erişebilirim..
şimdi iş statik olursa ne olur
class B() { void metod1() { A.metod1(); } } class A() { public static void metod1() { } private void metod2() { } }
A dan her hangi bir nesne türetmeden direk A.metod1 diye çağırabildim..
peki bu ne işime yarayacak..
mesela A sınfında sadece bir kaç metod var ise A dan bir nesne türetmenin mantığı yok, o yüzden daha kolay erişim için böyle bir şey yapılabilir. örneğin math sınıfı statik metodlara sahip bir sınftır. mesela ben toplama işlemi için
math degisken = new math();
int sonuc = degisken.Sum(5,6);
desem mi daha mantıklı olur yoksa
int sonuc = math.Sum(5,6);
desem mi ?
3- şimdi double da float da virgüllü sayı, double 64 bit, float 32 bittir. eğer sen float değişkenin sonuna f koymazsan derleyici bunu double olarak görür ..
ikinci olarak double ı, mesela 1, 1.0 ya da 1d olarak tanımlayabilirsin..
float da ise virgüllü sayı kullanacaksan double ile karışmaması için sonuna bir f koyman lazım.. ama tam değer yazacaksan sıkıntı yok. çünkü int türü de 32 bit olduğu için derleyici hata vermez.
peki 32 ve 64 bit ne gibi sorun oluşturur dersen.. double türü bir sürahi su alırken, float türü bir bardak su alıyor, float ın içindeki suyu double a boşaltabilirsin ama double un içindeki suyu floata boşaltamazsın çünkü bardaktaki su sürahiye sığar ama sürahideki su bardağa sığmaz taşar..
4- pek bi şey anlamadım demek istediğinden ama 2. örnekde bi şeyler anlattım, aydınlanırsın biraz
ama belki şunu sormak istemişsindir diyerek ekleyeyim..
statik bir metod içerisinden sadece statikleri çağırabilirsin.. metod statik değil ise o zaman statik de statik olmayanı da çağırabilirsin..
------
sonuç: nesneye yönelimli programlama (object oriented programming- oop)önemli bir yer tutar yazılımcı açısından. benim teorik kısmım biraz zayıftır, o yüzden bu eksikliği çok hissediyorum bazen :) ama sen işn teorisini iyi öğrenmeye bak o yüzden hep tavsiye ettiğim sefer algan ın kitabını alırsan bu konudaki tüm soru işaretlerin gidecektir.
şimdi öğrenme sürecindesin ve bu bir zincirin halkası gibidir.. tam ve doğru anlamak için mutlaka bu kitaba sahip ol ki ilerde eksik halka yüzünden sıkıntı yaşama.. çünkü oop çok detaylı bir sistemdir o yüzden bunu sağlam bir kaynaktan öğrenmende fayda var
iyi çalışmalar
-
unbalanced bunu yazdı
@zeybekustasi, hocam tür dönüşümlerini iyi öğren (implicit ve explicit konularına bir bak)
soruna gelirsek, aslında çok fark olmamasına rağmen (int)değişken şeklinde yaptığında buna casting denir ve sen değişken türünün aslında bir integer olduğundan eminsin ve bunu derleyiceye bu şekilde bildiriyorsun.
converting de ise, çevrim işleri IConvertible arayızünden türetilmiş bir sınıf olup, derleyici arkaplanda ne olacağını bilmese de(örneğin çevirmek istediğin veri tipinin class ı farklı bir şeyden türemişse bile) çevrim yapar, biraz kullanıcı odaklı bir şey
bu çokda önemli bir şey değil, asıl tehlike şöyle bi şey
double degisken = 0.6;
int casted = (int)degisken;
int converted = Convert.ToInt32(degisken);
şimdi burda degisken e biz 0.6 verdik.. casted değişkeni 0 olarak gelir ama converted 1 olarak atanmış olur..
@fatih, hocam bilmiyorum dediğin gibi de olabilir olmayabilir de. ama aralarında bir fark olması gerek de çok detaylı araştırmadım
edit: aynı değilmiş hocam
http://stackoverflow.com/a/5429888/1022138
sadece clean + build in yaptığı iş rebuildi tanımlamaya yetmiyor
ben
stackoverflow.com/questions/1247457/difference-between-rebuild-and-clean-build-in-visual-studio-2008
da gormustum ama tamamen ayni degil demek ki -
Üstat çok sağol :)
-
unbalanced bunu yazdı
hocam sen şimdi
int f4; yaptığında f4 değişkeni bellekte oluşturuluyor ama diğer bellek alanında bir değeri yok, değeri olmadığı için de hata veriyor. yani o değişkeni kullanmak istiyorsan ilk olarak bir değer ataman lazım. 0 atayabilirsin. stringlerde de "" ataman gerek gibi.
hocam mesela aşağıda int ortalama; değişkenine değer atamadım ama herhangi bir hata vermedi ?
...........
.
.
.
int ortalama;
int sayac = 0, notu, toplam = 0;
Console.WriteLine("Notu Giriniz: (cikis -1)");
notu = Convert.ToInt16(Console.ReadLine());
.
.
.
.........
zeybekustasi tarafından 03/Kas/13 22:27 tarihinde düzenlenmiştir -
değişkeni oluşturman problem değil hocam onu kullanman problem..
mesela
int ortalama;
Console.WriteLine(ortalama.ToString());
dersen hata verir.
-
İlklendirilmemiş değişkenlerin kullanımı sonucu elde edilecek sonuçlar belirsizdir. Örneğin bir C programında
int toplam;
int toplamin_iki_kati = toplam * 2;
yazabilirsiniz fakat toplam ve toplamin_iki_kati değişkenlerinin sakladığı bilgi daha önceden bilinemez.
C# ilklendirilmemiş değişikliklere hiç izin vermez fakat
int z = new int(); derseniz z'nin değeri (varsayılan -parametresiz- kurucudan ötürü) 0'a eşit olacaktır. Diğer varsayılan değerler için http://msdn.microsoft.com/en-us/library/83fhsxwc(v=vs.90).aspx adresine bakabilirsiniz.
-
İkinizede teşekkür ediyorum üstadlar :) Ben bu konuyu sevdim sağolsun başta unbalanced hoca olmak üzere cevap veriyorlar.
Bu kodlar sınıfın ortalamasını formda göstermesi gerekiyormuş ama olmuyor. Herhangi bir derleme yapmıyor. Sıfırdan başladığım için eminim çok basit mantık ve sintax hatalarım var. Ama bilmeyincede olmuyor...
namespace WindowsFormsApplication1{public partial class Form1 : Form{public Form1(){float ortalama;int sayac = 0, notu, toplam = 0;Console.WriteLine("Notu Giriniz: (cikis -1)");notu = Convert.ToInt16(Console.ReadLine());while (notu != -1){toplam += notu;++sayac;Console.WriteLine("Notu Giriniz: (cikis -1)");notu = Convert.ToInt16(Console.ReadLine());};string s;if (sayac == 0)s = "Not Girilmedi";elses = "Sinif Ortalamasi" + (float)toplam / sayac;MessageBox.Show(s, "Sonuclar", MessageBoxButtons.OK, MessageBoxIcon.Information);}}} -
konsol uygulaması mı bu yoksa win form uygulaması mı ? görünüşe göre winform yapmışsın ama console kodlarını yazmışsın. output ekranında çıkar da pek mantığı yok bunun.. bunun yerine console uygulaması neden yapmadın
unbalanced tarafından 04/Kas/13 00:15 tarihinde düzenlenmiştir -
kodunda problem yok, konsolda sıkıntısız çalıştı..
using System; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { float ortalama; int sayac = 0, notu, toplam = 0; Console.Write("Notu Giriniz: (cikis -1) "); notu = Convert.ToInt16(Console.ReadLine()); while (notu != -1) { toplam += notu; ++sayac; Console.Write("Notu Giriniz: (cikis -1) "); notu = Convert.ToInt16(Console.ReadLine()); }; string s; if (sayac == 0) s = "Not Girilmedi"; else s = "Sinif Ortalamasi: " + (float)toplam / sayac; Console.WriteLine(s); // MessageBox.Show(s, "Sonuclar", MessageBoxButtons.OK, MessageBoxIcon.Information); Console.ReadKey(); //tuşa basınca program kapanır } } }