Forum: Diğer Konular RSS
C kodlama standardı
Sayfa:  önceki  1  2  3 
erdem (Moderatör) #31
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 7512
Ya da biraz önce konuştuğumuz gibi
    int * dizi = dizimiz[0];
Salih Dinçer:
        printf("%d\t", *(&dizimiz[0][0] + i));
        printf("%2d", dizi[i]);
şeklinde de yazdırabiliyoruz :)

Bir de biraz konu dışına taşarak, C99 ile gelen ilklendirme şeklini

    int dizi[6] = {[5] = 212};

iki boyutlu dizilerde kullanabiliyor muyuz acaba.
Bu mesaj erdem tarafından değiştirildi; zaman: 2012-08-29, 09:30.
Değişiklik nedeni: ufak bir soru ekledim
Avatar
Salih Dinçer #32
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 7513
Evet Erdem...:)

Tam da, PicProje'ye cevap yazıyordum ki orada bu konuları bu kadar derinlemesine tartışmamızın bir kaç kişiye (belki de ikimize!) faydasının olmasından cevabı buraya yazıyorum. Çünkü biz burada PicProje kadar kalabalık olmasak da en azından tartışmadan faydalanan kişi sayısı ikinin üzerinde...

Yine de D'ye nefer (Dici...:)) yetiştirmek için sık sık forumlara birlikte dalalım mı? Aslında yetiştirmek yanlış kelime. İnsanların ilgisini çekmek için yapmamız gereken bir yayılma politikası olabilir. Çünkü ceviz kabuğu gibi içimize çekilmenin manası yok. "ceviz" demişken (başka başlıkta tartışmak üzere...) Ceviz Forum'da D kategorisi n'oldu? Bu konuda foruma dair istekler kısmında bir başlık açmıştım. Sanırım hiç ilgilenen olmadı...:(

Konuyu Ali hocama havale ediyorum...:)

acehreli:
C'de dizi diye ayrıca bir tür olmadığı için öyle oluyor. D'de C dizilerine en yakın olan şey statik dizilerdir (uzunluğu derleme zamanında bilinen).

Burada bir şey daha anlıyoruz: D'de dizi içine dizi yerleştirdiğimizi sanıyoruz ama aslında içtekiler dilim. Dilimlerin de dizi kavramıyla tek yakınlıkları, D çalışma ortamının (D runtime) bizim için yönettiği elemanlara erişim sağlamak.

Salih, gördüğün 16 bayt herhalde hizalama (alignment) ile ilgilidir. Şurada "Türlerin .alignof niteliği" başlığında var:

  http://ddili.org/ders/d/bellek_yonetimi.html

Belki 64 veya 32 bit derleme arasında fark görebilirsin.

Şimdi biraz daha düşündüm: Benim sistemimde 16 bayt tutmasının nedeni, dilimlerin iki üyesinin de 8 bayt olmasından geliyor: size_t türünde uzunluk ve eleman göstergesi.

Evet, bu konuları ben de sakin bir zamanım da etraflıca düşünmek istiyorum. Çünkü D'yi daha iyi anlayabilmek için (arta alanda ne haltar çevirdiğini bilebilmek) az da olsa işaretçilere girmek gerekiyor. Erdem sayesinde bu gerçekleşti ve hayatımda hiç bu kadar işaretçilere yakınlaştığımı hatırlamıyorum...:)

Peki ya C++ standartları desek...

Örneğin şu an elimde bir CPP project var ve ben o gelenekten yetişmediğim için bazı yapıları anlayamıyorum! Özellikle aşağıdaki kod; yıldız yerinez adres işaretinin sola bitişik yazılmış. Ayrıca dönüş değeri belli olmayan (zannedersem void?) işlevler görüyorum. Bu aşağıdaki sadece biri...:(
struct Settings : public MethodConfig
{
    AsrJuristicsMethod asr_juristics_method;         // Juristic method for Asr
    double asr;                                      // Asr minutes if method is minutes
    HighLatitudeMethod high_latitudes_method;        // adjusting method for higher latitudes
 
    Settings& operator=(const MethodConfig& method_config)
    {
        reinterpret_cast<MethodConfig&>(*this) = method_config;
        return *this;
    }
};
Bu CPP kodunun D karşılığı olabilir mi? Bana yardımcı olacaklardan Allah razı olsun...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-08-29, 09:38.
Değişiklik nedeni: Ben de en sona damardan bir soru ekledim...:)
erdem (Moderatör) #33
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
(Dici...:))

İyiymiş :)

