28 Haziran 2025 Cumartesi

 


1. char Karakter Dizisi

char, tek bir karakteri temsil eden bir veri tipidir (örn. 'A', 'b', '7'). Birden fazla karakteri yan yana depolamak istediğimizde, bu char'ları bir dizi içinde kullanırız. Bu yapıya karakter dizisi veya C tarzı string denir. C/C++'ta metinler genellikle char dizileri olarak depolanır ve null karakteri (\0) ile sonlandırılır. Bu null karakteri, dizinin nerede bittiğini belirtir.


- Null Karakteri(\0):

\0 karakteri, ASCII değeri 0 olan özel bir karakterdir. Bir karakter dizisinin (char array) sonunu işaretlemek için kullanılır. Buna null sonlandırma (null termination) denir.

Bir char dizisinin belirli bir uzunluğu olsa bile, o dizideki "gerçek" metnin nerede bittiğini anlamanın tek yolu “\0” karakteridir. Metin işleme fonksiyonları (örneğin strlen(), strcpy(), Serial.print() gibi) bu karakteri okuyarak dizinin sonuna ulaştıklarını anlarlar. “\0” olmasaydı, bu fonksiyonlar dizinin dışındaki rastgele bellek bölgelerini okumaya devam edebilirlerdi. Bu da programın çökmesine veya hatalı verilere yol açabilirdi. Nitekim yaptığımız uygulamada; char türünde birden fazla dizi tanımladığımız zaman, dizilerin eleman sayısını 1 eleman fazla tanımladık.  1 eleman fazla tanımlamadığımız zaman, seri port ekranına yazdırdığımızda iki dizi verileri birbirine karıştı. Bu sebeple dizi tanımlarken eleman sayısını 1 fazla tanımlamak gerekmektedir. Fazla tanımlanan bu son dizi elemanını “\0” olarak da tanımlayabiliriz. 



- Karakter Dizisi Tanımlama Örnekleri:



a. char dizi_a[3]={'a','b'};    
3 elemanlı dizi tanımladık ama içine 2 eleman koyduk. Program 3. elemanı otomatik olarak “\0” ile doldurur.

b. char dizi_b[6]={'c','d','e','f'};  
6 elemanlı dizi tanımladık ama içine 4 eleman koyduk. Program 5. ve 6. elemanı otomatik olarak “\0” ile doldurur.

c. char dizi_c[7]={'m','e','h','m','e','t','\0'};
Ya da kendimiz doğrudan dizinin sonuna sonlandırma karakterini elleyebiliriz.

d. char mesaj1[ ] = "Merhaba";
mesaj1 dizisi tanımladık ama kaç elemanlı olduğu belirtmedik. Bu durumda derleyici diziyi, 7 elemandan ve 1 “\0”dan oluşan 8 elemanlı bir dizi olarak boyutlandırır. 

e. char isim[10] = "Arduino";
10 elemanlı isim adında bir dizi tanımladık ama 7 karakter ekledik. Bu durumda bu dizi bellekte şu şekilde saklanır:



f. char isim[10];     // 10 karakterlik boş bir dizi tanımladık.
isim[0] = 'A';
isim[1] = 'l';
isim[2] = 'i';
isim[3] = '\0';             // Metnin burada bittiğini belirtmek için null karakter ekledik.
Serial.println(isim);         // Çıktı: Ali. (Eğer “\0” eklemeseydik, "Ali"den sonra rastgele karakterler de gelebilirdi.)

g. Uzun dizileri şu şekilde tanımlayabiliriz:
1. char myString[ ] = "This is the first line"
2.    " this is the second line"
3.    " etcetera";

h. sizeof(dizi_adi); 
Bu komut hem sayı dizilerinin hem de karakter dizilerinin (yani stringlerin) bellekte kapladığı alanı bayt cinsinden verir. Karakter dizilerinin kapladığı alanı verirken null sonlandırıcılı (\0) karakterini de dâhil eder.
char mesaj[ ] = "Merhaba";     // 7 karakter + 1 null sonlandırıcı karakter.
int diziBoyutu = sizeof(mesaj);    //mesaj dizisinin boyutunu bayt olarak verir.
           //Çıktı: 7 + 1 = 8 byte.

