← Kodun diligörev 9 / 10
9 / 10 tamamlandı
görev 9 · ~30 dk

Hata yapmayı öğrenmek

Kırmızı yazıyı okumak, sessiz hatayı yakalamak — kursun en işe yarar görevi

hedef

Bozuk bir kod alacaksın. Dört hata var: üçünü derleyici söyleyecek, birini söylemeyecek. Dördünü de bulup düzelteceksin.

Kursun son görevi. Bundan sonra yazacağın her kodda kullanacağın tek beceri bu.

Önce şunu bil: iki tür hata var

Derleme hatası. Kırmızı yazı. Derleyici çeviremedi, karta hiçbir şey gitmedi. Görev 1'deki noktalı virgül, Görev 2'deki çift tanım. Bunlar kolay: sana nerede olduğunu söylüyor.

Çalışma hatası. Kod derlendi, yüklendi, çalışıyor — ama yanlış sonuç veriyor. Görev 3'teki taşma, Görev 4'teki tek eşittir, Görev 5'teki ||. Kimse sana söylemiyor. Sen fark etmek zorundasın.

Derleyiciyi titiz bir editör gibi düşün. Yazım hatası varsa yayınlamıyor, satırı gösteriyor. Ama anlam hatasını yakalayamıyor — cümlen dilbilgisine uygun ama saçma olabilir, o geçer.

Kırmızı yazıyı okumak

Derleme hatası şöyle görünür:

kod
kodum.ino:8:32: error: expected ';' before '}' token

Üç parça: dosya adı, satır numarası (8), mesaj. IDE'de satır numaraları solda görünür; görünmüyorsa Dosya → Tercihler → Satır numaralarını göster.

İki kural:

Birincisi: satıra git. Hata 8. satırda diyorsa oraya bak — ve bir üstüne. Eksik noktalı virgül genelde bir önceki satırın sonunda, derleyici onu bir sonrakinde fark ediyor.

İkincisi: ilk hatadan başla. Bazen on tane kırmızı satır çıkar. Korkma. Çoğu zaman tek bir hata var, gerisi onun yankısı: bir parantez eksikse derleyici ondan sonraki her şeyi yanlış okur. İlkini düzelt, yeniden yükle, listeye tekrar bak.

En sık dört mesaj:

Mesaj Anlamı
expected ';' before ... Bir satırın sonunda noktalı virgül eksik
'x' was not declared in this scope x diye bir şey tanımlanmamış — ya yazım hatası, ya kutu açılmamış, ya yanlış yerde açılmış
expected '}' at end of input Bir süslü parantez kapanmamış
a function-definition is not allowed here Bu da parantez — önceki fonksiyon kapanmadığı için yenisi onun içinde kaldı

Sonuncusu önemli: mesaj "parantez" demiyor ama sebep parantez. Anlaşılmaz bir mesaj görürsen, ondan önceki bloğun { ve } sayısını say.

Sessiz hatayı yakalamak: Serial.println

Kod derlendi ama sonuç yanlış. Nerede bozuluyor? Kodun içine bakmanın en basit yolu: ara değerleri yazdır.

kod · .ino
Serial.print("i = ");
Serial.println(i);

Döngünün içine bunu koyarsan i'nin her turda ne olduğunu görürsün. Beklediğin 0-1-2-3-4 ise ve 0-1-2-3 görüyorsan, hatayı buldun.

Profesyonellerin en çok kullandığı yöntem bu. Süslü araçlar var, ama günün sonunda herkes bir yere println koyup bakıyor. Bulunca siliyorsun.

Şimdi sen yaz — bozuk kodu düzelt

Aşağıdaki kod beş notun toplamını ve ortalamasını yazmalı: Toplam: 380, Ortalama: 76. Ama bozuk. Olduğu gibi yapıştır, Yükle'ye bas, kırmızı yazıyı oku, düzelt. Tekrar yükle. Kırmızı bitince çıktıya bak — doğru mu?

kod · .ino
// ŞİMDİ SEN YAZ: bu kodda 4 hata var. Ucunu derleyici gosterecek,
// birini sen bulacaksin. Ilk hatadan basla.
int puanlar[5] = {70, 85, 90, 60, 75};