Salih Dinçer:
Örneğin şu an elimde bir CPP project var ve ben o gelenekten yetişmediğim için bazı yapıları anlayamıyorum! Özellikle aşağıdaki kod; yıldız yerinez adres işaretinin sola bitişik yazılmış. Ayrıca dönüş değeri belli olmayan (zannedersem void?) işlevler görüyorum. Bu aşağıdaki sadece biri...:(
    Settings& operator=(const MethodConfig& method_config)
    {
        reinterpret_cast<MethodConfig&>(*this) = method_config;
        return *this;
    }
};

Burada bir olay yok. Burada Settings & operator=(const MethodConfig &) kısmı kopyalayarak atama işlecinin farklı görev yüklenmiş hali.

Bunun D karşılığını yazmaya gerek yok diye düşünüyorum ama emin değilim.

*this demek nesnenin kendisi demek. İki tane nesneyi birbirine atamış. Sonra reinterpret_cast ile taban sınıfa bir referansa çevirmiş.

C++ kodu olarak düşününce bunlar çerez sayılır  ;-)
acehreli (Moderatör) #34
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #32
Salih Dinçer:
yıldız yerinez adres işaretinin sola bitişik yazılmış.

Öyle kullanıldığında adres işareti değil, "referanstır". D'deki 'ref'in eşdeğeri.

Ayrıca dönüş değeri belli olmayan (zannedersem void?) işlevler görüyorum.

D ile aynı: Dönüş değeri belli olmayan değil, dönüş değeri olmayan demek.

Bu CPP kodunun D karşılığı olabilir mi?

Tesadüf, daha geçen hafta "Kurucu ve Diğer Özel İşlevler" bölümüne eklemeler yaptım ama henüz siteye koymadım. Yapıların opAssign() işleci tanımlanırken dönüş türü konusunda üç seçenek var.

Özel bir nedeni yoksa dönüş türü yapının türü olabilir:

struct Süre
{
    int dakika;
 
    Süre opAssign(Süre sağdaki)
    {
        writefln(
            "dakika, %s değerinden %s değerine değişiyor",
            this.dakika, sağdaki.dakika);
 
        this.dakika = sağdaki.dakika;
 
        return this;
    }
}
// ...
    auto süre = Süre(100);
    süre = Süre(200);          // atama 

Ondan sonra şöyle bir bölüm ekliyorum:

Eniyileştirmeler

Dönüş türünün Süre olarak seçilmesinin nedeni, birden fazla nesnenin aynı satırda atandığı söz diziminin desteklenmesidir:

    auto a = Süre(1);
    auto b = Süre(2);
    auto c = Süre(3);
 
    a = b = c;

Önce c nesnesi b'ye, sonra da o atama işleminin döndürdüğü Süre nesnesi a'ya atanır:

dakika, 2 değerinden 3 değerine değişiyor
dakika, 1 değerinden 3 değerine değişiyor


Yukarıdaki gibi zincirleme atama işleminin kullanılmasının önemli olmadığı durumlarda opAssign'ın dönüş türü void olarak seçilebilir ve dolayısıyla return this satırı da yazılmaz:

    void opAssign(Süre sağdaki)
    {
        // ... 'return this;' yoktur
    }

Yapının kopyalanmasının fazla zaman aldığı durumlarda hem parametre hem de dönüş türü ref const olarak işaretlenebilir:

    ref const(BüyükBirTür) opAssign(ref const(BüyükBirTür) sağdaki)
    {
        // ...
    }

Salih, O C++ kodu 'a = b = c' gibi bir yazımı desteklemek için *this ile "bu nesnenin kendisine referans" döndürüyor. Yukarıda dönüş türü 'ref' olan son D işlevinin eşdeğeri.

Ali
Avatar
Salih Dinçer #35
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ancak şimdi deneme fırsatı bulabiliyorum...

Aslında C++'da std::pair<int, int> diye bir dönüş türü sorunuyla da ilgilenmek zorundaydım. Neyse ki onu iki elemanlı bir dilim şeklinde döndürerek kolaylıkla hallettim. Fakat şu son konuştuğumuz mevzu denediğimde şu hatayı aldım:

pt.d(100): Error: function pt.Settings.opAssign has no return statement, but is expected to return a value of type const(MethodConfig)
make: *** [p] Hata 1


Böyle bir hata verince bir şey döndürmek gerektiğini anlıyorum ve şu şekilde kodluyorum:
  ref const(MethodConfig) opAssign(ref const(MethodConfig) sağdaki)
  {
        this = sağdaki;
        return this;
  }
