Forum: Diğer Konular RSS
C kodlama standardı
Sayfa:  1  2  3  sonraki 
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: C kodlama standardı
Üzerinde çalıştığım kodda şu şekilde bir ifade var.

Şimdi bu kodu yazarken bu şekilde mi yazmalı
   // yöne göre paletleri çiz
    if (yon == 0 || yon == 2) {
        rectfill(screen, x - 16, y - 16, x - 11, y + 16, GRI);
        rectfill(screen, x + 11, y - 16, x + 16, y + 16, GRI);
    }
Yoksa aralardaki boşlukları birleştirerek mi yazmalı.
   // yöne göre paletleri çiz
    if (yon == 0 || yon == 2) {
        rectfill(screen, x-16, y-16, x-11, y+16, GRI);
        rectfill(screen, x+11, y-16, x+16, y+16, GRI);
    }

Aslında bir kodlama standardımız var biliyorum.

http://ddili.org/wiki/index.php?title=Kodlama_Standard%C4%B1

Ama içeriğini biraz daha genişletmek gerekecek sanırım. Ben de o kadar alışmışım ki kodlama standardına diğer türlü sanki çorba gibi kod yazıyormuşum gibi geliyor  ;-)

Bir de özellikle göstergeleri kodlarken hep karıştırıyorum. Hatta bu konuda da farklı kodlama stilleri var sanırım.

Gene switch case ifadelerini de if ifadelerinde olduğu bir boşluk küme parantezi { şeklinde mi yazıyorduk.
    if (bir_şey) {
        şunu_yap();
        falan();
        filan()
 
    } else if (başka_bir_şey) {
        bunu_yap();
        su_iç_gel();
 
    } else {
        diğer_şeyi_yap();
        çay_demle();
    }
Bu mesaj erdem tarafından değiştirildi; zaman: 2012-08-19, 00:55.
Değişiklik nedeni: switch case bölümünü ekledim
acehreli (Moderatör) #2
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ı
Titizliğin için teşekkürler! :) Gerçekten çok önemli konular...

erdem:
Şimdi bu kodu yazarken bu şekilde mi yazmalı
   // yöne göre paletleri çiz
    if (yon == 0 || yon == 2) {
        rectfill(screen, x - 16, y - 16, x - 11, y + 16, GRI);
        rectfill(screen, x + 11, y - 16, x + 16, y + 16, GRI);
    }

Boşluklar çok standart. Çalıştığım her projede başkaları da hep öyle yaptılar.

Bir de özellikle göstergeleri kodlarken hep karıştırıyorum. Hatta bu konuda da farklı kodlama stilleri var sanırım.

Sanırım yıldızın değişkene yapışık olması daha standart:

    int *p;     // yaygın olan
    int* p;     // seyrek olan
    int * p;    // daha seyrek olsa da Ali'nin sevdiği 

Gene switch case ifadelerini de if ifadelerinde olduğu bir boşluk küme parantezi { şeklinde mi yazıyorduk.

Evet. Galiba kural şöyle: anahtar sözcükten sonra gelen parantezden önce boşluk var. İşlev çağırırken boşluk yok.

Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Gösterge işaretinin (Klein Star*, asterix) iki nesnenin ortasında kullanımını doğru bulmuyorum. Çünkü bu işareti biz çarpmada da kullanıyoruz ve genellikle aritmetik işlemlerde, işaretin her iki yanına da boşluk koyuyoruz. Özetle, bir yana bitişik kullanım ortada kullanıma göre daha doğru olduğunu düşünüyorum...

Bence tür tanımlarken sola bitişik kullanmak da diğerine göre daha doğru!

Sola bitişik ve sağa bitişik kullanımlarının farkını açıklayarak şöyle sınıflandırırsak bana hak vereceğinizi düşünüyorum...:)

Biliyorsunuz, bu işareti bir de işaretçinin gösterdiği adresteki değeri döndürmesi için kullanmaktayız. Genellikle de solunda bir şey olmadan veya solundaki ile ilintili olmadan sağa bitişik yazmalıyız. Çünkü o işaret her zaman sağdaki değişken ile ilgilidir.

