İçeriğe geç

Menü

Berk Akademi
Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Arduino "was not declared in this scope" Hatası Nasıl Çözülür?

arduino-was-not-declared-in-this-scope-hatasi-nasil-cozulur
Bu yazıda neler var?
  1. Arduino "was not declared in this scope" Hatası Ne Anlama Gelir?
  2. Global ve Yerel Değişkenlerde Kapsam Nasıl Çalışır?
  3. Fonksiyon Prototipi ve Sketch Sekmeleri Nasıl Kontrol Edilir?
  4. Bozuk Koddan Çalışan Koda: Adım Adım Teşhis
  5. Sık Sorulan Sorular

Arduino "was not declared in this scope" hatası, derleyicinin kullandığın değişken veya fonksiyon adını o satırdaki kapsam içinde tanımadığı anlamına gelir. Çözüm için önce adın yazımını ve büyük küçük harflerini, ardından bildirimin bulunup bulunmadığını, süslü parantezlerin oluşturduğu kapsamı ve tanımın kullanımdan önce görünür olup olmadığını kontrol et.

Bu hata, çoğunlukla sensör değerinden veya kart bağlantısından değil, kodun belirli bir noktada hangi adı görebildiğinden kaynaklanır. Derleyici bir ismi tanımıyorsa önce değerin yanlış olup olmadığını değil, adın o satırda görünür olup olmadığını kontrol et.

Arduino "was not declared in this scope" Hatası Ne Anlama Gelir?

Arduino "was not declared in this scope" Hatası Ne Anlama Gelir?

Derleyici bir değişkeni ya da fonksiyonu kullanıldığı satırda tanımıyorsa bu hatayı verir. Bunun ilk nedeni yazım hatasıdır. C++ tabanlı Arduino kodlarında büyük ve küçük harfler farklı kabul edilir. Bu nedenle ledPin ile ledpin, sensorValue ile sensorvalue aynı ad değildir.

Aşağıdaki örnekte değişken tanımlanmış olsa da kullanım sırasında farklı yazıldığı için hata oluşur:

int sensorValue = 42;

void setup() {
  Serial.begin(9600);
  Serial.println(sensorvalue);
}

void loop() {
}

Buradaki sensorvalue ifadesini sensorValue olarak düzeltirsen derleyici doğru bildirimi bulabilir:

int sensorValue = 42;

void setup() {
  Serial.begin(9600);
  Serial.println(sensorValue);
}

void loop() {
}

Düzeltilmiş kod çalıştığında seri çıktıda 42 değerini görürsün. Aynı kontrolü fonksiyon adlarında da yapmalısın. Bir fonksiyonun bildirimi bulunmuyorsa veya kullanım noktasında görünür değilse benzer hata oluşabilir. Değişken ya da fonksiyon bildiriminin, kullanıldığı noktaya göre görünür olması gerekir.

İlk teşhis sırasını şu şekilde kurabilirsin: Önce adın her yerde aynı yazıldığını kontrol et. Sonra ilgili değişken veya fonksiyonun gerçekten bildirildiğine bak. Ardından süslü parantezlerin bu adı başka bir kapsamın içine kapatıp kapatmadığını ve bildirimin kullanımdan önce görünüp görünmediğini incele.

Global ve Yerel Değişkenlerde Kapsam Nasıl Çalışır?

Kapsam, bir değişkenin veya fonksiyonun kodun hangi bölümünde kullanılabileceğini belirler. Fonksiyonların dışında tanımlanan bir değişken daha geniş, dosya kapsamına sahip olabilir. Fonksiyonun ya da süslü parantezlerle çevrili bir bloğun içinde tanımlanan değişken ise yereldir ve yalnızca o bölümde kullanılabilir.

Örneğin setup() içinde tanımlanan bir değişken, setup() tamamlandıktan sonra loop() içinde görünmez. Benzer şekilde bir if bloğunun içinde tanımlanan ad, kapanan süslü parantezden sonra kullanılamaz. Süslü parantezleri yalnızca kodu düzenleyen işaretler olarak değil, kapsam sınırı oluşturan yapılar olarak düşünmelisin.

İç blokta dışarıdakiyle aynı ada sahip yeni bir değişken tanımlanırsa, o blok içinde daha dar kapsamlı olan bildirim kullanılır. Blok sona erdiğinde dışarıdaki değişken yeniden görünür. Bu durum her zaman derleme hatası oluşturmaz, ancak hangi değerin kullanıldığını karıştırabilir. Aynı adı farklı kapsam düzeylerinde tekrar kullanmak yerine açıklayıcı ve farklı adlar seçmek teşhisi kolaylaştırır.

Global değişkeni her hatada çözüm olarak kullanmak doğru değildir. Değer yalnızca tek bir fonksiyonda kullanılacaksa en dar uygun kapsamda yerel tutulması daha anlaşılır olabilir. Başka bir fonksiyonun bu değere ihtiyacı varsa değeri parametre olarak geçirebilir, hesaplanan sonucu da dönüş değeriyle geri alabilirsin. Birden fazla fonksiyonun gerçekten paylaşması gereken veri varsa global değişken bilinçli bir tasarım tercihi olarak kullanılabilir.

Fonksiyon Prototipi ve Sketch Sekmeleri Nasıl Kontrol Edilir?

Fonksiyon Prototipi ve Sketch Sekmeleri Nasıl Kontrol Edilir?