i. String sehir[ ] = {"ankara", "bolu", "karabuk"}; : 
String tipinde bir dizi tanımlandı.
Serial.println(sehir[0]); // Çıktı: ankara.


- Dize Dizileri: 

LCD ekranlı bir proje gibi büyük miktarda metinle çalışırken, bir dizeler şeklinde bir dizi tanımlamak genellikle kullanışlıdır. Dizelerden oluşan bir dizi oluşturmak için; veri türünden sonraki yıldız işareti koymak gereklidir. Aşağıdaki gibi bir dize dizisi tanımlayabiliriz:

char *myStrings[ ] = {"This is string 1", "This is string 2", "This is string 3","This is string 4", "This is string 5", "This is string 6"};




- İki Boyutlu Karakter Dizisi(Karakter Matrisi):

Satır ve sütundan oluşan dizilere 2 boyutlu dizi denir.


karakter dizisinin alt dizileri:  {'a', 'b', 'c'} ve {'d', 'e', 'f'}

Serial.println(karakter[0][0]);         Çıktı: a
Serial.println(karakter[0][1]);          Çıktı: b

Eğer bu alt dizileri bir string olarak işlemek isterseniz (örneğin Serial.println(karakter[0]); gibi), \0 karakterini kendiniz eklemeniz gerekir.
char karakter[2][4] = {{'a', 'b', 'c', '\0'}, {'d', 'e', 'f', '\0'}};
Serial.println(karakter[0]);         Çıktı: abc.

Eğer bir alt diziyi doğrudan bir string değişmezi (string literal) ile başlatırsanız, o zaman derleyici otomatik olarak \0 ekler.
char metinler[2][4] = {"abc", "def"};  Dikkat: Boyutu 3 değil, 4 yaptık (\0 için).
Serial.println(metinler[0]);         Çıktı: abc.




2. Sayı Dizisi
Arduino programlamada sayı dizileri, birden fazla aynı türden değeri tek bir isim altında depolamanızı sağlayan yapılardır. Bu, benzer verileri düzenli bir şekilde saklamak ve onlara kolayca erişmek için oldukça kullanışlıdır. Örneğin, beş farklı sensörden okuduğunuz değerleri veya bir dizi LED'in durumunu saklamak için bir sayı dizisi kullanabilirsiniz.
Bir sayı dizisi tanımlarken, dizinin veri tipini (örneğin int, float, byte), dizinin adını ve köşeli parantez içinde eleman sayısını belirtmeniz gerekir. Fakat dizileri tanımlarken elemanlarını da belirlersek; eleman sayısını belirtmenize gerek kalmaz. Derleyici verilen değer sayısına göre dizinin boyutunu otomatik olarak belirler. Örneğin; 5 elemanlı dizi oluşturup içine 3 eleman yazdığımızda geri kalan elemanlar sıfır değerini alır.
Genel tanımlama şekli aşağıdaki gibidir:

veriTipi diziAdi[ elemanSayisi ];


- Sayı Dizisi Tanımlama Örnekleri:



Dizide her indisteki değer 1 bayttır, yani 8 bit. 


a. Integer (Tam Sayı) Dizisi:
int sicakliklar[4]; : 4 adet tam sayı saklayabilen “sicakliklar” adında bir dizi.
int pin[ ]={1,2,3}; : 3 adet tam sayı saklayabilen ve değerleri başta belirlenmiş “pin” adında dizi.

b. Float (Ondalıklı Sayı) Dizisi:
float mesafeler[5]; : 5 adet ondalıklı sayı saklayabilen 'mesafeler' adında bir dizi.
float uzunluk[ ]= {1.2,5.6,2.9,7.8}; : 4 adet ondalık sayı saklayabilen ve değerleri başta belirlenmiş “uzunluk” adında dizi.

