C'e devam mı yoksa C++ a geçmeli mi?

Başlatan hasankara, 14 Eylül 2014, 21:51:07

hasankara

Bu gün xc32 derleyicisi ile c++ denemesinde bulundum. basit bir typedef class denemesi yaptım. projeye hem c hem cpp dosyası ekleyerek derleme denemesi yaptım ikisini de tek projede sorunsuz derleyebiliyor. cpp dosyası içerisinde c kütüphanelerini include edip kullanabiliyoruz ancak tam tersini, yani c dosyasında cpp kütüphanelerini kullanamıyoruz.

daha önceden c# nesne yapısını kullanmış birisi olarak c++ da pek yabancı gelmedi. Çoğunlukla gömülü yazılımı ile ilgileniyor olmam, cpp e geçiş konusunda beni düşünmeye teşvik ediyor. özellikle xc32 de cpp derleme olanağı sağlanırken xc8 ve xc16 da bu imkan sunulmamış. Ben ise yazdığım kütüphanelerin tüm ortamlara kolaylıkla uyarlanabilir olmasına gayret gösterir iken bir yandan da cpp nin gelişmiş yazım standartları sağlaması göz dolduruyor.

geçiş konusunda göz önünde bulundurmam gereken diğer noktalar sizce neler olmalı. bu konuda siz neler önerirdiniz?


baran123

Tam bir yanıt değil ama şöyle söyliyebilirim, 2 çeşit işi aynı aynda yapmaya çalışmanız veya birini bırakıp diğerini başlamanız biraz zaman ve uğraş alabilir 1. de iyi iseniz daha da geliştirin kendinizi.Çok çeşit değil, ne kadar iyi bildiğimiz önemli diye düşünüyorum :) tabi tercih size kalmış

Tagli

PIC32 ile hiç çalışmadım, ama XC16 ve XC8 ile yaptığım projelerde, özellikle kodun organizasyonu açısından sık sık C++'ı aradığım olmuştur. Ancak, gerek C++'ın dinamik bellek yönetimini gerekse XC32'nin bu konuyla ilgili davranışını iyi anlamak gerekiyor. Ayrıntılara dikkat edilmezse, nesneler arası işlemler performansta ciddi kayıplara neden olabilir. C++, nesnelerle ilgili işlemlerde arka planda gizlice geçici nesne oluşturma, bunu bir başka nesneye atama ve geçici nesneyi tekrar silme gibi işlemler yapabilir. XC32'nin bu gibi durumlara yaklaşmı nasıldır bilmiyorum ama standartlar derleyiciye çok fazla esneklik sunmuyor.
Gökçe Tağlıoğlu

Karamel

Hocam c ile c++ arasinda ne gibi farkliliklar var? c++ nedir?

Gökhan BEKEN

Özel mesaj okumuyorum, lütfen göndermeyin.

Recep METE

Alıntı yapılan: Karamel - 15 Eylül 2014, 18:16:12
Hocam c ile c++ arasinda ne gibi farkliliklar var? c++ nedir?

C de bir günde yazdığın kodu C++ da bir saatte yazarsın.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

mufitsozen

Alıntı yapılan: semfero - 15 Eylül 2014, 19:14:13
C de bir günde yazdığın kodu C++ da bir saatte yazarsın.

ckan hatayida 4 gunde debug eder bulursun!  :P  :D
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

hasankara

Tagli dinamik bellek yönetimli olmasa da typedef struct larla c de de kod organizasyonunu yapabilmek adına kendimi avutabilecek yöntemler geliştirdim. ama yinede tam anlamıyla dinamik anlamda instance almak gibi ve tek bir parantezde tek sınıfı toparlama gibi rahat bir şekilde yazma olanağı sağlayamıyor. Birde bu yöntem aynı işler için program hafızasını daha idareli kullanmamızı sağlayabiliyor. io ları çok dert etmiyorum karakter girdi çıktı olarak, gerçi standartlara uygun olması açısından önemli sayılabilir ama printf ve scanf komutlarına pek ihtiyaç duymuyorum diyelim.

typedef struct {
    unsigned char mlt;
    unsigned int timerykl;
}Zaman_ms;