O zaman da Error: cast(const(MethodConfig))this.method_config is not an lvalue hatası alıyorum. Çünkü bir şeyleri ters yapıyor olmalıyım. Peki başa saralım; nereden gelmişim...

(Korkmayın, çocukluğuma inmeyeceğim...:))

Aslında temelde iki yapımız (tabi onların da üye yaptığı başka yapılar da) var. Bunu yukarıda paylaşmıştım ama yapılarda miras alma D'de olmasa gerek? Ben de opAssign'lı yapıyı (struct Settings : public MethodConfig { ... })  şu şekilde yaptım:
struct Settings {
  MethodConfig method_config;
  alias method_config this;
  // ...
}
Peki sizce nerede hata yaptım?

Teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #36
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
pt.d(100): Error: function pt.Settings.opAssign has no return statement, but is expected to return a value of type const(MethodConfig)
make: *** [p] Hata 1


Tahmin: Dönüş türünü void yapmak yerine const(MethodConfig) olarak bıraktın ve return deyimi yazmadın.

Böyle bir hata verince bir şey döndürmek gerektiğini anlıyorum ve şu şekilde kodluyorum:
  ref const(MethodConfig) opAssign(ref const(MethodConfig) sağdaki)
  {
        this = sağdaki;
        return this;
  }
O zaman da Error: cast(const(MethodConfig))this.method_config is not an lvalue hatası alıyorum. Çünkü bir şeyleri ters yapıyor olmalıyım.

Olaylar karışmaya başlayınca o kodu bir kenara bırak ve basitten başla. Şunlar bende derleniyor:

struct S
{
    void opAssign(S sağdaki) const
    {}
}
 
struct MethodConfig
{
    ref const(MethodConfig) opAssign(ref const(MethodConfig) sağdaki)
    {
        // Bunu yapmayın; yine bu işlevi çağıracağı için takılır.
        // this = sağdaki;
        return this;
    }
}
 
void main()
{
    S s0, s1;
    s0 = s1;
 
    MethodConfig m0, m1;
    m0 = m1;
}

yapılarda miras alma D'de olmasa gerek?

Doğru.

Ben de opAssign'lı yapıyı (struct Settings : public MethodConfig { ... })  şu şekilde yaptım:
struct Settings {
  MethodConfig method_config;
  alias method_config this;
  // ...
}
Peki sizce nerede hata yaptım?

Teşekkürler...

Aşağıdakinden farklı herhalde çünkü bu da derleniyor:

struct MethodConfig
{
    ref const(MethodConfig) opAssign(ref const(MethodConfig) sağdaki)
    {
        // Bunu yapmayın; yine bu işlevi çağıracağı için takılır.
        // this = sağdaki;
        return this;
    }
}
 
struct Settings {
  MethodConfig method_config;
  alias method_config this;
  // ...
}
 
void main()
{
    Settings s0, s1;
    s0 = s1;
}

Ali
Avatar
Salih Dinçer #37
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam, büyük zahmet verdim kusura bakma ama bu özelliğe sanırım D'de ihtiyacımız yokmuş! Çünkü...

Öncelikle bu özelliği en son tarif ettiğin şekilde uygulayınca derleme sorunu kalktı. Ben Settings yapısı içinde kullanmıştım ki herhalde hatalı olduğum kısım burasıydı. Ama bu sefer de matematiksel hesaplar karıştı, çarman çurman oldu...:)

Dedim, şunu kaldırayım bakalım ne olacak? Çalıştı! Yani anlamıyorum ama CPP'de gereken D'de olayları karıştırıyor. Yakında kodu yayınladığımda tekrar birlikte bakarız...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #38
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
İşte ihtiyaç duymadığının kanıtı:
    // Set the calculation method
    void set_calc_method(CalculationMethod new_calc_method)
    {
        calc_method = new_calc_method;
        settings = method_params[calc_method]; // opAssign olmazsa bu satır CPP'de patlıyor!
    }
Belki fotoğrafın tamamını görmediğiniz için pek bir şey anlaşılmıyordur. Ama kısaca anlatırsam, bu işlev kurucu işlev içinde çağrılıyor ve D'de opAssign işlevine ihtiyaç duymuyor...

Bu arada, "geri dönüş değeri belli olmayan işlevler (solu boş olan) CPP'de nedir?" gibi bir sorum olmuştu. Meğer o kurucu işlevmiş. Merak ediyorum da D'deki this() işlevi CPP'deki sınıflarda yok mudur?