c. Byte Dizisi (0-255 arası değerler için):
byte ledDurumlar[8]; : 8 adet byte değeri saklayabilen 'ledDurumlar' adında bir dizi.

d. Eleman Sayısı Belirtmeden Tanımlama
Derleyici verilen değer sayısına göre dizinin boyutunu otomatik olarak belirler.
veriTipi diziAdi[ ] = {deger1, deger2, deger3, ...};

e. sizeof(dizi_adi); 
Bu komut hem sayı dizilerinin hem de karakter dizilerinin (yani stringlerin) bellekte kapladığı alanı bayt cinsinden verir. Karakter dizilerinin kapladığı alanı verirken null sonlandırıcılı (\0) karakterini de dâhil eder.
int sayilar[ ] = {10, 20, 30, 40, 50};         // 5 elemanlı bir int dizisi.
int diziBoyutu = sizeof(sayilar);     //sayilar dizisinin boyutunu byte olarak verir.

Çıktı: int veri tipi 2 bayt yer kaplar. Bu durumda, 5 x 2 = 10 byte olur. 


- İki Boyutlu Sayı Dizisi(Sayı Matrisi): 




3. Dizi Boşaltma
Arduino'da (ve genel C++ programlamada) bir "diziyi boşaltmak" terimi, programlama dilinde doğrudan tek bir komutla yapılan bir işlem değildir. Daha ziyade, dizinin elemanlarını belirli bir duruma sıfırlamak veya diziyi yeniden kullanıma hazırlamak anlamına gelir. Bir dizinin boyutu sabittir ve tanımlandıktan sonra değiştirilemez. "Boşaltma" işlemi, dizinin bellekten silinmesi anlamına gelmez; yalnızca içeriğinin değiştirilmesi anlamına gelir.

a. For döngüsü kullanma:
For döngüsü kullanarak dizinin her elemanına tek tek erişip istenilen değer atanır. Örneğin; sayı dizisi için sıfır(0) değeri atanır.

b. memset() Fonksiyonu ile sayı dizisi boşaltma:
memset() fonksiyonu, bir bellek bloğunu belirli bir değerle doldurmak için kullanılan bir C kütüphanesi fonksiyonudur. Dizileri hızlıca 0 veya belirli bir byte değeriyle doldurmak için çok verimlidir. Özellikle büyük dizilerde döngüden daha performanslı olabilir.

Kullanımı:
memset(dizinin_adi, atanacak_deger, boyut_bayt_cinsinden);

Örnek:
int sayilar[15];
memset(sayilar, 0, sizeof(sayilar));

Dizideki her eleman 1 bayttır. sayilar[15] dizisindeki her bir eleman da 1 bayttır. memset() fonksiyonu, bayt bayt çalıştığı için, her baytı 0 yapar, bu da int 0 değerini oluşturur.

c. Karakter dizilerini boşaltma:
Bir karakter dizisini (C-stili string) "boşaltmak" genellikle, dizinin ilk elemanına null sonlandırıcı (\0) karakterini atamak anlamına gelir. Bu, string’in boş olduğunu belirtir.

Örnek:
char isim[10] = "Arduino";     //10 elemanlık bir dizi oluşturup 7 karakter ekledik.
isim[0] = '\0'; veya diğer kullanım şekli: isim[0] = NULL

İstersek tanımladığımız bir diziyi herhangi bir indisten itibaren sonlandırabiliriz:
char isim1[7] = {'m', 'e', 'h', 'm', 'e', 't'};
char isim2[7] = {'g', 'o', 'k', 'd', 'a', 'g'};

Şeklinde 2 adet dizi tanımladık. Şimdi bunları sonlandıralım:

isim1[4] = '\0'           //4. indisten itibaren diziyi sonlandır. Yani ilk 0,1,2,3. elemanlar aktiftir.
Serial.print(isim1);     //Çıktı: mehm. Yazdırma komutu \0’ı görene kadar ekrana yazdırır.
isim2[2] = NULL        //2. indisten itibaren diziyi sonlandır. Yani 0 ve 1. elemanlar aktiftir.
Serial.print(isim2);    //Çıktı: go. Yazdırma komutu \0’ı görene kadar ekrana yazdırır.