Tür tanımlarken de sola yazmamız, yukarıdaki açıklamadan dolayı farkını göstermek için doğru görünüyor. Çünkü her tür alışık olduğumuz (char, int vb.) isimlerde de kullanılmıyor. Örneğin bir kütüphanedeki (içeriğini bilmiyoruz) tür işaretçi olarak tanımlandıysa biz bunu, kendi programımızda sola dayanık şekilde yazmalıyız. Çünkü o işaret sağdaki ile ilgili değil soldaki ile doğrudan ilgilidir. Dolayısıyla türün özelliğini bir nevi sola aktarır.

Aslında sola bitişik yazmayı tercih etmemin bir sebebi daha var, örnekleyeyim:

bool
öyle_mi () { //... }
 
// yazım desenine alıştığınızı var sayalım, peki işaretçiyi ne yapacağız?
 
const char*
hacmi (int en, int boy, int yükseklik) { //... } 


Gördüğünüz gibi işlev türünü satır ile böldüğümüz durumlarda yıldızın yukarıda tür ile birlikte kalması daha yakışıklı.

Sol parantez yanındaki boşluklara gelince, ben güzel parantezlerden önce boşluk bırakırım. İşlev tanımlarken de bırakmaya gayret ediyorum ama bunları kullanırken ve for(), if(), with() gibi içişlevlerde özellikle boşluk bırakmıyorum. Tabi sağ parantezlerde de bırakmayabiliriz ama bırakınca daha güzel durduğunu düşünüyorum.

İster sol, ister sağ kullanın yeterki kusursuz kodlayın! İyi bayramlar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #4
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:
Bence tür tanımlarken sola bitişik kullanmak da diğerine göre daha doğru!

Dediğim gibi, bu konuda çok tartışma vardır. Senin beğendiğin yöntem dil kurallarına uymuyor. Ben de senin gibi keşke aşağıdaki tanımda iki gösterge tanımlanmış olsa diye düşürüm ama ilki gösterge, ikincisi int'tir:

    // C kodu:
    int* p0, p1;

Bazı insanlar o yüzden yıldızın her zaman için sağda olmasını savunurlar:

    // C kodu:
    int *p0, *p1;

İşte şimdi programcının istediği gibi ikisi de gösterge.

bool
öyle_mi () { //... }
 
// yazım desenine alıştığınızı var sayalım, peki işaretçiyi ne yapacağız?
 
const char*
hacmi (int en, int boy, int yükseklik) { //... } 

Gördüğünüz gibi işlev türünü satır ile böldüğümüz durumlarda yıldızın yukarıda tür ile birlikte kalması daha yakışıklı.

"daha yakışıklı" diyen sen olduğun için sana daha yakışıklı geliyor. (Bunlar kişisel görüşler.) :)

Dediğini anlıyorum; evet, kimse yıldızı alt satıra düşürmüyor. Ben şunu daha yakışıklı buluyorum:

const char *
hacmi (int en, int boy, int yükseklik) { //... } 

Ali
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Belki de uyumlu olsun diye hepsini sağa bitişik yazmalıyız. Çünkü aklıma, bir de eşitlik önce kullandığımız çarpma işleçi geldi. Onu da büyük çoğunlukla sağa bitişik yazıyoruz...:)

Örneğin şöyle bir işlev yazabilirdik:
void kareleri (int *a, int *b) {
    *a *= *a;
    *b *= *b;
}
Bu arada başka bir kişisel görüşümü de paylaşmak isterim. Yine, şu yukarıdaki işlevden aklıma geldi. İşaretçilerin olmadığı bir dünya düşünseydik elbette bir çok saç baş yolma hadisesi yanında, her işlev tek değer döndürebilecekti. İşte onlar sayesinde, yukarıdaki gibi bir işlevde giren tüm parametreler aynı zaman işlenip çıkmış oluyor. Çok güzel değil mi?

Buradan, D'nin in/out parametre takılarına gelirsek... Zannedersem onlar da bir tür işaretçi kullanmakta?

Sanki D'de, özellikle dilimlerde olmak üzere işaretçilerin bir ağırlığı var! Ama bize bunları hissettirmeden, bir başka tabirle yıldızları göstermeden uyguluyorlar. Belki ref takısı da bunlardan biri ve şu tartıştığımız yıldızlar yok...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #6
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:
Buradan, D'nin in/out parametre takılarına gelirsek... Zannedersem onlar da bir tür işaretçi kullanmakta?

in değil. out perde arkasında referans kullanıyor. Referanslar perde arkasında gösterge ile gerçekleştiriliyor.

bize bunları hissettirmeden, bir başka tabirle yıldızları göstermeden uyguluyorlar.

Zaten öyle olmalı. Amaç referans ise "ref" demeliyiz ve bitmeli:

void kareleri (ref int a, ref int b) {
    a *= a;
    b *= b;
}

(Not: İşlevin isminin karele(), katla(), vs. gibi bir şey olması gerek. :))

Belki ref takısı da bunlardan biri ve şu tartıştığımız yıldızlar yok...:)

D'nin diğer olanakları sayesinde göstergelerle ilgilenmek zorunda kalmıyoruz. Ama her nedense D'de yerel referans yok:

    int a;
    ref int r = a;    // <-- 'ref' böyle kullanılamıyor (oysa C++'ta bile & karakteri ile referans)
    int * p = &a;     // <-- Böyle yapmak gerekiyor 

Aynısı kısıtlama yapı veya sınıf üyelerinde de var: Onlar da 'ref' olamıyorlar.

Ali
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali Çehreli:
int a;
ref int r = a; // <-- 'ref' böyle kullanılamıyor (oysa C++'ta bile & karakteri ile referans)
int * p = &a;  // <-- Böyle yapmak gerekiyor 
Aynısı kısıtlama yapı veya sınıf üyelerinde de var: Onlar da 'ref' olamıyorlar.

Örnekler için teşekkürler...

İster istemez D.ershane'deki dersleri/örnekleri göz gezdirme gereği duyuyorum. Örneğin İşlevler başlığındaki, iki boyutlu diziler ve takma adları gösteren 2. örnek çok güzel. Açıklamaların gereksizliği, bir süre sonra (kod geliştikçe) anlamsızlaşması ve bunları azaltmak için işlev sayılarını arttırma gibi şeyler öğrendim. Gerçi artık tek return'lük işlevlere bile yeşil ışık yakmaya, işleri kolaylaştırdığını anlamaya başladım. Tıpkı insanı oluşturan hücreler hiyerarşisi gibi...:)

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #8
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:
iki boyutlu diziler ve takma adları gösteren 2. örnek çok güzel.

