Plazma sayı 8, sayfa 21

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 21

İşimiz bittikten sonra da bu belleği delete komutu ile sisteme iade ederiz

delete pa;

böylece bellek sızıntısı olmamış olur.

Benzer şekilde new ve delete kullanarak bir dizi saklayacak kadar bellek de sistemden isteyebiliriz. Üstelik new ile bu şekilde bellek isterken dizilerden farklı olarak değişken boylarda dizileri saklamaya yetecek kadar bellek alabiliriz. Bunu biraz açalım. Şu koda bakın:

Std: sinav”; int kacSinav; std: :cin>>kacSinav; int // malesef calismaz!!!

Burada dikkat ederseniz bir dizi oluşturmak istiyoruz. Ama dizinin kaç elemanı olacağını programı yazarken bilmiyoruz. Çünkü bu değer program çalışırken kullanıcı tarafından giriliyor. Kullanıcı belki 4 diyecek belki 500. Bu yüzden kaçSınav değişkeni büyüklüğünde dizi tanımlamaya çalışıyoruz. Ancak bu kod derleyicide hata verir.

C++'da dizilerin bellek yönetimi derleyiciler tarafından ayarlanır. Derleyici bir dizi tanımı gördüğünde o dizi için gereken belleği alan kodu siz bir şey yapmadan programınıza ekler. Derleyicinin bunu yapabilmesi için derleme anında gereken belleğin miktarını kestirebilmesi gerekir. Bu yüzden dile şu kural konmuştur: Dizilerin ebatları değişken olamaz, sabit olmak zorundadır.

Ancak new kullanarak derleme zamanı yerine çalışma zamanında bellek istemini yaparsak önümüz açılıyor. Bu durumlar için new komutunu şöyle kullanabiliriz.

Int* sinavNotlari new intlkacSinavl;

Tıpkı dizilerdeki gibi köşeli parantezleri kullanıyoruz. Bu ifadede parantezin içine değişken gelebilir. Çünkü istek program çalışırken yapılıyor. Programımız bu satıra geldiğinde kaçSınav adet tamsayıyı saklayabilecek büyüklükte bir bellek parçasını sistemden ister. Sistem bulduğu belleğin adresini sınavNotları işaretçisine yükler.

İşaretçiler ve diziler akraba demiştik. Bu noktada [] indeksleme operatörünü tıpkı dizilerde olduğu gibi işaretçilerle de kullanabiliriz. Yani

30;

gibi bir ifade geçerlidir.

ile alınan belleği sisteme iade ederken delete komutu da biraz farklı yazılarak kullanılır:

delete (|

sinavNotlari;

Bu şekilde ayrı bir delete kullanılmasının sebebi şu: Derleyici sınavNotları adlı int* işaretçisinin bir int'lik bir bölgeye mi yoksa n int'lik bir bölgeye mi baktığını bilmiyor. Burada delete[] kullandığımızda sisteme, “bu adresten başlayan daha önce new[] ile aldığım bütün belleği iade ediyorum” demiş oluyoruz.

Bu bilgileri kullanarak geçen sayıdaki örnek programımızı biraz daha geliştirelim. Bu sefer sınav notlarını iki boyutlu bir dizide tutmak yerine tek boyutlu “öğrenci sayısı x sınav sayısı” kadar tamsayı içeren bir bellek parçasında tutacağız. m'inci öğrencinin n'inci sınavına ulaşmak için de “(m x sınav sayısı) + n” formülü ile indeksleme yapacağız.

#include <iostream> int main()

// kac ogrenci ogrenci?”; int kacOgrenci; std::cin>>kacOgrenci;

// kac sinav std: sinav?”; int kacSinav;

// dongu ile notlari al #nt* sinavNotlari new intlkacOgrenci * kacSinavl;

for(int o<kacOgrenci;

for(int iskacSinav;

int index o * kacSinav * iş; std: :cout << “sinav notu; std::cin >> )

// sonuclari hesapla ve goster int sinifToplam 0; £orl(int ö€lÜş (

int ogrenciToplam -— O; forl(int i<3; int index © * kacSinav * İ; ogrenciToplam *- sinavNotlarilindex|;

int ogrenciOrtalama öogrenciToplam / kacSinav; "<< o <<” ortalamasi: ” << ogrenciOrtalama <<

sinifToplam *t- ogrenciOrtalama;

)

int sinifOrtalama std::cout << “Sinif ortalamasi: <2

sinifToplam / kacOgrenci; # << sinifOrtalama

Aslında asıl zevkli bölümlere yeni geliyoruz. Şimdi programcılıktaki en önemli kavramlardan birinden bahsetme zamanı.

Fonksiyonlar

Klavyeyle gezinmek için ← ve → tuşları.