1. Örnek Program Kodları - Karakter Dizileri:
//NOT: dizileri tanımlarken dizi boyutunu bir eleman fazla tanımladık

char dizi1[4] = {'x', 'y', 'z'};             //4 elemanlı karaker dizisi tanımlandı.
char dizi2[5] = {'g', 'h', 'j', 'm'};     //5 elemanlı karaker dizisi tanımlandı.
char dizi3[3] = {'s', 't', '\0'};         //3 elemanlı karaker dizisi tanımlandı ve sonlandırma karakteri eklendi.
char karakter[6] = {'a', 'b', 'c', 'd', 'e'};   //6 elemanlı karakter dizisi tanımlandı.
char karakter2[4];    //4 elemanlı karakter dizisi tanımlandı ama içine eleman eklenmedi.
char karakter_matris[2][3] = {{'a', 'b', 'c'}, {'d', 'e', 'f'}};    //2 satır 3 sütun karakter matrisi
char isim[7] = "cuneyt";    //7 elemanlı karakter dizisi tanımlandı.
String sehir[] = {"adana", "yalova", "mugla"};   //3 elemanlı metin dizisi tanımlandı.
void setup()
{
  Serial.begin(9600);

  //_________dizi1, dizi2 ve dizi3'ü yazdırma_________
  Serial.print("dizi1 = "); Serial.println(dizi1);
  Serial.print("dizi2 = "); Serial.println(dizi2);
  Serial.print("dizi3 = "); Serial.println(dizi3);

  //________karakter dizisinin herhangi bir indisindeki değeri yazırma______
  Serial.print("karakter dizisinin 3. indisi= "); Serial.println(karakter[3]);
  karakter[3] = 'm';
  Serial.print("karakter dizisinin 3. indisini yeni değeri= "); Serial.println(karakter[3]);
  Serial.println(" ");

  //________karakter2 dizisinin indislerine değer atama______
  karakter2[0] = 'x';      //karakter2 dizininin 0. indisini m yaptık.
  karakter2[1] = 'y';         //karakter2 dizininin 1. indisini e yaptık.
  karakter2[2] = 'z';        //karakter2 dizininin 2. indisini h yaptık.
  Serial.print("karakter2 dizininin 0. indisi= "); Serial.println(karakter2[0]);
  Serial.print("karakter2 dizininin 1. indisi= "); Serial.println(karakter2[1]);
  Serial.print("karakter2 dizininin 2. indisi= "); Serial.println(karakter2[2]);
  Serial.println(" ");         //1 satır boşluk.

  //________çok boyutlu karakter dizileri______
  Serial.print("karakter_matris[0][0]= "); Serial.println(karakter_matris[0][0]);
  Serial.print("karakter_matris[0][1]= "); Serial.println(karakter_matris[0][1]);
  Serial.print("karakter_matris[0][2]= "); Serial.println(karakter_matris[0][2]);
  Serial.print("karakter_matris[1][0]= "); Serial.println(karakter_matris[1][0]);
  Serial.print("karakter_matris[1][1]= "); Serial.println(karakter_matris[1][1]);
  Serial.print("karakter_matris[1][2]= "); Serial.println(karakter_matris[1][2]);
  Serial.println(" ");      //1 satır boşluk.

  //_________char ile metin tanımlama__________
  Serial.print("isim değişkeninin 0. indisteki karakteri=  "); Serial.println(isim[0]);
  Serial.print("isim değişkeninin 1. indisteki karakteri=  "); Serial.println(isim[1]);
  Serial.println(" ");      //1 satır boşluk.

  //_________string ile metin dizisi tanımlama__________
  Serial.print("sehir değişkeninin 0. indisi= "); Serial.println(sehir[0]);
}

void loop() 
{

}


