GMP C++ Arayüzü
Bu yazıda kısaca GMP'nin C++ sınıfı tabanlı arayüzünü açıklamaya çalışacağım.
Tüm GMP C dili türleri ve fonksiyonları, gmp.h başlık dosyası extern "C" niteleyicilerine sahip olduğundan C++ programlarında kullanılabilir, ancak sınıf arayüzünün sunduğu aşırı yüklenmiş fonksiyon ve operatörlerin C++'ta kullanımı daha uygun olabilir.
GMP'nin tüm C++ sınıfları ve fonksiyonları gmpxx.h başlık dosyasıyla sağlanır. Derlenecek programlar libgmpxx ve libgmp kütüphanelerine bağlanmalıdır. Örneğin:
Tanımlanan sınıflar şu şekildedir:
Gerçeklemenin önemli bir özelliği, a = b + c gibi bir ifadede b + c bölümünün geçici öğeler kullanılmadan, karşılık gelen mpz_add öğesine tek bir çağrıyla hesaplanabilmesidir. Doğası gereği a = b * c + d * e gibi ara değerler gösteren ifadeler yine de geçici öğeler kullanır.
Sınıflar ve standart türler, long, unsigned long ve double oldukları sürece ifadelerde serbestçe bir arada kullanılabilir. C++ onları yükselteceğinden int ve float gibi daha küçük türler de bir arada kullanılabilir.
Bool türü doğrudan kabul edilmez, önce bir int'e atılması gerekir. Çünkü C++ herhangi bir işaretçiyi otomatik olarak boole'a dönüştürecektir, bu nedenle GMP eğer bool türünü kabul ederse her türlü geçersiz sınıf ve işaretçi kombinasyonları derlenir ancak neredeyse her zaman ortaya mantıksız bir şey çıkar.
Sınıflardan standart C++ türlerine dönüşümler otomatik olarak yapılmaz, bunun yerine get_si gibi üye fonksiyonlar sunulur.
Ayrıca sınıflardan karşılık gelen GMP C türlerine de otomatik dönüşüm yoktur, bunun yerine sınıfın temelinde yatan C nesnesine bir referans aşağıdaki fonksiyonlarla elde edilebilir:
Diğer yönde de bir sınıf, karşılık gelen GMP C türünden ilklendirilebilir veya açık bir kurucu kullanılırsa karşılık gelen GMP C türüne atanabilir. Her iki durumda da değerin bir kopyası oluşturulur, herhangi bir ilişkilendirme oluşturulmaz. Örneğin:
gmpxx.h başlık dosyasında isim uzayı yoktur, tüm türler ve fonksiyonlar global isim uzayında bulunur. Bu, gmp.h'nin geçmişinden gelen ve uyumluluk için sürdürülen bir durumdur. gmpxx.h tarafından sağlanan ek özellikler GMP adlandırma kurallarına uyar ve herhangi bir şeyle çatışması olası değildir.
Tüm GMP C dili türleri ve fonksiyonları, gmp.h başlık dosyası extern "C" niteleyicilerine sahip olduğundan C++ programlarında kullanılabilir, ancak sınıf arayüzünün sunduğu aşırı yüklenmiş fonksiyon ve operatörlerin C++'ta kullanımı daha uygun olabilir.
GMP'nin tüm C++ sınıfları ve fonksiyonları gmpxx.h başlık dosyasıyla sağlanır. Derlenecek programlar libgmpxx ve libgmp kütüphanelerine bağlanmalıdır. Örneğin:
g++ mycxxprog.cc -lgmpxx -lgmp
Tanımlanan sınıflar şu şekildedir:
- mpz_class
- mpq_class
- mpf_class
Gerçeklemenin önemli bir özelliği, a = b + c gibi bir ifadede b + c bölümünün geçici öğeler kullanılmadan, karşılık gelen mpz_add öğesine tek bir çağrıyla hesaplanabilmesidir. Doğası gereği a = b * c + d * e gibi ara değerler gösteren ifadeler yine de geçici öğeler kullanır.
Sınıflar ve standart türler, long, unsigned long ve double oldukları sürece ifadelerde serbestçe bir arada kullanılabilir. C++ onları yükselteceğinden int ve float gibi daha küçük türler de bir arada kullanılabilir.
Bool türü doğrudan kabul edilmez, önce bir int'e atılması gerekir. Çünkü C++ herhangi bir işaretçiyi otomatik olarak boole'a dönüştürecektir, bu nedenle GMP eğer bool türünü kabul ederse her türlü geçersiz sınıf ve işaretçi kombinasyonları derlenir ancak neredeyse her zaman ortaya mantıksız bir şey çıkar.
Sınıflardan standart C++ türlerine dönüşümler otomatik olarak yapılmaz, bunun yerine get_si gibi üye fonksiyonlar sunulur.
Ayrıca sınıflardan karşılık gelen GMP C türlerine de otomatik dönüşüm yoktur, bunun yerine sınıfın temelinde yatan C nesnesine bir referans aşağıdaki fonksiyonlarla elde edilebilir:
- mpz_t mpz_class::get_mpz_t()
- mpq_t mpq_class::get_mpq_t()
- mpf_t mpf_class::get_mpf_t()
Diğer yönde de bir sınıf, karşılık gelen GMP C türünden ilklendirilebilir veya açık bir kurucu kullanılırsa karşılık gelen GMP C türüne atanabilir. Her iki durumda da değerin bir kopyası oluşturulur, herhangi bir ilişkilendirme oluşturulmaz. Örneğin:
gmpxx.h başlık dosyasında isim uzayı yoktur, tüm türler ve fonksiyonlar global isim uzayında bulunur. Bu, gmp.h'nin geçmişinden gelen ve uyumluluk için sürdürülen bir durumdur. gmpxx.h tarafından sağlanan ek özellikler GMP adlandırma kurallarına uyar ve herhangi bir şeyle çatışması olası değildir.
Merhaba, elinize sağlık, bloglarınız çok güzel. Fakat şu geliştirmeleri yaparsanız kullanımı daha kolay olacaktır.
YanıtlaSil1- Bir blogu okuduktan sonra, bir sonraki yada bir önceki blog'a geçilemiyor, yada ben göremedim. Blogunuzu en baştan, günümüze okumak istiyorum ama zor oluyor.
2- Blog'a yeni yazı yazıldığında bilgilendirme için e-posta kaydı alanını göremiyorum.
3- Size bunları özel mesaj yada e-posta üzerinden göndermek isterdim, e-postanızı bir yere yazarsanız daha kullanışlı olabilir.
Bunları yapıcı eleştiri olarak ele alın lütfen, 2 gündür YATIRIM TAVSİYESİ DEĞİLDİR blogunuzu en baştan okumaya çalışıyorum yazılarınızı, zorlandığım için bunları yazmayı düşündüm. Yorum'u google hesabı ile yaptığı için de buradan yazmayı uygun buldum.
İyi günler
Merhaba, geri bildirimleriniz için çok teşekkürler.
Sil1. Blog içinde önceki ve sonraki kayıtlara geçiş için birer düğme eklenebilir söylediğiniz gibi ama şimdilik bunu yapmayacağım.
http://copypastesave.blogspot.com/2017/06/add-pervious-page-home-and-next-page-in.html
Siz zaten bir şekilde bir yolunu bulmuşsunuzdur ama benim tavsiyem anasayfadan ya da yıllara veya kategorilere göre listeleme yapan sayfalardan her yazıyı yeni sekmede açmak ve bu şekilde okumak olurdu.
https://yatirim-tavsiyesi-degildir.blogspot.com/2020/
https://yatirim-tavsiyesi-degildir.blogspot.com/search/label/hisse
2. Ben bu işlerin sadece RSS ile çözülmesi gerektiğini düşündüğüm için başka düşüncelere pek saygılı davranmamışım bunca zamandır. Bu isteğinizle bunun yanlış olduğunu daha iyi gördüm. Hem bu günlüğüme (son panele) hem de Yatırım Tavsiyesi Değildir günlüğüme (üst bölüme) e-posta ile takip için düğmeler ekledim. Çalışıp çalışmadığını kontrol etmek için ikisine de abone oldum. Sonraki yazılarımda ortaya çıkacak çalışıp çalışmadıkları.
3. E-postam (ozbekanil at gmail.com) Google üzerinden kolayca bulunabiliyor diye düşündüğümden ayrıca görünür bir yere koymamışım sanırım. Şu sayfaya da ekleyeceğim:
https://anilozbek.blogspot.com/p/bu-blog-hakknda.html
4. Kimlerin yorum yapabileceği konusu gözümden kaçmış. Günlük pek yeni sayılmaz, birkaç aylık ama yeni yeni yorum almaya başladığı için ancak sizin söylemenizle dikkatimi çekti. Artık sadece "Google Hesabına sahip kullanıcı"lar değil "Herkes" yorum yapabilecek.
Bunlar nedenleriyle birlikte çok güzel belirtilmiş yapıcı eleştirilerdi, çok teşekkürler. Bundan sonra da her türlü konuda eleştiri yaparsanız sevinirim.
İyi günler, kazançlı yatırımlar.
Sağlıcakla.