Forum: D Programlama Dili RSS
Dizi sınırı ayarlanabiliyor mu?
Overflow for static array!
Page:  previous  1  2 
acehreli (Moderator) #16
User title: Ali Çehreli
Member since Jun 2009 · 2279 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
In reply to post ID 4813
Quote by zafer:
Bu esnada 3 elemanlı bir dizi tanımlıyorum ama bunlara sadece bir sınıf kurup onu atıyorum. Doğal olarak dizideki tüm elemanlar aynı nesneyi refere ediyor. Zaten bunu aşağıdaki çıktıda görmek mümkün şeklinde bir açıklama getiriyorum, katılır mısınız?

Tamamen doğru. :)

Diğer taraftan sınıfda bulunan "d" üye değişkenine ulaşmayı beklemiyordum ama gördüğünüz üzere değer atayıp okumayı başardım.

Üç tane referans da new ile oluşturulmuş olan tek nesneye erişim sağlamaktalar. new ile oluşturulmuş olan nesnenin d üyesi de oluşturulmuş olduğundan hepsi o d'ye eriştiriyorlar.

Ali
Avatar
Salih Dinçer #17
Member since Jan 2012 · 411 posts · Location: İstanbul
Group memberships: Üyeler
Show profile · Link to this post
In reply to post ID 4813
Quote by zafer:
...
bellek[2] b = new bellek();
...    
    b[1].s = 2; 
    b[1].d = 3;
...    
    writefln ("dinamic bellek'in 1. elemani: %d", b[0].d);
    writefln ("dinamic bellek'in 2. elemani: %d", b[1].d);
din.readLine();
    writefln ("static bellek'in 1. elemanı: %d", b[0].s);
    writefln ("static bellek'in 2. elemanı: %d", b[1].s);
}

dinamic bellek'in 1. elemani: 3
dinamic bellek'in 2. elemani: 3

static bellek'in 1. elemanı: 2
static bellek'in 2. elemanı: 2

Kod üzerinde de görüleceği üzere önce "b" isimli bir sınıf değişkeni tanımladım ama bu değişkeni bir dizi olarak tanımladım. Bu esnada 3 elemanlı bir dizi tanımlıyorum ama bunlara sadece bir sınıf kurup onu atıyorum. Doğal olarak dizideki tüm elemanlar aynı nesneyi refere ediyor. Zaten bunu aşağıdaki çıktıda görmek mümkün şeklinde bir açıklama getiriyorum, katılır mısınız?
Katılıyorum ve çok güzel...:)

Ayrıca katkı sağladığın için ayrıca teşekkür ederim. Benim şu an denediklerim çok gereksiz şeyler. Sadece dilin sınırlarında dolaşmaya ve çoğu zaman kural dışı davranmaya gayret ediyorum. Amacım yeni şeyler keşfetmek...

Yazdığın kodu yukarıda alıntıladığım şekilde değiştirdim. Amacım static'in bir farkının olup olmadığını görmek. Çıktı görüntüsünden anlayacağınız üzere (d)inamic değişkeni ile (s)tatic değişkeni arasında hiç bir fark yok. Çünkü değişkenler ilklendiği için 0 olmaları gerekirken ve sadece 2. elemana (b[1]...) erişim sağlanırken 1. eleman da değişmekte. Özetle; bu şekilde kullanımlarda static kullanmanın bir esprisi yokmuş.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
zafer #18
Member since Jul 2009 · 356 posts · Location: Ankara
Group memberships: Üyeler
Show profile · Link to this post
In reply to post #16
Quote by acehreli:
Üç tane referans da new ile oluşturulmuş olan tek nesneye erişim sağlamaktalar. new ile oluşturulmuş olan nesnenin d üyesi de oluşturulmuş olduğundan hepsi o d'ye eriştiriyorlar.

Ali o kısmı anladım ama benim anlamadığım daha öncesinde sınıf tanımını şu şekilde değiştirdiğim halde değişkenlere ulaşabiliyor olmam.

class bellek 
{
    private:
        int d;
        static int s;
}