void setup() {
  Serial.begin(9600);
  int toplam = 0;
  for (int i = 0; i < 4; i++) {
    toplam = toplam + puanlar[i]
  }
  Serial.print("Toplam: ");
  Serial.println(toplm);
  Serial.print("Ortalama: ");
  Serial.println(toplam / 5);

void loop() {
}
🔍 İpucu 1

İlk kırmızı satır expected ';' diyor ve bir satır numarası veriyor. O satıra ve bir üstüne bak.

Düzeltip yeniden yükle. Yeni bir hata çıkacak — bu normal, sırayla gidiyorsun.

🔍 İpucu 2

İkinci hata was not declared — bir kutunun adı yanlış yazılmış. Üçüncü hata parantezle ilgili ama mesaj öyle demiyor; setup'ın { ve } sayısını say.

Üçü bitince kod derlenir. Ekrana bak: Toplam: 305. 380 olmalıydı. Döngünün içine Serial.println(i); koy ve i'nin kaça kadar gittiğine bak.

✅ Cevap

Dört hata:

  1. toplam = toplam + puanlar[i] — sonunda ; yok. Mesaj bir alt satırı gösteriyordu, çünkü derleyici eksikliği orada fark etti.
  2. Serial.println(toplm); — toplam yanlış yazılmış. Derleyici toplm diye bir kutu tanımıyor.
  3. setup'ın kapanış }'si yok. Mesaj a function-definition is not allowed here diyordu: void loop() setup'ın içinde kaldı. Serial.println(toplam / 5); satırından sonra } ekle.
  4. i < 4 — sessiz olan. Dört eleman topluyor, beşinciyi (75) atlıyor. 305 çıkıyor, 380 değil. Derleyici için i < 4 gayet geçerli bir cümle. i < 5 olmalı.

Dördüncüyü nasıl buldun? Ya sonucu elle hesaplayıp karşılaştırdın, ya döngüye println koydun. İkisi de doğru yöntem. Üçüncü bir yöntem de var: kodu yazdığın anda "beş elemanlı dizi, i < 5" diye kontrol etmek. Görev 7'de bunu konuşmuştuk. En ucuz hata, yapılmayan hata.

📄 Görevin tam kodu
kod · .ino
int puanlar[5] = {70, 85, 90, 60, 75};

void setup() {
  Serial.begin(9600);
  int toplam = 0;
  for (int i = 0; i < 5; i++) {
    toplam = toplam + puanlar[i];
  }
  Serial.print("Toplam: ");
  Serial.println(toplam);
  Serial.print("Ortalama: ");
  Serial.println(toplam / 5);
}

void loop() {
}

Olmadıysa

Ne görüyorsun Ne yap
On tane kırmızı satır Sadece ilkini oku. Düzelt, yeniden yükle. Çoğu kaybolacak
Hatayı düzelttim, aynı hata yine çıkıyor Kaydetmeden yüklemiş olabilirsin, ya da düzelttiğin satır değil bir üstü hatalıydı
Toplam: 305 Sessiz hata hâlâ duruyor: i < 4. Döngü beşinci elemana ulaşmıyor
Ortalama: 76.00 yerine 76 Doğru. int bölmesi ondalık atar; 380/5 zaten tam 76. 381 olsaydı yine 76 derdi — Görev 3
Hiçbir şey çıkmıyor Kartın reset düğmesine bas; setup bir kez çalışır

Kendini test et

Soru: Bir arkadaşın "kodum çalışmıyor" diyor. Ona soracağın ilk soru ne?

Cevabı gör

"Kırmızı yazı var mı?"

Cevap evetse derleme hatası: satır numarasını iste, oraya bakın. Beş dakikalık iş.

Cevap hayırsa çalışma hatası: "ne bekliyordun, ne gördün?" Beklediği ile gördüğü arasındaki fark, hatanın nerede olduğunu söyler. Sonra o farkın oluştuğu yere println koyarsınız.

Bu soru bütün hata ayıklamayı ikiye bölüyor ve iki taraf tamamen farklı çözülüyor. "Çalışmıyor" bir teşhis değil; "kırmızı yazı var" ya da "yanlış sayı çıkıyor" teşhis.

Bitirdin

Beş araç öğrendin: değişken (sayıyı tut), karar (if), döngü (for, while), dizi (liste tut), fonksiyon (işe ad ver). Ve altıncısı, en önemlisi: hatayı okumak.

Bu araçlarla henüz bir şey kurmadın — sadece Serial Monitor'e yazdın.

İki yolun var. Araçları pekiştirmek istiyorsan Bu hata bir roketi patlattı — aynı kavramlar, ama bir roketi patlatmış, bir sondayı kaybettirmiş gerçek kazalarla. Üç saat, isteğe bağlı.

Doğrudan devam etmek istiyorsan sıradaki kurs Yazılım temelleri: aynı araçlarla gerçek bir sistemin mantığını kuracaksın. Eşik koymak, kararsız sistemi düzeltmek, beklemeden beklemek. Orada kurulum bölümünü atlayabilirsin, burada yaptın.

Kitlerde bu kursun her görevi karşına çıkacak. Sera'da if ile sulama kararı, && ile depo kontrolü, sula() fonksiyonu. Güvenlik'te kart dizisi ve for ile arama. Afet'te while ve zaman aşımı. Artık o kodları ezberlemeyeceksin — ne dediğini bileceksin.


Takıldın, hata tablosu da yetmedi mi?

WhatsApp'tan sor — hangi görevdesin, ekranda ne yazıyor, devrenin fotoğrafı.

Şimdi sistemin mantığını kur

Araçları öğrendin ama henüz bir şey kurmadın. Yazılım temelleri kursunda aynı araçlarla gerçek bir sistemin mantığını kuracaksın — eşik, kararsızlık, durum. Kurulum bölümünü atlayabilirsin, onu burada yaptın.

Yazılım temelleri →