Teşekkürler...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #39
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Son sorumu geri alıyorum; meğer sınıf ile aynı ismi taşıyan işlev kurucu imiş...:)
Kurucu Fonksiyonlar (Constructors)
Kurucu fonksiyonlar üyesi oldukları sınıftan bir nesne yaratılırken kendiliğinden canlanırlar. Bu tür fonksiyonlar bir nesnenin kurulması aşamasında yapılması gereken işleri, örneğin verilere uygun başlangıç değerleri atamak için kullanılırlar. Kurucu fonksiyonlar üyesi oldukları sınıf ile aynı ismi taşırlar. Kurucular parametre alırlar, ancak geri dönüş değerleri yoktur. Geri dönüş tipi olarak herhangi bir tip (void bile) yazılmaz.

Kurucu fonksiyonlar nesne yaratılırken sınıfın dışından sınıfın açık (public) üyeleri arasında yer almalıdırlar. Kurucu fonksiyonlar işlevlerine ve yapılarına göre bazı alt gruplara ayrılırlar. İlk grupta parametre verilmeden çağrılabilen parametresiz kurucu
fonksiyonlar yer alır.
©1999-2002 Dr. Feza BUZLUCA
Son günlerde şuradaki dersleri takip etmeye başladım. CPP'yi tamamen öğrenemesem de şu basit soruları aşmalıyım... :nuts:

Ayrıca hocanın sitesinde Türkçe belgeler de var: http://web.itu.edu.tr/~buzluca/cpp/
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #40
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
C++ yapıları da sınıflarla aynı kefeye koyar ve aynı yetenekleri verir. (Tek fark, erişim haklarındadır.)

D ise yapıları C'nin yapılarına yaklaştırmıştır. Yapılarda kopyalama ve atama otomatiktir ama gerektiğinde tanımlanabilir. (Tabii D'de kurma da otomatiktir; C'de kurucu olmadığı için söylemedim.)

Ali
erdem (Moderatör) #41
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #39
Salih Dinçer:
Son günlerde şuradaki dersleri takip etmeye başladım.
Oradaki notları inceledim ancak pek beğenmediğimi söylemeliyim  :-(
ComplexT ComplexT::operator+(const ComplexT& z) const
{
    double re_new, im_new;
    im_new = re + z.re;
    im_new = im + z.im;
    return ComplexT(re_new, im_new);
}

Örneğin operator+= işlecine de ihtiyacımız olacak.

Karmasik & operator+= (Karmasik const & diger)
{
    reel_ += diger.reel_;
    sanal_ += diger.sanal_;
    return *this;
}

O zaman operator+'yı şu şekilde yazabiliriz:

Karmasik operator+ (Karmasik birinci, Karmasik const & ikinci)
{
    return birinci += ikinci;
}

Referanslarla ilgili kısımda referans olarak int döndürmüş. Ancak temel türlerde referans olarak belirlemek bir hız farkına neden olmaz.

Nesne yönelimli programlama bölümünde dinamik olarak oluşturduğu Nokta nesnelerini silmeyi anlatmış. Ama dinamik olarak bellek ayrıldığında programda bir hata oluşursa bellek sızıntısı oluşacaktır.

Ben olsam illa nokta kullanmak gerekiyorsa Stroustroup'un kitabındaki şu örneği kullanırdım.

#include <iostream>
#include <memory>
using std::cout;
using std::auto_ptr;
 
struct Nokta
{
    double x, y;
};
 
struct Dikdortgen
{
    double x, y, w, h;
};
 
// Hayali bir sınıf :o
 
class Arac
{
 
public:
 
    virtual ~Arac ()
    {}
 
    virtual void fareTiklandiginda (const Nokta & nokta) = 0;
    virtual Nokta noktaOgren () const = 0;
};
 
class Kalem : public Arac
{
    Nokta nokta_;
    bool fareBasiliMi_;
 
public:
 
    Kalem ()
        : fareBasiliMi_ (false)
    {}
 
    virtual void fareTiklandiginda (const Nokta & nokta)
    {
        nokta_ = nokta;
        cout << "Bitis noktası (" << nokta_.x << ","<< nokta_.y << ") "
             << "olan bir cizgi ciziyorum!" << '\n';
        fareBasiliMi_ = true;
    }
 
    Nokta noktaOgren () const { return nokta_; }
 
};
 
class Secim : public Arac
{
    Nokta nokta_;
    bool fareBasiliMi_;
    Dikdortgen secim_;
 
public:
 
    Secim ()
        : fareBasiliMi_ (false)
    {}
 
    Secim (const Nokta & nokta)
        : nokta_ (nokta)
    {}
 
    virtual void fareTiklandiginda (const Nokta & nokta)
    {
        secim_.x = nokta_.x;
        secim_.y = nokta_.y;
        secim_.w = nokta.x;
        secim_.h = nokta.y;
 
        cout << "Baslangic noktasi ("
             << secim_.x << "," << secim_.y << ") "
             << "bitis noktasi ("
             << secim_.w << "," << secim_.h << ") "
             << "olan bir dikdörtgen ciziyorum" << '\n';
        nokta_ = nokta;
    }
 
    Nokta noktaOgren () const
    {
        return nokta_;
    }
 
};
 
class Cizici
{
    auto_ptr<Arac> arac_;
    Nokta nokta_;
 
 
    Cizici (Cizici const &);
    Cizici & operator= (Cizici const &);
 
public:
 
    Cizici ()
        : arac_ (new Kalem)
    {}
 
    void fareTiklandiginda (const Nokta & nokta)
    {
        arac_->fareTiklandiginda (nokta);
    }
 
    void secimAraciniSec ()
    {
        nokta_ = arac_->noktaOgren ();
        arac_.reset (new Secim (nokta_));
    }
};
 
 
int main ()
{
    Cizici cizici;
    Nokta nokta = {3, 5};
 
    cizici.fareTiklandiginda (nokta);
    cizici.secimAraciniSec ();
 
    nokta.x = 7;
    nokta.y = 10;
 
    cizici.fareTiklandiginda (nokta);
 
}

Kısacası C++ öğrenmen gerekiyorsa güzel bir C++ kitabı almanı tavsiye ederim.

http://amzn.com/020170353X

Eğer Amazon'dan almak istemiyorsan pandora gibi kitapevleri bu kitapları yurtdışından getirebiliyorlar.

Ben bile asıl amacım C öğrenmek olmamasına rağmen Ali beyin tavsiyesiyle ilk C kitabımı aldım.

http://amzn.com/0672326973

Çünkü bir noktada örneğin bir C kodunun D sürümünü yazmak gerekiyor. O zaman anlamadığım bir nokta olduğunda açıp bakabilirim.

Ayrıca ilk izlenimlerim gayet güzel. Hatta sadece bir başlangıç kitabı olmaktan çok, şimdiye kadar bilmediğim C'nin ileri düzey ayrıntılarını da anlattığını söyleyebilirim.
acehreli (Moderatör) #42
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Erdem, gösterdiğin kodlar çok güzel ama bazı yapılarda bazı türler ilklenmiyorlar. Örneğin Nokta bir POD (plain old data) türü olduğundan Kalem'in kurucusu işlediğinde çöp değerlerle doludur. (D herşeyi ilkler; C++ temel türleri ve POD'leri ilklemez.):

    Kalem ()
        :
        nokta_(),    // <-- Simdi "sifirlanmistir"
        fareBasiliMi_ (false)
    {}