Bu tanımdan da görüleceği üzere amacım sınıf değişkenlerini dış dünyaya kapatmak (Sarma) ama buna rağmen main içinden hala bunlara erişebiliyorum. Benim anlamadığım kısım burası, ne dersin?

Ayrıca katkı sağladığın için ayrıca teşekkür ederim. Benim şu an denediklerim çok gereksiz şeyler. Sadece dilin sınırlarında dolaşmaya ve çoğu zaman kural dışı davranmaya gayret ediyorum. Amacım yeni şeyler keşfetmek...

Rica ederim Salih, amacımız burada kodlarken keyif aldığımız bir dil olan D üzerinde hep beraber bilgi paylaşmak, bu sıcak ve samimi ortamı doğrusu çok seviyorum. Bu arada sende aramıza hoşgeldin. Umarım güzel projelerde birlikte çalışma imkanıda buluruz.

Yeni şeyler keşfetmek güzel tabi ama D'nin esnek sınırları sanırım bazen karışıklıklara yol açıyor. Örneğin C# derleyicisi aşağıdaki kodu baştan kabul etmiyor.

bellek[3] b = new bellek();

Bir sınıf değişkeninin bir dizi gibi kullanılmayacağını söyleyerek bize izin vermiyor, belki bu konuda D'de bize kızmalıydı ama belkide bir sistem dili olması ve programcısına güvenen esnek yapısı olayı bu şekle sokuyor olabilir.
http://www.zafercelenk.net - site    ||    https://github.com/zafer06 - depo
erdem (Moderator) #19
Member since Jul 2009 · 463 posts · Location: Eskişehir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by zafer:
Quote by acehreli:
Üç tane referans da new ile oluşturulmuş olan tek nesneye erişim sağlamaktalar. new ile oluşturulmuş olan nesnenin d üyesi de oluşturulmuş olduğundan hepsi o d'ye eriştiriyorlar.

Ali o kısmı anladım ama benim anlamadığım daha öncesinde sınıf tanımını şu şekilde değiştirdiğim halde değişkenlere ulaşabiliyor olmam.

class bellek 
{
    private:
        int d;
        static int s;
}

Bu tanımdan da görüleceği üzere amacım sınıf değişkenlerini dış dünyaya kapatmak (Sarma) ama buna rağmen main içinden hala bunlara erişebiliyorum. Benim anlamadığım kısım burası, ne dersin?

Yalnız şöyle bir şey D'nin özel veri erişimi ile C++'ninki farklı. Eğer bu kod C++ kodu olmuş olsaydı dediğin geçerli olurdu. Ama D için private olarak belirlenmiş değişkenlere aynı dosya içinde her yerden erişebilirsin.

http://ddili.org/ders/d/sarma.html
Avatar
Salih Dinçer #20
Member since Jan 2012 · 411 posts · Location: İstanbul
Group memberships: Üyeler
Show profile · Link to this post
In reply to post #18
Quote by zafer:
Yeni şeyler keşfetmek güzel tabi ama D'nin esnek sınırları sanırım bazen karışıklıklara yol açıyor. Örneğin C# derleyicisi aşağıdaki kodu baştan kabul etmiyor: bellek[3] b = new bellek();
Haklısın, C#'da, statik değişkene hiç bir şekilde erişemedim bile. Belki yanlış bir şeyler yapıyorumdur ama dinamik veriyi değiştirip ekrana olması gerektiği gibi yansıtabiliyorum. Statik ile ilgili satırlarda ise şu hatayı veriyor:

/home/salih/Projects/bellek/bellek/Main.cs(27,27): Error CS0176: Static member `Application.bellek.s' cannot be accessed with an instance reference, qualify it with a type name instead (CS0176) (bellek)

Private ise tıpkı diğerleri gibi davranıyor. Aslında ben eski Pascal'cılardanım. OOP konusuna çok yabancıyım. Bu kadar anahtar sözcük benim çok kafamı karıştırıyor ki bu D'de sanki çok (is, in, out, this, body, ref, pure, nothrow, throw, final switch vb.) var.  D'nin hedefleri arasında basitlik de var ama sizce, en az diğer diller kadar karmaşıklaşmaya başlamıyor mu?

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderator) #21
User title: Ali Çehreli
Member since Jun 2009 · 2279 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by Salih Dinçer:
/home/salih/Projects/bellek/bellek/Main.cs(27,27): Error CS0176: Static member `Application.bellek.s' cannot be accessed with an instance reference, qualify it with a type name instead (CS0176) (bellek)

