$1.99 Domains* at GoDaddy.com

C++ Programlama set_new_handler FONKSİYONU

cders-134Normal olarak new oparetörü başarısızlıkla sonuçlandığında 0 adresine geri döner ve bu adresin test edilmesi gerekir. Ancak her new kullanımında bu adresin test edilmesi yerine daha etkin bir yöntem kullanılmaktadır. new operatörü başarısız olduğunda set_new_handler fonksiyonu ile belirlenen fonksiyonu çağırmaktadır. Böylece her defasında kontrol yapılmasına gerek kalmaz.

 

set_new_handler(void (*ptr)(void));

 

set_new_handler’a parametre olarak geri dönüş değeri void parametresi void olan bir fonksiyonun adresi verilir. Artık başarısızlık durumunda bu fonksiyon çağırılacaktır. new operatörü başarısızlık durumunda belirlenen fonksiyonu çağırır ve bu fonksiyon çağırıldıktan sonra tekrar tahsisat işlemini yapar. Yine başarısız olursa tekrar fonksiyonu çağırır ve bu böyle devam eder. Yani aşağıdaki algoritmadaki gib çalışır:

for(;;){

            if(boşyer var mı)

                        return boşyer;

else

            set_new_handler();

}

 

/*———–snhandle.cpp—————*/

#include <stdio.h>

#include <new.h>

#include <stdlib.h>

 

long size = 0;

 

void myhandler(void)

{

    printf(“Free store size=%ld\n”, size);

    exit(1);

}

void main(void)

{

    void *ptr;

    void *oldhandler;

 

    oldhandler = set_new_handler(myhandler);

    for(;;){

        ptr = new char [1024];

        size += 1024;

    }

}

sen_new_handler(oldhandle);           /*handler eski haline dönüştürüldü*/

/*——————————————*/

 

set_new_handler’ın prototipi new.h içindedir.

 

 

7-) Bir adresin farklı türden bir göstericiye atanması ve adres olmayan bir bilginin bir göstericiye atanması durumu uyarı değil error olarak değerlendirilir.

 

Adres işlemlerinde tür uyuşmazlıkları C++’ta eror olarak değerlendirilir. Oysa standart C derleyicileri böyle durumlarda en fazla uyarı verirler. Ancak void göstericiye herhangi bir türden adres atanabilir. Fakat void bi adresin herhangi bir göstericiye atanması error olarak değerlendirlir(bu durum C’de en fazla uyarı olaak değerlendilir). Tabii tür dönüştürme operatörüyle her tür her türe atanabilir.

 

/*———-fark7.cpp———-*/

void main(void)

{

    int s[100];

    char *t;

 

    t = s;                       /*         “Cannot convert ‘int *’ to ‘char *’” hatasını verir      */

    t = (char *)s;           /*         Hata vermez                                                              */

}

/*——————————–*/

 

Benzer biçimde const bir değişkenin adresi ancak const bir göstericiye atanmalıdır.

 

const int x;

int *y;

conts int *p;

y= &x;            /*         Hata verir                   */

p = &x;           /*         Hata vermez               */

 

8-)   const bildirimi ile yaratılmış bir değişken sabit ifadesi gibi işlem görür.

 

C++’ta const bir değişken için yine bellekte yer ayrılır. Ancak const değişken kullanıldığında derleyici eğer const değişkene ilk değer sabit ifadesiyle verildiyse  derleyici doğrudan o sabit ifadesini kullanır. Tabii const değişkene verilen ilk değer sabit ifadesi değilse bu consta değişken kullanıldığında derleyici doğrudan bir sayı yerleştiremez, const değişkenin kendisini yerleştirir.

 

const int MAX = a + 100;

const int MIN = 1;

y = MAX;                   /*         Burada bir sayı yazamaz                    */

y = MIN;                    /*         Burada MIN yerine 1 yazılabilir        */

const int SIZE = 10;

int a[SIZE];                /*         C++’ta geçerli C’de geçerli değil      */

 