2. Örnek Program Kodları - Sayı Dizileri:
int sayilar[5] = {3, 6, 9, 2, 7};     //5 elemanlı bir dizi tanımlandı. {0.indis, 1.indis, 2.indis, 3.indis, 4.indis}.
int sayilar2[3];      //sayilar2 isimli 3 elemanlı bir dizi tanımlandı ama içerisine herhangi bir eleman eklenmedi.
int matris[2][4] = {{11, 12, 13, 14}, {15, 16, 17, 18}};      //2 satır ve 4 sütundan oluşan bir dizi tanımlandı. Yani matris tanımlandı.

void setup()
{
  Serial.begin(9600);

  //________sayilar dizisinin herhangi bir indisindeki değeri yazırma______
  Serial.print("sayilar dizisinin 4. indisi= "); Serial.println(sayilar[4]);
  sayilar[4] = 10;        //sayilar dizininin 4. indisi 10 yapıldı.
  Serial.print("sayilar dizisinin 4. indisinin yeni degeri= "); Serial.println(sayilar[4]);
  Serial.println(" ");    //1 satır boşluk bırakıldı.

  //________sayilar2 dizisinin indislerine değer atama______
  sayilar2[0] = 27;    //sayilar2 dizininin 0. indisini 27 yaptık.
  sayilar2[1] = 30;     //sayilar2 dizininin 1. indisini 30 yaptık.
  sayilar2[2] = 43;    //sayilar2 dizininin 2. indisini 43 yaptık.
  Serial.print("sayilar2 dizininin 0. indisi= "); Serial.println(sayilar2[0]);
  Serial.print("sayilar2 dizininin 1. indisi= "); Serial.println(sayilar2[1]);
  Serial.print("sayilar2 dizininin 2. indisi= "); Serial.println(sayilar2[2]);
  Serial.println(" ");      //1 satır boşluk bırakıldı.

  //________çok boyutlu diziler(matrisler)______
  Serial.print("matris[0][0]= "); Serial.println(matris[0][0]);
  Serial.print("matris[0][1]= "); Serial.println(matris[0][1]);
  Serial.print("matris[0][2]= "); Serial.println(matris[0][2]);
  Serial.print("matris[0][3]= "); Serial.println(matris[0][3]);
  Serial.println(" ");     //1 satır boşluk bırakıldı.
  Serial.print("matris[1][0]= "); Serial.println(matris[1][0]);
  Serial.print("matris[1][1]= "); Serial.println(matris[0][1]);
  Serial.print("matris[1][2]= "); Serial.println(matris[1][2]);
  Serial.print("matris[1][3]= "); Serial.println(matris[1][3]);

}

void loop() 
{
  
}



3. Örnek Program Kodları - Dizi Boşaltma
char dizi[7] = {'a', 'b', 'c', 'd', 'e', 'f'};
char dizi2[7] = {'x', 'y', 'z', 't', 'r', 'q'};

void setup()
{
  Serial.begin(9600);

  //belirli bir indisten itibaren diziyi sonlandırma.
  Serial.println(dizi);
  dizi[4] = '\0';       //4. indisten itibaren diziyi sonlandır. Yani ilk 0,1,2,3. elemanlar aktiftir.
  Serial.println(dizi);
  dizi[2] = NULL;       //2. indisten itibaren diziyi sonlandır. Yani 0 ve 1. elemanlar aktiftir.
  Serial.println(dizi);

  //diziyi tamamen boşaltma.
  memset(dizi2,'\0', sizeof(dizi2));     //dizideki tüm elemanlar silinir. 
  Serial.print("dizi2= "); Serial.println(dizi2);

}

void loop()
{

}


________________________________________________________________________________________________________________________________________________________

0 comments:

Yorum Gönder

Arduino Eğitimi Konu - 7

Toplam Sayfa Görüntüleme Sayısı

Seri İletişim Protokolleri

Sensörlerin Arduino İle Kullanımı

Popular Posts

Yararlanılan Kaynaklar

İletişim

gokdag17@gmail.com