Teşekkürler. O örnek geçende paylaştığımız resim dosyası oluşturan programa benziyor: Resim iki boyutlu diziye çizildikten sonra bir şekilde çıkışa veriliyor.

Gerçi artık tek return'lük işlevlere bile yeşil ışık yakmaya, işleri kolaylaştırdığını anlamaya başladım.

Güzel fikirler. ;)

Ali
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
acehreli on 2012-08-19, 11:15:
...aşağıdaki tanımda iki gösterge tanımlanmış olsa diye düşürüm ama ilki gösterge, ikincisi int'tir:

    // C kodu:
    int* p0, p1;

Bazı insanlar o yüzden yıldızın her zaman için sağda olmasını savunurlar:

    // C kodu:
    int *p0, *p1;

İşte şimdi programcının istediği gibi ikisi de gösterge.
Hocam, peki C++'da nasıldır? İlginçtir D1'den beri ilk örnekteki p0 ve p1 bir işaretçidir. C'de neden böyle bir şey düşünmüşler? Ama bu örneğe bakarsak yıldızın sağa bitişik olması gerektiği çıkıyor...:)

C++ ile iligli başka bir soru da aşağıdaki D yeteneğini karşılığı mevcut olup olmadığıdır:
acehreli:
Aslında bool'un tek bitlik bilgi olmasından yararlanarak sekizer sekizer ubyte'lara yerleştirerek yer kazancı da sağlanabilir. std.container.Array'in bool özellemesi bunu yapar. Şurada 'struct Array(T) if (is(T == bool));' özellemesinde kısaca söylemişler:

  http://dlang.org/phobos/std_container.html
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #10
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:
peki C++'da nasıldır? İlginçtir D1'den beri ilk örnekteki p0 ve p1 bir işaretçidir.