Bir fonksiyon çağrısında bu hata görünüyorsa derleyici, adı kullanım noktasında tanımıyordur. Fonksiyon adının doğru yazıldığını, tanımın bulunduğunu, doğru süslü parantez kapsamında olduğunu ve çağrıdan önce görünür hâle geldiğini kontrol et.

Fonksiyon prototipi, fonksiyonun nasıl çağrılacağını gövde olmadan bildirir. Örneğin void showValue(int value); bir prototiptir. Fonksiyon tanımı ise aynı bildirime ek olarak süslü parantezler arasındaki çalışma kodunu içerir. Dönüş türü, fonksiyon adı, parametre türleri ve parametre sırası prototiple uyumlu olmalıdır.

İki güvenli yaklaşım kullanabilirsin: Fonksiyon tanımını çağrıdan önce taşıyabilir veya eşleşen prototipi çağrıdan önce yazabilirsin. Arduino'nun resmî sketch derleme süreci belgesine göre aynı sketch klasöründeki .ino dosyaları, ana dosyadan başlanıp diğerleri alfabetik sırayla eklenerek tek C++ kaynağına dönüştürülür. .ino dosyaları için otomatik prototip üretilebilse de .h dosyaları kendiliğinden eklenmez ve .cpp dosyaları aynı ön işlemden geçmez. Bu nedenle sekmelerin yan yana görünmesi, her adın çağrı noktasında görünür olduğu anlamına gelmez.

  • Fonksiyon tanımının gerçekten aynı sketch klasöründe bulunduğunu doğrula.
  • Dosyanın amacına göre .ino, .h veya .cpp uzantısını kontrol et.
  • Ayrı dosya düzeninde bildirimi .h dosyasına, tanımı .cpp dosyasına koy ve başlık dosyasını çağıran yerde ekle.
  • Aynı fonksiyonun yinelenen, eksik veya büyük küçük harf farkıyla yazılmış tanımlarını ara.

Bozuk Koddan Çalışan Koda: Adım Adım Teşhis

Aşağıdaki sketch iki farklı ad tanıma sorunu içerir. sensorValue yalnızca setup() içinde tanımlanmıştır, çağrıda ise farklı büyük küçük harf düzeniyle yazılmıştır.

void setup() {
  int sensorValue = 42;
  showValue(sensorvalue);
}

void loop() {
}

void showValue(int value) {
  sensorValue = value;
}

sensorvalue ile sensorValue aynı ad değildir. Ayrıca setup() içindeki yerel değişkenin kapsamı, bu fonksiyonun süslü parantezleriyle sınırlıdır. Bu yüzden showValue() içinden doğrudan kullanılamaz. İlk sketch, was not declared in this scope türünde ad tanıma hataları nedeniyle derlenmez.

Düzeltilmiş sürümde prototip çağrıdan önce yer alır, değişken adı doğru yazılır ve değer fonksiyona parametreyle aktarılır:

void showValue(int value);

void setup() {
  int sensorValue = 42;
  showValue(sensorValue);
}

void loop() {
}

void showValue(int value) {
  if (value > 0) {
    return;
  }
}

Bu sketch derleme hatası vermez. Donanımsal bir işlem yapmaz, yalnızca doğru isimlendirme, görünür bildirim ve parametreyle değer aktarma düzenini gösterir.

Kısa teşhis akışı

  1. Hata satırındaki adı karakter karakter karşılaştır.
  2. Değişkenin veya fonksiyonun tanım satırını bul.
  3. Süslü parantezleri izleyerek kapsamı belirle.
  4. Prototipi veya tanımı kullanımın önüne al.
  5. Sketch sekmelerini, uzantıları ve dosya düzenini kontrol et.
  6. Tek bir değişiklik yapıp yeniden derle.

Evet veya hayır kontrol listesi

  • Ad, büyük küçük harfler dâhil tamamen aynı mı?
  • Tanım doğru süslü parantez kapsamında mı?
  • Bildirim çağrıdan önce görünür mü?
  • Gerekli başlık dosyası eklenmiş mi?
  • Dosya doğru sketch klasöründe ve doğru uzantıda mı?
  • Son değişiklikten sonra yeniden derleme yaptın mı?

Sık Sorulan Sorular

Bir değişkeni global yapmak bu hatayı her zaman çözer mi?

Hayır. Global değişken kapsam sorununu bazı durumlarda giderebilir ancak yazım hatasını, eksik fonksiyon bildirimini veya yanlış dosya düzenini düzeltmez. Değere yalnızca belirli bir fonksiyon ihtiyaç duyuyorsa parametreyle aktarmak daha kontrollü bir seçenektir.

Fonksiyon prototipi ile fonksiyon tanımı arasındaki fark nedir?

Prototip, fonksiyonun dönüş türünü, adını ve parametrelerini bildirir ve noktalı virgülle biter. Tanım ise bunlara ek olarak fonksiyonun çalıştıracağı kod gövdesini içerir.

Başka bir Arduino sketch sekmesindeki tanım neden görünmeyebilir?

Dosya aynı sketch klasöründe olmayabilir, uzantısı beklenenden farklı olabilir veya bildirim kullanım noktasına ulaşmıyor olabilir. Özellikle .h ve .cpp dosyalarında gerekli başlık ekleme düzenini kurmalı, adları birebir eşleştirmelisin.

Bu hatayı çözerken adı karşılaştırmak, kapsamı süslü parantezlerle izlemek ve bildirimi kullanımdan önce görünür kılmak genellikle doğru sorun noktasını bulmanı sağlar.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara