[Düzeltme] Ymir'den Hatıralar

  • Konuyu açan Konuyu açan Kaiser
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 14
  • Gösterim Gösterim 451

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
Mesaj
4.378
Çözümler
439
Beğeni
4.910
Puan
1.849
Ticaret Puanı
0
Kodlarda gezinirken bir şey dikkatimi çekti.

O da şu:
1748341763502.webp

Argümanı dahil etmek: ❌
Komple yeni fonksiyon oluşturmak: ✅

Bu iki fonksiyon farklı yerlerden farklı sayıda argümanlarla çağrılıyor fakat ikisinin de yaptığı şey aynı.
Bunun neden böyle olduğuna dair bir mantıklı bir yorum bulamadım. Ama gereksiz.

Düzeltme için aşağıdakileri uygulayın.

Dikkat: sonu float * pfY) ile biten fonksiyonu sileceksiniz.

GrpScreen.h: Bulun ve silin.
C++:
Genişlet Daralt Kopyala
void ProjectPosition(float x, float y, float z, float * pfX, float * pfY);

GrpScreen.cpp: Bulun ve silin:
C++:
Genişlet Daralt Kopyala
void CScreen::ProjectPosition(float x, float y, float z, float * pfX, float * pfY)
{
    D3DXVECTOR3 Input(x, y, z);
    D3DXVECTOR3 Output;
    D3DXVec3Project(&Output, &Input, &ms_Viewport, &ms_matProj, &ms_matView, &ms_matWorld);

    *pfX = Output.x;
    *pfY = Output.y;
}

GrpScreen.h içinde az önce silinen fonksiyon ile aynı isimde olan şu imzayı göreceksiniz:
C++:
Genişlet Daralt Kopyala
void ProjectPosition(float x, float y, float z, float * pfX, float * pfY, float * pfZ);

Bunu şu şekilde değiştirin:
C++:
Genişlet Daralt Kopyala
void ProjectPosition(float x, float y, float z, float * pfX, float * pfY, float * pfZ = nullptr);

Son olarak GrpScreen.cpp içindeki şu fonksiyona gelin:
C++:
Genişlet Daralt Kopyala
void CScreen::ProjectPosition(float x, float y, float z, float * pfX, float * pfY, float * pfZ)
{
    D3DXVECTOR3 Input(x, y, z);
    D3DXVECTOR3 Output;
    D3DXVec3Project(&Output, &Input, &ms_Viewport, &ms_matProj, &ms_matView, &ms_matWorld);

    *pfX = Output.x;
    *pfY = Output.y;
    *pfZ = Output.z;
}

Aşağıdaki gibi z verisini düzenleyin:
C++:
Genişlet Daralt Kopyala
void CScreen::ProjectPosition(float x, float y, float z, float * pfX, float * pfY, float * pfZ)
{
    D3DXVECTOR3 Input(x, y, z);
    D3DXVECTOR3 Output;
    D3DXVec3Project(&Output, &Input, &ms_Viewport, &ms_matProj, &ms_matView, &ms_matWorld);

    *pfX = Output.x;
    *pfY = Output.y;
    if(pfZ) // Bu önemli
        *pfZ = Output.z;
}
 
Sanırsam bu bi hata değil. Daha önce de aynı fonksiyon ismi ile oluşturulan fonksiyonları görmüştüm sadece aldığı argümanlar değişiyordu neden böyle bi yöntem tercih edildiğini araştırmadım ancak daha fazla örneği var bunun
 
Kodlarda gezinirken bir şey dikkatimi çekti.

O da şu:
23653 eklentisini görüntüle
Argümanı dahil etmek: ❌
Komple yeni fonksiyon oluşturmak: ✅

Bu iki fonksiyon farklı yerlerden farklı sayıda argümanlarla çağrılıyor fakat ikisinin de yaptığı şey aynı.
Bunun neden böyle olduğuna dair bir mantıklı bir yorum bulamadım. Ama gereksiz.

Düzeltme için aşağıdakileri uygulayın.

Dikkat: sonu float * pfY) ile biten fonksiyonu sileceksiniz.

GrpScreen.h: Bulun ve silin.
C++:
Genişlet Daralt Kopyala
void ProjectPosition(float x, float y, float z, float * pfX, float * pfY);

GrpScreen.cpp: Bulun ve silin:
C++:
Genişlet Daralt Kopyala
void CScreen::ProjectPosition(float x, float y, float z, float * pfX, float * pfY)
{
    D3DXVECTOR3 Input(x, y, z);
    D3DXVECTOR3 Output;
    D3DXVec3Project(&Output, &Input, &ms_Viewport, &ms_matProj, &ms_matView, &ms_matWorld);

    *pfX = Output.x;
    *pfY = Output.y;
}

GrpScreen.h içinde az önce silinen fonksiyon ile aynı isimde olan şu imzayı göreceksiniz:
C++:
Genişlet Daralt Kopyala
void ProjectPosition(float x, float y, float z, float * pfX, float * pfY, float * pfZ);

Bunu şu şekilde değiştirin:
C++:
Genişlet Daralt Kopyala
void ProjectPosition(float x, float y, float z, float * pfX, float * pfY, float * pfZ = nullptr);

Son olarak GrpScreen.cpp içindeki şu fonksiyona gelin:
C++:
Genişlet Daralt Kopyala
void CScreen::ProjectPosition(float x, float y, float z, float * pfX, float * pfY, float * pfZ)
{
    D3DXVECTOR3 Input(x, y, z);
    D3DXVECTOR3 Output;
    D3DXVec3Project(&Output, &Input, &ms_Viewport, &ms_matProj, &ms_matView, &ms_matWorld);

    *pfX = Output.x;
    *pfY = Output.y;
    *pfZ = Output.z;
}

Aşağıdaki gibi z verisini düzenleyin:
C++:
Genişlet Daralt Kopyala
void CScreen::ProjectPosition(float x, float y, float z, float * pfX, float * pfY, float * pfZ)
{
    D3DXVECTOR3 Input(x, y, z);
    D3DXVECTOR3 Output;
    D3DXVec3Project(&Output, &Input, &ms_Viewport, &ms_matProj, &ms_matView, &ms_matWorld);

    *pfX = Output.x;
    *pfY = Output.y;
    if(pfZ) // Bu önemli
        *pfZ = Output.z;
}
Tam olarak ne amaçla yaptıklarını bilemesemde, şöyle birşey söyleyebilirim.
Biliyorsunuz ki metin2 kaynak kodları birçok senior ve junior developerler sonucu ortaya çıktı en azından ben öyle biliyorum. Bi yerlerimden uyduruyoda olabilirim. İlk fonksiyonu 1 dev yazdı. Belki ilk yazılan fonksiyon sadece pFX ve pFY döndürüyordu. Daha sonra pFZ'nin de gerekli olabileceği bir yerde ihtiyaç oldu ama tüm çağıran fonksiyonları değiştirmek zahmetliydi. O yüzden yeni bir versiyon olarak başka bir devde alttaki fonksiyonu yazdı ve kodlamaya devam etti, ilk fonksiyonu düzenlsene projenin diğer yerlerinde sorun ya da bug oluşturabileceğini düşündü kendi fonksiyonunu yazmış olabilir.
Metin2nin has kadrosundan birisimi yaptı bilmiyorumda bi ara metin2 de 3. Boyut görmüştüm. İşte köprülerin altından felan geçilebilen maplar vs... yani z ekseni de eklenmişti. Belki o tarz birşey için eklendi ama sonrasında öyle ce kaldı.
 
Sanırsam bu bi hata değil. Daha önce de aynı fonksiyon ismi ile oluşturulan fonksiyonları görmüştüm sadece aldığı argümanlar değişiyordu neden böyle bi yöntem tercih edildiğini araştırmadım ancak daha fazla örneği var bunun
Tamam sonuçta hata işte :D

Tam olarak ne amaçla yaptıklarını bilemesemde, şöyle birşey söyleyebilirim.
Biliyorsunuz ki metin2 kaynak kodları birçok senior ve junior developerler sonucu ortaya çıktı en azından ben öyle biliyorum. Bi yerlerimden uyduruyoda olabilirim. İlk fonksiyonu 1 dev yazdı. Belki ilk yazılan fonksiyon sadece pFX ve pFY döndürüyordu. Daha sonra pFZ'nin de gerekli olabileceği bir yerde ihtiyaç oldu ama tüm çağıran fonksiyonları değiştirmek zahmetliydi. O yüzden yeni bir versiyon olarak başka bir devde alttaki fonksiyonu yazdı ve kodlamaya devam etti, ilk fonksiyonu düzenlsene projenin diğer yerlerinde sorun ya da bug oluşturabileceğini düşündü kendi fonksiyonunu yazmış olabilir.
Metin2nin has kadrosundan birisimi yaptı bilmiyorumda bi ara metin2 de 3. Boyut görmüştüm. İşte köprülerin altından felan geçilebilen maplar vs... yani z ekseni de eklenmişti. Belki o tarz birşey için eklendi ama sonrasında öyle ce kaldı.
Metin2'nin internet cafe gibi bir ofiste yapıldığını düşünürsek her şey mümkün
 
Aslında bu bir hata değil, yazılım terminolojisinde buna "
Linkleri görebilmek için giriş yap veya kayıt ol.
" deniyor. Yazdığınız bir fonksiyonla bağlantılı yeni bir sistem yazdınız fakat bu sefer daha fazla argümana ihtiyacınız var, bu durumda ilk fonksiyon değiştirilmez ve sadece farklı argümanlara sahip bir kopya fonksiyon oluşturulur, bu durumun sebebi çoğu zaman birden fazla kişinin çalıştığı işlerde daha anlaşılabilir olması ve hangi çağrının hangi versiyonu kullandığını ayırt etmenin bazen yardımcı olması. Yine de tarz ile alakalıdır ve değiştirilebilir tabii ki, ben şahsen ilk halini tercih ederim, sevgiler.
 
Adamlar sonradan doğabilecek ihtiyaçlar için bunu erkenden yapmışlar. İki fonksiyonun yaptığı iş aynı olunca adamın dikkatini çekmiş. Daha sonra iki fonksiyon farklı işler yapmaya başlasaydı, aynı olan kısımlar için ek bir fonksiyon yazarlardı muhtemelen. Şu an için gereksiz gözüküyor.
 
Son düzenleme:
Aslında bu bir hata değil, yazılım terminolojisinde buna "
Linkleri görebilmek için giriş yap veya kayıt ol.
" deniyor. Yazdığınız bir fonksiyonla bağlantılı yeni bir sistem yazdınız fakat bu sefer daha fazla argümana ihtiyacınız var, bu durumda ilk fonksiyon değiştirilmez ve sadece farklı argümanlara sahip bir kopya fonksiyon oluşturulur, bu durumun sebebi çoğu zaman birden fazla kişinin çalıştığı işlerde daha anlaşılabilir olması ve hangi çağrının hangi versiyonu kullandığını ayırt etmenin bazen yardımcı olması. Yine de tarz ile alakalıdır ve değiştirilebilir tabii ki, ben şahsen ilk halini tercih ederim, sevgiler.
Evet özellikle ayırt etme konusunda haklısın ancak böylesine basit ve küçük bir fonksiyon için (şahsen) böyle bir ayrıştırmaya gerek duymazdım. Teferruatlı veya birbirinden farklı gövdelere sahip olan bloklar olsaydı elbette dokunmazdım ama her iki fonksiyonun yaptığı işlem birebir aynı olduğu için sonradan çağrılan argümanı nullptr şeklinde diğerine sabitlemek ve fazlalık olan fonksiyonu kaldırmak daha cazip geldi.
Nihayetinde argüman nullptr olduğu için src içindeki hem 5 hem de 6 argümanlı çağrıları aynı amaçla sorunsuzca kabul ediyor ve yapılan işlem zaten aynı olduğu için iki farklı blok kıyaslamasına da gerek kalmamış oluyor. İlla ve illa kullanılan versiyonu tespit etmek gerekirse de, Tracenf ile argümanları loga düşürmek çağrıları ayırt etmede aynı sonucu verecektir. Tabi bu kullanım tercihe göre değişir ama böylesine aynı ve benzer senaryolarda ikinci fonksiyonlar bana hep fazlalık ve gereksiz geliyor :)
 
Evet özellikle ayırt etme konusunda haklısın ancak böylesine basit ve küçük bir fonksiyon için (şahsen) böyle bir ayrıştırmaya gerek duymazdım. Teferruatlı veya birbirinden farklı gövdelere sahip olan bloklar olsaydı elbette dokunmazdım ama her iki fonksiyonun yaptığı işlem birebir aynı olduğu için sonradan çağrılan argümanı nullptr şeklinde diğerine sabitlemek ve fazlalık olan fonksiyonu kaldırmak daha cazip geldi.
Nihayetinde argüman nullptr olduğu için src içindeki hem 5 hem de 6 argümanlı çağrıları aynı amaçla sorunsuzca kabul ediyor ve yapılan işlem zaten aynı olduğu için iki farklı blok kıyaslamasına da gerek kalmamış oluyor. İlla ve illa kullanılan versiyonu tespit etmek gerekirse de, Tracenf ile argümanları loga düşürmek çağrıları ayırt etmede aynı sonucu verecektir. Tabi bu kullanım tercihe göre değişir ama böylesine aynı ve benzer senaryolarda ikinci fonksiyonlar bana hep fazlalık ve gereksiz geliyor :)
Tabii tamamen kodlama stiliyle alakalı bir durum, yani işleyişte bir fark olmaz ikisi de sorunsuz işini yapacaktır. Benim en çok takıldığım kodlama stili olayı süslü parantez kullanımı mesela, parantezi fonksiyon sonunda açılmış görünce titremeye başlıyorum ama aynı şekilde benim farklı satırda açtığımı görünce titreyen insanlar da biliyorum :ROFLMAO: , o yüzden bu tarz şeyler biraz kişisel tercih ve öğrenme aşamasındayken neyi veya kimi takip ettiğine göre şekillenebiliyor.
 
Kaiser benim kodları okusa galiba panik atak geçirir 😂😂
Yorumlarını okuyunca da aynı şey oluyor

Tabii tamamen kodlama stiliyle alakalı bir durum, yani işleyişte bir fark olmaz ikisi de sorunsuz işini yapacaktır. Benim en çok takıldığım kodlama stili olayı süslü parantez kullanımı mesela, parantezi fonksiyon sonunda açılmış görünce titremeye başlıyorum ama aynı şekilde benim farklı satırda açtığımı görünce titreyen insanlar da biliyorum :ROFLMAO: , o yüzden bu tarz şeyler biraz kişisel tercih ve öğrenme aşamasındayken neyi veya kimi takip ettiğine göre şekillenebiliyor.
Buna sadece ben takıntılıyım sanıyordum.. O parantez muhabbeti beni de çok ayar ediyor :D
Ve evet, önemli olan kodun sağlamlığı.. gerisi teferruat :LOL:
 
Geri
Üst