senko Mesaj tarihi: Aralık 23, 2011 Paylaş Mesaj tarihi: Aralık 23, 2011 cpp guruları şu aşağıdaki duruma hiç kafam basmadı bir bakabilirmisiniz siz using namespace std; typedef int T; int main(int argc, char** argv) { const T t = 12345; T *pt; const T **ppt = (const T**)&pt; *ppt = &t; *pt = 54321; cout<<t<<endl; const T *pct = &t; cout<<t<<endl; cout<<*pct<<endl; return 0; } şimdi burda ilk anda 12345 basıyor da ikincisinde yani gidip *pct'yi bastırdığımız 54321 basıyor fikri olan var mı? hepsi nihayetinde t adlı variable'ye ulaşmıyor mu? Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Borastus Mesaj tarihi: Aralık 23, 2011 Paylaş Mesaj tarihi: Aralık 23, 2011 constların hepsini kaldırınca hep 54321 basıyor. normalde const degerlerin degismesi yasak ya böyle pointer ile kandırabiliyorduk belki compiler const degerleri bir daha kontrol edip düzeltiyordur kafasına göre. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
senko Mesaj tarihi: Aralık 23, 2011 Konuyu açan Paylaş Mesaj tarihi: Aralık 23, 2011 ya işte comp ne yapiyor çözemedim acaba o t değerinin bir kopyasını mı çıkarıyor const T **ppt = (const T**)&pt; şu satırın da hatalı olması lazım bir de 2. ve daha üstün leveldaki pointerlarda normal bir değeri const'a atayamamız lazım aslında, ama buna da izin veriyor. zaten (const T**) zorlamayınca izin vermedi :) Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
SenariouS Mesaj tarihi: Aralık 23, 2011 Paylaş Mesaj tarihi: Aralık 23, 2011 aynen öyle baktım nettende compiler direk hafızaya alıyor t yi, adresse ulaşmadan yapıyor. hepsine volatile verirsen hep 54321 basıyor çünkü Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
senko Mesaj tarihi: Aralık 23, 2011 Konuyu açan Paylaş Mesaj tarihi: Aralık 23, 2011 compiler direk hafızaya alıyor t yi, adresse ulaşmadan yapıyor. burayı anlamadım, hafızaya atıyor derken, gidip t'yi istediğimizde adresine bakmıyor mu bir daha nedir? yani elimizde iki tane mi t olmuş oluyor const la bu şekilde yapınca Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
SenariouS Mesaj tarihi: Aralık 23, 2011 Paylaş Mesaj tarihi: Aralık 23, 2011 evet şöyle diyelim t yi compiler optimizasyon için belli bir yerde tutuyor. (Const dediğine göre bunu kullanma ihtimali yüksek gibi düşünüp) sende arkalardan asıl memorydeki yerini trollüyorsun. Ama compiler hiç bakmıyor o yere çünkü değişmeyecek diye düşünüyor. Dediğim gibi kodu using namespace std; typedef int T; int main(int argc, char** argv) { volatile const T t = 12345; volatile T *pt; volatile const T **ppt = (volatile const T**)&pt; *ppt = &t; *pt = 54321; cout<<t<<endl; volatile const T *pct = &t; cout<<t<<endl; cout<<*pct<<endl; return 0; } çevir o zaman bak değerlere Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Borastus Mesaj tarihi: Aralık 23, 2011 Paylaş Mesaj tarihi: Aralık 23, 2011 şimdi normalde const degerleri hiçbir şekilde degismemesi gerek. ama böyle pointer aracılığı ile dolaylı yoldan degerini degistirebiliyoruz. (bundan sonrası tahmin) bence yeni compilerlar bu çakallıgı engellemek için const degerleri ayrıcana tutuyor bir yerde sonradan degistirmeleri engellemek için. yani eski compilerlar ile degisik sonuçlar verebilir. alakalı bir link bulursam yollarım. Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
SenariouS Mesaj tarihi: Aralık 23, 2011 Paylaş Mesaj tarihi: Aralık 23, 2011 http://learningcppisfun.blogspot.com/2005/08/const-objects-and-piece-of-buggy-code.html Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
senko Mesaj tarihi: Aralık 23, 2011 Konuyu açan Paylaş Mesaj tarihi: Aralık 23, 2011 ikinizin msj'ından sonra daha da bir oturdu kafama sanırım :) Link to comment Sosyal ağlarda paylaş Daha fazla paylaşım seçeneği…
Öne çıkan mesajlar