Yani yalnızca türün ismi ile erişilebiliyormuş. Bu konuda C++ da D gibidir ve hem türün ismiyle hem de nesne üzerinden eriştirir:

// C++ kodu
class C
{
public:
    static int s;
};
 
int C::s = 42;
 
int main()
{
    C c;
    // Nesne uzerinden
    c.s = 0;
 
    // TUrUn ismiyle
    C::s = 1;
}

Private ise tıpkı diğerleri gibi davranıyor.

D o konuda bana garip gelmişti ama düşündükçe D'nin yaklaşımını daha çok sevdim. D'nin söylediği şu: Aynı modülün içindeki kodlar aynı programcı(lar) tarafından yazılmaktadırlar ve aynı modüldeki kodlar birbirlerine gerçekleştirim açısından çok yakındırlar. Modüldeki sınıfları birbirlerinden sakınmaya gerek yoktur.

Sakınmak gerektiğinde sınıf kendi modülüne taşınır ve private'ları kendisine kalır. :)

Bu kadar anahtar sözcük benim çok kafamı karıştırıyor ki bu D'de sanki çok (is, in, out, this, body, ref, pure, nothrow, throw, final switch vb.) var

Çok anahtar sözcük olduğu doğru. Kimisi tarihsel nedenlere dayalı, kimisi ifade gücü getireceği düşünülmüş, vs.

Ali
zafer #22
Member since Jul 2009 · 356 posts · Location: Ankara
Group memberships: Üyeler
Show profile · Link to this post
Quote by acehreli:
D o konuda bana garip gelmişti ama düşündükçe D'nin yaklaşımını daha çok sevdim. D'nin söylediği şu: Aynı modülün içindeki kodlar aynı programcı(lar) tarafından yazılmaktadırlar ve aynı modüldeki kodlar birbirlerine gerçekleştirim açısından çok yakındırlar. Modüldeki sınıfları birbirlerinden sakınmaya gerek yoktur.

D dili her nekadar farklıda olsa mantıklı bir açıklama getirmiş ve bir açıdan düşününce belki güzel bir yaklaşım bile denilebilir ama genel sınıf yaklaşımını baya bir esnetmiş :)

static değişkenlerin tek olduğunu Ali zaten mesajında gayet güzel anlatmıştı. Nesne yönelimli dillerde static tanımının bir diğer özelliği static ile işaretlenen üye veya metodlara bir nesne örneği oluşturmadan direk ulaşılabilmesidir. D gibi bir dilde bu fark pek anlaşılmasada C# dilinde bu fark senin denemende bariz bir şekilde ortaya çıkmaktadır.

Kısaca bellek sınıfının d değişkenine erişmek için (tabi sınıf izin vermişse) C# veya D ile aşağıdaki gibi bir kod yazarsın.

void main () 
{
    bellek b = new bellek();
    b.d = 1;
}

Ancak bellek sınıfının static s değişkenine erişmek istersen D için aşağıdaki kod geçerli olurken C# için durum biraz farklıdır.

void main () 
{
    bellek b = new bellek();
    bellek.s = 1;
}
void main () 
{
    bellek.s = 1
}


C# kullanıyorsan ise yazman gereken kod şöyle olmalı

static void Main(string[] args)
{
       bellek.s = 1;
}

Yalnız burada dikkat etmek gereken bir nokta daha yakaladım. C# ile bir sınıf tanımladığında üye değişken veya metodları public ile işaretlemediğin sürece private olarak tanımlanırlar. Yani bellek sınıfını c# ile oluşturursan bu hali ile hiçbir üye değişkene ulaşamasın, ulaşmak istediğin üye değişkenleri ve metodları public olarak işaretlemelisin.