Const değişken için yine de bellkte yer ayrılır. Bu durumda const değişkenin adresi alınabilir. Bu yolla const deişkenin içeriği de değiştirilebilir. Tabii bu değiştirme programın çalışma zamanı içerisinde olduğundan sonucu değiştirmez.

 

/*———-fark8.cpp————*/

#include <stdio.h>

 

void main(void)

{

    const int SIZE = 10;

    int *p;

 

    p = (int *)&SIZE;

    *p = 20;

    printf(“%d\n”, SIZE);

}

/*——————————–*/

 

9-) C++’ta statik ömürlü değişkenlere sabit ifadesiyle ilk değer verme zorunluluğu yoktur.

 

Global değişkenler ve statik yerel değişkenler gibi statik ömürlü değişkenlere ilk değer C’de sabit ifadesiyle verilmek zorundadır. Çünkü statik ömürlü değişkenler amaç kod içerisine ilk değerleriyle yazılırlar. Exe dosyasının içerisinde yer alırlar. Bunun mümkün olabilmesi için verilen ilk değerlerin derleme aşamasında belirlenmiş olması gerekir. Derleme aşamasında tespit edilmesi için ifadenin sabit ifadesi olması gerekir. Oysa C++’ta statik ömürlü değişkenlere her türden sıradan bir ifadeyle ilk değer verilebilir. Bu değişkenler 0 ilk değeriyle amaç koda yazılırlar. Programın çalışma zamanı sırasında ve main fonksiyonundan önce ilk değerini alırlar.

 

10-) Parametre değişkenlerinin default değerler alması(default function arguments)

 

C++’ta fonksiyon çağırılırken bir parametre belirtilmemişse ona ilişkin parametre değişkeni default bir değer alabilir. Böyle bir durum C’de yoktur. Bir parametre değişkeninin default değer alması durumu fonksiyon tanımlanırken ya da prototip bildiriminde paramere değişkeninden sonra eşittir operatörüyle belirtilmelidir.

 

/*———fark10.cpp———-*/

#include <stdio.h>

 

void fonk(int x = 10, int y = 20)

{

    printf(“x = %d y = %d\n”, x ,y);

}

 

void main(void)

{

    fonk(100, 200);      /*         x = 100           y = 200           */

    fonk(100);              /*         x = 100           y = 20             */

    fonk();                    /*         x = 10             y = 20             */

}

/*——————————–*/

 

Bir parametre değişkeni default değer almışsa onun sağında bulunanların hepsi default değerler almak zorundadır.

 

void fonk(int x = 10, int y)    /*         Hata verir        */

{

}

 

void fonk(int x, int y = 20)    /*         Hata vermez   */

{

}

 

Default değer almamış olan bütün parametre değişkenleri için çağırılma ifadesinde parametre yazılmak zorundadır. Default değer alan parametre değişkenlerine sahip fonksiyonlarla aynı isimli başka fonksiyonların birlikte bulunması durumunda iki anlamlılık hataları oluşabilir. İki anlamlılık hataları fonksiyonların tanımlanması sonucunda değil çağırılması sonucunda ortaya çıkmaktadır.

 

/*         İki anlamlılık hatası örneği     */

#include <stdio.h>

 

void fonk(int x, int y = 20)

{

    printf(“%d  %d\n”, x, y);

}

 

void fonk(int x)

{

    printf(“%d\n”, x);

}

 

void main(void)

{

    fonk(100, 200);      /*         Hata vermez                           */

    fonk(100);              /*         İki anlamlılık hatası verir        */

}

/*——————————————*/

 

Bir gösterici parametresi de default değer alabilir.

 

/*         Göstericiye default değer      */

#include <stdio.h>

 

void message(const char *p = “Success”)

{

    puts(p);

}

 

void main(void)

{

    char *p = “Ali”;

 

    message(p);

    message();

}

/*——————————————-*/

Kategoriler: C++ Programlama, Yazılım

Tags: , ,

Yorumlar

Yorum Yok

Yorumunuzu Ekleyin

Yorum eklemek için giris yapmalısınız.