This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
bool init(Screen *scr) | |
{ | |
scr = new Screen(...); | |
... | |
} | |
int main() | |
{ | |
Screen *screen; | |
... | |
init(screen); | |
... | |
} |
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
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.