21 Temmuz 2009

"Pointer" hatası

Kodda bir hata yapıp yedeğini de sildiğim için yıllardır bir köşede duran "chrono+" kodunu dün düzeltebildim. Kod hala çok çirkin,biraz daha düzenledikten sonra yayınlayacağım. Saptayabilmek için saatlerimi harcadığım hata ise, C++'ya yeni başlayanların sıkça yaptığı, benim de başkalarının kodunda genellikle kolay yakaladığım bir şeydi, şunun gibi.

bool init(Screen *scr)
{
scr = new Screen(...);
...
}
int main()
{
Screen *screen;
...
init(screen);
...
}
view raw gistfile1.hpp hosted with ❤ by GitHub



C++'ya aşina olanlar buradaki hatayı hemen görmüştür. Basitçe açıklayalım:

main() içindeki scr değişkeninde rasgele, anlamsız bir adres var. Bu adresi kullanarak bir fonksiyon çağırdığımızda(init()), bu adres çağırılan fonksiyona kopyalanıyor. init() içindeki new komutuyla scr değişkenine yeni ve anlamlı bir adres atanıyor. Fakat scr ile screen aynı değişken değil, sadece başta aynı değere sahitiler. Bu yüzden init() fonksiyonundan sonra screen'in değeri değişmiyor, aynı anlamsız adresi göstermeye devam ediyor. Buraya geldiğinizde hala kafanız karışıksa şu kodu çalıştırmayı deneyin:

#include<iostream>
using namespace std;
void f(int x)
{
x=5;
}
int main(int argc, char *argv[])
{
int i;
cout << "fonksiyondan once i= " << i << endl;
f(i);
cout << "fonksiyondan sonra i= " << i << endl;
return 666;
}
view raw gistfile1.hpp hosted with ❤ by GitHub



Kendi koduma gelince, dediğim gibi, biraz daha adam ettikten sonra "arıza" adıyla yeniden yayınlayacağım. Şimdiki haliyle, "canavar"'ın yayınladığı halinden pek bir farkı yok, görünüş olarak.