Blog Yazıları

Semantic Error Nedir?

Semantic error, program başarılı bir şekilde compile edilse bile ondan beklenilen işleri gerçekleştirememesi ya da doğru sonuç vermemesi. Anlamsal hata olarak kabul edebiliriz.

Örneğin bir sayının, 0 sayısına bölünmesi belirsiz bir durumdur. Bu durum semantic error'a yol açar. Değer atanmamış bir değişkeni kullanmaya çalışmak semantic error olur.
Devamını Oku »

String erase() Metodu

C++98 standartına dahil bir metot. String içinde belirlenen bir parçayı silmek için kullanabiliriz. Bu durumda string boyutu azalacaktır.

Parametre olarak, değişik kombinasyonları bulunmaktadır:
  • başlangıç pozisiyonu, silinecek boyut
  • işaret edilen pozisyonun silinmesi (tek parametre)
  • ilk index, son index. (son index dahil değil)
  • Parametre kullanmazsan tüm karakterler silinir.
  • Verilen pozisyonun devamındaki tüm karakterler silinir.
std::string str("Naber blabla");

str.erase(2); 
// --> Na

str.erase();  
// --> 

str.erase(str.begin() + 2); 
// --> Naer blabla

str.erase(str.begin() + 5, str.end() - 3); 
// --> Naberbla

str.erase(2, 4);
// --> Nablabla
Devamını Oku »

Emacs Rehberi


Ubuntu'ya geçişimden sonra kullanımı geliştirmek istediğim alan emacs. Projeleri bu kısımda geliştirmek daha efektif olacaktır.

Emacs Başlat

Terminal içinde emacs başlatmak için emacs -nw komutu girilir. emacs açmak için terminale emacs dosya_ismi yazmak yeterlidir.

Undo ve Redo

Yapılan işlemi geri almak için C-_ yapılır. İleri almak için ise C-g sonrasında C-_ yapılır.

Dosya Kaydetme

C-x C-s işlemi yapılır.

Çıkış İşlemi

C-x C-c emacs'ten çıkmak için uygulanır.
Devamını Oku »

Geliştirme Ortamı - Oyun Geliştirme Günlüğü #12

Windows 10 maalesef bana yeterli gelmedi. Gereksiz yer kaplayan o kadar çok program olduğu için Ubuntu yükleme gereği duydum. Şu an Ubuntu 18.04 LTS kullanıyorum. OpenGL ve SFML konusunda ayarlama yapmam lazım.

Ayrıca, oyunda pencere üzerinde mouse hareket ettirildiğinde oyun karakterinin fazla hızlanması ile alakalı geçici bir çözüm uygulandı. Hızlanmanın sebebi ise hareket işleminin events döngüsü içerisinde çalışmasıdır. Buna çözüm olarak events döngüsü dışına almak yeterli oldu.
Devamını Oku »

C++ Günlüğü #1

  • Virtual Function ✅
  • vTable ve vPointer ✅
  • Memory Leaks ✅
  • Trim strings ✅

Virtual Function, konsept olarak object-oriented programming prensibi olan polymorphism'in bir parçasıdır. C++'ta virtual function, örnek olarak, bir ana sınıf olsun bir de bu sınıftan türetilmiş bir alt sınıf olsun. Ana sınıfta virtual olarak yazılmış foo() fonksiyonu ile türetilmiş sınıfta yazılmış foo() fonksiyonu olsun, ancak yaptığı işler farklı. Ana sınıf tipinde bir parametreye argüman olarak türetilmiş sınıf nesnesi gönderilirse, türetilmiş sınıf nesnesinin foo() fonksiyonu çalıştırılacaktır. Virtual function farkını burada belli ediyor. Yani her türetilmiş sınıf için farklı bir fonksiyon yazmak yerine tek bir fonksiyon yeterli olmaktadır.
#include <iostream>

class Car{
    public: 
        virtual void noise() {std::cout << "Bon bon bon";}
};

class Tesla: public Car{
    public:
        void noise() {std::cout << "Hann hannn hann"; }
};

void func(Car *foo) { foo->noise(); }

int main(){
    Car *car= new Car;
    Tesla *tesla = new Tesla;

    //car->noise();
    //tesla->noise();

    func(car);
    func(tesla);

    return 0;
}

Virtual function neden kullanılıyor, daha iyi anlamak için buradaki bağlantı açıklayıcı olacaktır.

vTable ve vPointer, daha yeni duydum böyle bir şey olduğunu 👏. Ama anladığım kadarıyla isteğe bağlı bir konu. Burada öyle diyor. İlk olarak vTable nedir? virtual function kullanan her sınıf ya da bu sınıflardan türetilmiş sınıfların kendisine ait bir virtual table'ı vardır. Bu vTable içerisinde o sınıfa ait virtual fonksiyonlar yer almaktadır. Her oluşturulan nesneninde bir vPointer'ı vardır. Bunlar ait oldukları vTable'ı işaret ederler. Aşağıdaki kodu inceleyelim:
struct Flower {
    virtual void color(){}
    virtual void smell(){ std::cout << "it smell like flower" << std::endl;}
    void photosynthesis(){}
};

struct Daisy : public Flower { 
    void smell(){ std::cout << "it smells like daisy :d" << std::endl; }
};

struct Rose : public Flower {
    void smell(){ std::cout << "it smells like rose" << std::endl; }
    void color(){ }
};

struct Violet : public Flower {
    void smell() { std::cout << "it smells like violet" << std::endl; }
};
Bu konuda ayrıntılı bilgi için bağlantı.

Memory leaks, dinamik bellek kullanımından dolayı meydana gelen bir ciddi sorundur. Aslında sonrasında yapılması gereken işlem ayrılan hafızanın işletim sistemine iade edilmesi gerekliliğidir. Eğer bu işlem ihmal edilirse hafıza dolacaktır. Hafıza ayrılan bir pointer, delete ile silinirse bu sorunun önüne geçilmiş olur. Aksi takdirde geri dönülmesi zor durumlar meydana getirebilir.

Trim Strings, karakter dizinlerini düzenleme veya kaba tabirle budamak olarak düşünülebilir. Bunun için standart bir yöntem olmamakla beraber oldukça fazla seçenek vardır. Kendi trim fonksiyonlarınızı yazabileceğiniz gibi bu farklı seçenekler de kullanılabilir. Örnek bir trim fonksiyon işlemi, karakter dizinindeki tüm boşlukları silmek veya kaldırmak. Bu bağlantıda çeşitli yöntemler verilmiş.
Devamını Oku »

Particles - Oyun Geliştirme Günlüğü #11

Particles adlı kütüphane yazıldı. Sonrasında gerekli ayarlamalar yapıldı, renk vs. Ekran görüntüsü aşağıdaki gibi:


Devamını Oku »