D dilinde gördüğüm durum ise bunun tam tersi yani private olarak işaretlemediğin sürece üye değişkenlere direk ulaşabiliyorsun. Küçük ama değerli bir bilgi olarak bunuda eklemek istedim.
http://www.zafercelenk.net - site    ||    https://github.com/zafer06 - depo
Avatar
Salih Dinçer #23
Member since Jan 2012 · 411 posts · Location: İstanbul
Group memberships: Üyeler
Show profile · Link to this post
Teşekkürler Zafer Hocam,

Sayenizde D forumunda C# bilgimi de arttırdım...:)

Dediklerinizi aynen (neredeyse cümle cümle) Mono ile uyguladım. Hakkaten de private özelliği otomatik tanımlanıyormuş. Hep de bu yüzden tam olarak anlayamadığım bir şeyler dönüyor diyordum ben. Neyse ki bu vesileyle bunu da öğrenmiş olduk.
namespace uygulama {
    class bellek    {
        public static int s;
        public int d;
    }
    class uygulama{
        static void Main (string[] args)    {
            bellek a = new bellek();
            bellek b = new bellek();
            b.d=1;
            Console.WriteLine ("dinamik (a.d) bellek: {0}", a.d);
            Console.WriteLine ("dinamik (b.d) bellek: {0}", b.d);
            bellek.s=1;
            Console.WriteLine ("statik (bellek.s) bellek: {0}", bellek.s);
}}}
Her ne kadar D forumunda C# konuşmak abes gibi görünse de kusura bakmayınız. Bu sayede C#'ın acımasızlığını ve de D'nin esnekliğini görüyoruz. Hoş bir tartışma oldu, herkese teşekkür ederim.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #24
Member since Jan 2012 · 411 posts · Location: İstanbul
Group memberships: Üyeler
Show profile · Link to this post
In reply to post ID 4808
Quote by acehreli on 2012-01-30, 14:21:
Son olarak, eğer bütün dizi baştan oluşturulması gerekmiyorsa diziyi hep sonuna ekleyerek de oluşturabilirsin:

class bellek {
    int d;
    static int s;
 
    this(int d) { this.d = d; }
    override string toString() const { return format("%s", d); }
}
 
void main () {
    bellek[] dizi;
 
    foreach (i; 0 .. 10) dizi ~= new bellek(i);
    writeln(dizi);
}
Ali Ağabey,

Bu örnek çok güzel; görmüştüm fakat dizi konusunu tam hazmedeğim için cevabımı saklı tutuyordum...:)

Aslında yapmak istediğim hafızayı daha verimli kullanmak. O yüzden işlem gücünü düşüren ve hafızayı yiyen kolay kaçamaklardan kendimi kurtarmaya karar verdim. Çünkü hafızadan alıkoyulan her bayt, aynı oranda uygulamayı yavaşlatıyor. Sanki HDD'den veri okuyormuş gibi bir his uyandırıyor!

Şu sıralar uc uca eklenen veriler yerine baştaki veri ile işim bitince index'leri (birden fazlalar!) evirip çevirip dizinin başına doğru yönelteceğim. Biraz zor oluyor benim için ama basit bir mantığı var gibi, çok yaklaştım...

Dip Not: Bir de override varmış...:)

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderator) #25
User title: Ali Çehreli
Member since Jun 2009 · 2279 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by Salih Dinçer:
Ali Ağabey

O da çok uzun oluyormuş! Kısaca Ali olsun. :)

Şu sıralar uc uca eklenen veriler yerine baştaki veri ile işim bitince index'leri (birden fazlalar!) evirip çevirip dizinin başına doğru yönelteceğim.

Evet, daha önce de söylemiştin. Baş tarafta işi biten elemanlardan kurtulmak D'de çok kolay. Dilimi başından eksiltebilirsin. Aşağıdaki program son tarafa ekliyor ve baş taraftan çıkartıyor:

import std.stdio;
 