C++'ta da C ile aynı.

C'de neden böyle bir şey düşünmüşler?

Bu kuralların hepsinin güzel açıklamaları ve tutarlı nedenleri var ama ben artık hiç hatırlamıyorum.

C++ ile iligli başka bir soru da aşağıdaki D yeteneğini karşılığı mevcut olup olmadığıdır:

C++'ta da var: vector<bool> her eleman için tek bit kullanır. Yer kazancı sağlar ama gariptir de: Aynı baytı paylaşan elemanların adresleri teker teker ya alınamaz ya da aynı olmak zorundadır. Herhalde Array!bool'da da öyledir. (?) Gerçekten ihtiyaç duyduğumda bakarım. :p

Ali
Avatar
Salih Dinçer #11
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler hocam, bazen C++'a alışmaya çalışsam mı diyorum; iş bulabilmek için...:)

Ama Mono-D bir ümit ışığı yakıyor! Çünkü .NET FrameWork'e girdik mi hangi dilin bildiğimizin bir önemi kalmayacak...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
huseyin #12
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bir şey sorabilir miyim şimdi bu mono-D windows da kullanılacağı zaman .net framework e eklenecek  mi derleyici olarak yani d.net i windows da derleme imkanı olacak mı ?
Huseyin
canalpay (Moderatör) #13
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ama Mono-D bir ümit ışığı yakıyor! Çünkü .NET FrameWork'e girdik mi hangi dilin bildiğimizin bir önemi kalmayacak...

Yanlış anlamışsınız. Monodevelop için sadece D için uygun yama. Yani adam D-ide geliştiriyordu windows için. Andrei filan dediki şu cross platform olsa ne güzel olurdu değil mi? Adamda gsoc projesi için bunu yaptı. (.Net sadece windows için)Sadece ide yani. Derleme ya da .net ile alakası yok. Yani aslında adı monodevelop-D olmalıymış. Şuan 3 derleyici filan var. Dmd, gdc ve ldc ile sdc'yi toplayıncada bir eder. Oldu 3 :-)


Bir şey sorabilir miyim şimdi bu mono-D windows da kullanılacağı zaman .net framework e eklenecek  mi derleyici olarak yani d.net i windows da derleme imkanı olacak mı ?

Böyle bir şey olsa büyük ihtimalle mono ile olmaz .net framework ile olur. Sadece windows için çalışır ve linux olmazsa anlamıda kalmaz olayın. Millet windowstan soğumaya başladı. Şuan valve resti çekti. linux'a geçmeyi kafasına koydu bile. Linux iyi olanaklar sağladığı için ve orjinal oyun almayı sevdikleri için bu olay çok uzun sürmez diye tahmin ediyorum.

.Net olursa çok iyi ancak asıl olay D'nin derlenebilir ve hızlı olması. Yani c++ gibi olması ve C# gibi olanakları olması. .Net'e taşındığında bunun önemi kalmaz ki?
Avatar
huseyin #14
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bilemiyorum d.net diye codeplex.com da bir proje belirtilmiş ancak şuanda geliştirilmiyor tahminim sadece bir fikir
Huseyin
erdem (Moderatör) #15
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
#include <stdio.h>
 
int main()
{
    int dizimiz [4][5] = { {0, 1, 2, 3, 4},
                           {5, 6, 7, 8, 9},
                           {0, 1, 2, 3, 4},
                           {5, 6, 7, 8, 9} };
 
    int (* dizi) [5] = dizimiz;
 
    int satir, sutun;
    for (satir = 0; satir < 4; ++satir) {
        for (sutun = 0; sutun < 5; ++sutun) {
            printf("%d", * (* (dizi + satir) + sutun));
        }
        printf("\n");
    }
}

Peki benek sayısı artmaya başlayınca da mı ayırarak kullanalım. Örneğin
    int ( * dizi) [5] = dizimiz;
ya da
            printf("%d", * ( * (dizi + satir) + sutun));
bu şekilde. Dikkat ederseniz burada boşlukları bir arttırdım. Sonra (* dizi) ile [5], dizimizdeki [4] ve [5] gibi bitişik mi olsun.
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:  1  2  3  sonraki 
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-21, 19:42:00 (UTC -08:00)