unsigned char ZamanIzle(Zaman_ms *tip, unsigned int ms) {
    switch (tip->mlt) {
        case 0:
            tip->timerykl = timer_ms;
            tip->mlt = 10;

        case 10:
            if (timer_ms - tip->timerykl > ms)tip->mlt = 0;
            break;
    }
    return tip->mlt;
}


buraya kadarı kütüphane içeriği idi , kullanımı ise ;
void main(void){


    static Zaman_ms s1hz, s2hz;

   while(1){
   if (ZamanIzle(&s1hz, 500) == 0)PORTDbits.RD7 = ~PORTDbits.RD7; // 1 hz led toggle yapilir
   if (ZamanIzle(&s2hz, 250) == 0)PORTDbits.RD6 = ~PORTDbits.RD6; // 2 hz led toggle yapilir
   // ... diger sonsuz dongü kodları
   }

}


Yakın zamanda bu kütüphanemi yayınlamayı da düşünüyorum. lcd buton gibi temel işlerle alakalı bir kütüphane hazırlamaktayım kullanımı kolay ve özellikle platformdan bağımsız olmasına özen gösterdiğim kütüphane için bir de acaba c++ a mı çevirsem diye düşünerek fikir almak istemiştim. Bu koşulları düşünerek bu tarz bir kütüphaneyi c de mi yoksa c++ da mı yayınlamak daha anlamlı olur?

Tagli

Platform bağımsızlığını arttırmak için C kütüphanesinin etrafını C++ ile çevirebilirsin (wrapper deniyor, Türkçe karşılık bulamadım).
C'de struct'lar ile nesne yönelimli yazılım az çok yazılabiliyor ama çirkin gözüküyor. Başka çare olmadığında (XC16 mesela) mecburen ben de öyle yapıyorum.
Gökçe Tağlıoğlu

hasankara

#10
mplabx de şunu denedim; program tools/options/embedded ayarlarında asm, c, c++ derleyicilerini ayrı ayrı seçebiliyoruz. ben c derleyici seçeneğinde gcc den g++ a çevirerek derleme denemesini yaptığımda tıpkı gcc deki gibi sorunsuz derlendiğini gördüm. output penceresinde dosyaların g++ la derlendiği de görülüyor. aynı zamanda bu derlenmiş programı da donanımda problemsiz çalıştırabildim.

Ben böyle olduğunu görünce c++ derleyicisi ile c de yazılmış dosyaların derlenebileceğini düşündüm. bu noktada belki yanılıyorumdur ama zaten bu aşamayı çok dert etmemiştim. çünkü zaten düşündüren nokta c++ da yazar isek bunu c derleyicisi ile kullanamayacak olmamız. benim bu deneyimimde belki wrapper muhabbetini derleyici kendisi yapmıştır zaten dediğim gibi c de yazdıktan sonra bunu c++ derleyicisi ile ya kullanamaz sak diye aklıma bir soru gelmemişti bile.

veya nesne.fonksiyon(); yapısını c++ dışında elde etme şansımız olabilir mi? dinamik olmasa da olur, yani nesneyi öldürmemize gerek yok orda kalsın. yada nesne oluşacak ise yine onu program yazan kişi oluştursun.

şimdi konusu açılınca şu soru geldi aklıma. nesneyi öldür dediğimiz de program hafızasındaki asm kodlarını mı silecek yada nesne oluştur dendiğinde daha önce yazılmamış asm kodlarını program hafızasına kendi yükleyip mi yürütecek? daha önceleri pic32 de program hafızasından veri okuma deneyimim oldu. tıpkı ram den okur gibi okuyabildiğini gördüm. Bu anlamda işin ucunun donanıma dayanabileceğini tahmin edebiliriz.

mesaj birleştirme:: 15 Eylül 2014, 23:02:47

birde wrapper den kastın şöyle bir şey olabilir mi?
#ifdef	__cplusplus
extern "C" {
#endif

// kütüphane bu boşluğa yazılır

#ifdef	__cplusplus
}
#endif



Tagli

#11
Dinamik hafıza yönetiminin program hafızası ile ilgisi yok. Program değişmiyor, bellekte alan ayırıyor veya serbest bırakıyor sadece. Elbette bellek kullanım durumunu kendi içinde bir kaydını da tutuyor.