C kitabını ben önermedim, değil mi? Galiba ACCU'daki eleştirileri güzeldi. (?)

Ali
erdem (Moderatör) #43
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Örneğin Nokta bir POD (plain old data) türü olduğundan Kalem'in kurucusu işlediğinde çöp değerlerle doludur. (D herşeyi ilkler; C++ temel türleri ve POD'leri ilklemez.)

Teşekkürler!  :-)

Türkçesini bilmiyorum ama plain old data ve aggregate kavramı biraz karmaşık görünüyor.

http://stackoverflow.com/a/4178176/734069

acehreli:
C kitabını ben önermedim, değil mi? Galiba ACCU'daki eleştirileri güzeldi. (?)

Özellikle kitap ismi vermediniz. Ama C kitabı almalımıyım mealindeki soruma

Tam olarak hangi konu olduğunu hatırlamıyorum ama kitap okumak iyidir. :)

demiştiniz  ;-)

Ben de ACCU'dan o kitapların incelemelerin okudum. Sonra bu listedeki kitaplardan bir tanesini seçtim. Çünkü stackoverflow'da da oldukça sağlam programcılar var galiba.

Bu kitap da ACCU'da da tavsiye edilenler listesindeydi. Hatta ACCU'nun C kitapları listesinde highly recommended hiç kitap olmadığından da bahsetmiştik.
Avatar
Salih Dinçer #44
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şu kitap diğer bir çoklarına göre ilgi çekici olabilir:

[Resim: http://ecx.images-amazon.com/images/I/71WNC28T16L._SL110_.gif]

C++ in Plain English - Brian Overland

Üçüncü basımı da var ve ne hikmetse reyting puanı 1...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #45
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hiç önerilmiyormuş:

  http://accu.org/index.php?module=bookreviews&func=sear…

Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  önceki  1  2  3 
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-22, 02:56:34 (UTC -08:00)