void main()
{
    int[] dizi;
 
    foreach (i; 0 .. 20) {
        dizi ~= i;
 
        if (dizi.length > 5) {
            dizi = dizi[1 .. $];
        }
 
        writefln("%s: %s", i, dizi);
    }
}

Artık erişim sağlanmayan baştaki elemanların yaşadıkları bellek sayfaları çöp toplayıcı tarafından geri alınırlar. Ben gerçekten yavaş olduğu kanıtlanana kadar yukarıdaki gibi yöntemleri yeğlerim. Ama tabii programın doğası gereği başka yöntemler gerektiğini de düşünebilirsin.

Salt bellek ayırma kısmıyla ilgili olarak reserve() var:

  http://ddili.org/makale/d_dilimleri.html

Aynı makaledeki "Dilim Üyeleri ve Appender" başlığı altında anlatılan yöntemler de hızlı eleman ekleme konusunda önemli. İngilizce forumlarda hep "Appender kullan" dendiği oluyor.

Belgesi (ve örneği):

  http://d-programming-language.org/phobos/std_array.html#Ap…

Şuradaki Appender'ın geçtiği yerde de bir kullanım örneği var:

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

Bir de override varmış...:)

O da C++'tan farklı bir özellik. D'nin iyi eklemelerinden birisi. Üst sınıf işlevinin belki de yanlışlıkla bastırmak yerine açıkça override demek gerekiyor.

Ali
Avatar
Salih Dinçer #26
Member since Jan 2012 · 411 posts · Location: İstanbul
Group memberships: Üyeler
Show profile · Link to this post
Peki Ali Hocam...

Neyse ki ismin üç harfli. Benim bir arkadaşım vardı ve belki şimdi ismini buraya yazınca (bir gün arama motorunda karşılaşınca) dadanacaktır. D için bir nefer daha kazanacağız...:)

Arkadaşımın ismi Abdurrahman Karaahmetoğlu idi. O yüzdendir ki dünyada sadece iki kişinin kullandığı "aptrik" takma ismini kullanırdı. Düşünsenize kısaltmayıp bu isimde bir e-posta adresi tanımladığınızı. Domain uzantıları ve @ işareti ile çok uzun olacaktır. Neyse, şahsımızı temsil ettiği için isimler güzeldir, Ali'de öyle. Hepsinden önemlisi, saygı, sevgi ve emek de...

Sadece ders notları ile değil; cevaplayarak da emek verdiğin için teşekkür ederim. Hemen dilim olaylarına giriyor ve diziler ile nasıl anlaştığını irdelemeye çalışacağım. Belki de yukarıda yazdığınız gibi çok güzel bir çözüm olacaktır.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderator) #27
User title: Ali Çehreli
Member since Jun 2009 · 2279 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by Salih Dinçer:
Peki Ali Hocam...

Neyse ki ismin üç harfli.

Aslında bir yöntem daha var: Nasıl olsa herkesin bir forum ismi var. Bence o da kullanılabilir. Şöyle:

acehreli, dilimler çok karışık! :)

Ali
Mengu (Moderator) #28
User title: NONSERVIAM
Member since Jul 2009 · 254 posts · Location: Dersaadet
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by acehreli:
Quote by Salih Dinçer:
Peki Ali Hocam...

Neyse ki ismin üç harfli.

Aslında bir yöntem daha var: Nasıl olsa herkesin bir forum ismi var. Bence o da kullanılabilir. Şöyle:

acehreli, dilimler çok karışık! :)

Ali

ali reyiz bizi diskoya gotur! :-)
http://www.mengu.net - ki$isel bili$im guncesi.
acehreli (Moderator) #29
User title: Ali Çehreli
Member since Jun 2009 · 2279 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by Mengu:
ali reyiz bizi diskoya gotur! :-)

Şimdi baktım; varmış öyle bir şey; komikmiş; ama anlamadım. Sonra anlatırsınız. :)

Ali
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Page:  previous  1  2 
Not logged in. · Lost password · Register
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Current time: 2012-05-18, 10:06:07 (UTC -07:00)