C'de bahsettiğin nesne.fonksiyon() yazım olarak elde edilemeyebilir. Bilmiyorum, belki makrolarla falan cambazlık yapılarak bu sonuca ulaşmak mümkün olabilir ama tehlikeli olur. Aslında bir C++ programı, C dilinde ifade edilebilir. C++ ilk çıktığında, ortada derleyicisi yoktu. Ancak C derleyicileri yaygındı tabi. O eski zamanlarda, C++ kodunu C koduna çeviren bir program varmış (adını unuttum). O noktadan sonra da üretilen kod C derleyicileri ile derleniyormuş. Tabi zaman içinde C++ derleyicileri ortaya çıkmaya başlayınca bu programa olan ihtiyaç ortadan kalktı. Gerçi bu şekilde oluşturulan bir C kodunun pek okunabilir olacağını sanmıyorum.

Bu son yazdığın şey, header dosyalarında oluyor ve C++ derleyicisinin C header'ları ile sorun yaşamasını engelliyor sanırım. Aslında, sorun derleyicide değil, linker'da. C++ ve C linker'larının kendi içlerindeki isimlendirme şekilleri farlı, böyle olunca C'de derlenmiş bir kod, C++ ile derlenmiş kodlar ile link edilemiyor, çünkü isimlendirmeler tutmuyor. Header'a eklenen o kısım, header dosyalarında adı geçen birimlerin C isimlendirme şekline göre derlendiğini C++ derleyicisine (aslında galiba linker'a) anlatmak için. Böylece C++ linker'ı, derlenmiş C kodunun isimlendirme şeklinin nasıl olduğunu (yani C'ye göre olduğunu) biliyor. Olay aklımda bu şekilde kalmış ama tamamen yanlış anlamış veya yanlış hatırlıyor olabilirim.

Wrapper yazmak yukarıdaki mesele ile dolaylı olarak ilgili. İşin özü, bir nesne yazacaksın ve bu daha önce yazılmış bir C kütüphanesini kullanacak ama üzerine aslında bir özellik eklemeyecek. Sadece bunu C++ nesnesi olarak çağırmana imkan verecek. Sanırım bunun doğru çalışabilmesi için yazılan C kütüphanesinin header'ında o bölümün olması gerekiyor.

Yine emin değilim ama, bu ihtiyaç sadece derlenmiş kod için geçerli olabilir. C kaynak kodu varsa belki buna gerek kalmıyordur çünkü bu durumda tüm derleme ve link işlemlerini C++ yapıyor.

Bu arada şimdi aklıma geldi, link işlemine Türkçe'de bağlama diyebilir miyiz? Yaygın bir kullanım mıdır?

Ekleme: Biraz hafızamı, biraz da Google'ı kurcalayarak C++ kodunu C'ye dönüştüren programın adını buldum: cfront
Gökçe Tağlıoğlu

hasankara

yani sonuç olarak wrapper işlemi her fonksiyon için tek tek yapılacak ama bunu yapmak şart değil sanırım. sadece c++ da yazdığım belli olsun diye belki bu wrapper işlemi yapılabilir.

c++ ı c e çevirmek güzel ama o derleyiciyi arayüze adapte etmesi noktasında özellikle bu kısımların nasıl yürüdüğünü pek anlamıyorum zaten mplabx kendisi bir sürü ara dosya fln oluşturuyor makefile başta olmak üzere bunlar ne işe yarar şeklinde hiç araştırma yapmamış birisi olarak bu fikri değerlendirmek zor gibi geliyor bana.

xc8 ve xc16 için, c++ derleyemeyecek şekilde bir ayrım yapılması düşündürüyor bir yandan. dinamik bellek yönetim c de de olan bir şey zaten, en kötü dinamik yapı olmadan da işler yürütülebilirdi aslında.

neyse çok dallandırmanın da pek anlamı yok aslında. bir süre daha c nin yolları taşlı demek mantıklı görünüyor. daha sonra bunun üzerine c++ wrapper eklentisi yazılabilir artık. yada şimdi geldi aklıma ön işlem komutlarıyla  #ifdef   __cplusplus   aynı kütüphane içerisine wrapper lanmış tanımlamalar sınıflar fln dahil olur yada olmaz şeklinde de yazılabilir.

Tagli

Gökçe Tağlıoğlu