Jump to page: 1 26  
Page
Thread overview
DKV -Dosya Kaynaklı Veri (Tabanı)-
January 02, 2010

Ali Bey zaten d-okul'u konuşurken böyle bir projeden bahsetmişti. d-okulda ilerledikçe sadece böyle bir proje ile çok kolay d-okulu projesini yapabileceğimizi anladım. Daha önce denediğim dkurucu gibi projeler içinde bu gerekliydi ve hatta bir oyunda skor kaydetmek için bile bu gerekli.

Bu işi yapan filebase var ama en son 2 yıl önce güncellenmiş.(D2 için çalıştığından emin değilim.) Bu yüzden o projeye benzeyen basit bir proje'ye başladım. DKV.

Şuan yapabildikleri:

  1. Veritabanı oluşturabiliyor.
  2. Tablo oluşturabiliyor.
  3. Veri dosyası oluşturabiliyor.
  4. Veri dosyasını silebiliyor.
    5 Tablo silinebiliyor. (İçinde veri dosyası varsa silinmez.)
  5. Veri tabanı silinebiliyor. (İçinde tablo varsa silinmez)
  6. sil() işlevi ile belirtilen dosya yada dizin(alt dizinleri ile birlikte.) silebiliyor.

Yapılacaklar :

  1. Veri dosyasına güncelleme.(Silip aynı isim ile yeni veri dosyası oluşturma).
  2. Veri dosyasını içeriğini değiştirme.
    3.Tablo adı değiştirme.
  3. Veri dosyasını okuma.
  4. Belge yazılacak(Trileri gibi.)
    6.Windowsa uyumluluk.
    ..........

Düşündüklerim :

  1. Eğer tablo, veritabanı... yaratılırken aynı adda ise bir daha oluşturmuyor hata veriyor. Ben kullanıcının o tablonun olup olmadığını denetlemesini beklerim.(Mysql'de de kullanıcıdan bunu bekliyor.) Ama hata verdirtmesem mi ? yada 0'dan başka değer mi döndürsem. ?
  2. sil() işlevi bana çok tehlikeli geldi, sizce ?
  3. Veri dosyalarını filan nasıl koruyacağım ? Şifre ile korumam ve dosyayı açtırmamam gerekir. Örneğin şifrelerini saklayan bir program yazacak kişi bu sınıflardan yararlanacak olsa şifreler açıkta gezer. Onun için şifreleri koruma özelliğide olması gerekir. Sizin fikriniz var mı ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 02, 2010

veri oku işlevinde hata var diyor:

   int veri_oku(out dchar[][] okunanVeri_, inout dchar[] veriAdı_, inout dchar[] veriYolu_)
   {

       dchar[][] okunanVeri__;
       string veriAdı_s = to!string(veriAdı_);
       veriAdı = veriAdı_s;///Classa eklenecek
       string veriYolu_s = to!string(veriYolu_);
       veriYolu = veriYolu_s;///Classa eklenecek
       string dosyaAdı = veriYolu_s~"/"~veriAdı_s~".dkv";
       File dosya = File(dosyaAdı,"r+");
       int s =0;
       while (!dosya.eof()) {
           string satır = dosya.readln();
           dstring satır_sd = to!dstring(satır);
           okunanVeri__[s][]=satır_sd.dup;
           ++s;
       }
       okunanVeri_[][]=okunanVeri__[][];

       return 0;
   }

Verdiği hata'
core.exception.RangeError@dkv(119): Range violation
'

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 03, 2010

Verdiğiniz kodla derlemeye çalıştığımda hata verdi. Bende eski yöntem ile hallettim(2 satırlık veri ile denedim doğru okudu.) :

   int veri_oku(out dchar[][] okunanVeri_, inout dchar[] veriAdı_, inout dchar[] veriYolu_)
   {

       dchar[][] okunanVeri__;
       string veriAdı_s = to!string(veriAdı_);
       veriAdı = veriAdı_s;///Classa eklenecek
       string veriYolu_s = to!string(veriYolu_);
       veriYolu = veriYolu_s;///Classa eklenecek
       string dosyaAdı = veriYolu_s~"/"~veriAdı_s~".dkv";
       File dosya = File(dosyaAdı,"r+");
       while (!dosya.eof()) {
           string satır = dosya.readln();
           dstring satır_sd = to!dstring(satır);
           okunanVeri__~=satır_sd.dup;
       }
       okunanVeri_=okunanVeri__;

       return 0;
   }
}

text işlevinin yaptığını her ne kadar elle de yapsak çok uzatıyorduk. Text çok yararlı.

inout içinde siz dmd2.038 çıktığında dchar[] dstring ve const dchar[] için kullanılabiliyor demiştiniz. O yüzden onu kullandım. Eğer kullanılmıyorsa hepsi için kullanan ne var acaba ?

sil işlevi şimdilik kalmalı. Çünkü alt dizinleri silmek çok uzayacak. Belki ileride 2 aşamalı yaparız. silinenler adlı dizine atarız. Ordan da bir boşalt işlevi yazar boşaltırız. 2 aşama olduğu için geri dönüşü olabilecek.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 02, 2010

Alıntı (canalpay):

>
  1. Eğer tablo, veritabanı... yaratılırken aynı adda ise bir daha oluşturmuyor hata veriyor.

Güvenli bir davranış.

Alıntı:

>

Ben kullanıcının o tablonun olup olmadığını denetlemesini beklerim.(Mysql'de de kullanıcıdan bunu bekliyor.) Ama hata verdirtmesem mi ? yada 0'dan başka değer mi döndürsem. ?

Mysql'in nasıl yaptığını bilmiyorum. Bence kullanıcı "bu tablo var mı" diyebiliyorsa ve isterse tabloyu silebiliyorsa hata atmak doğru hareket.

Alıntı:

>
  1. sil() işlevi bana çok tehlikeli geldi, sizce ?

Haklısın. Ufak bir program hatası gereğinden çok şeyi uçurabilir. Şimdilik gerçekten silmek yerine, belki 'silinenler' gibi bir dizine yollayabilirsin. Veya dizinin isminin sonuna '.silindi' gibi bir şey ekleyebilirsin.

Alıntı:

>
  1. Veri dosyalarını filan nasıl koruyacağım ? Şifre ile korumam ve dosyayı açtırmamam gerekir. Örneğin şifrelerini saklayan bir program yazacak kişi bu sınıflardan yararlanacak olsa şifreler açıkta gezer. Onun için şifreleri koruma özelliğide olması gerekir. Sizin fikriniz var mı ?

Bence şimdilik kolaylık ön planda olmalı. Hatta dosyalar şimdilik elle de değiştirilebilse kullanışlı bile olabilir. (Bu cevabı verirken şifrelemenin tam olarak nasıl yapıldığını bilmediğimi de söylemem gerek. :) )

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 02, 2010

Alıntı (canalpay):

>

veri oku işlevinde hata var diyor:

okunanVeri__'nin boyu başta 0 olduğu için onun s'inci elemanına erişemeyiz. En kolayı 'okunanVeri__ ~= satır.dup' olabilir.

Ama ben sınıf üyelerine yaptığın atamaları gözardı ederek şöyle yazdım. Bana daha pratik geldi:

   int veri_oku(out dchar[][] okunanVeri_,
                in dchar[] veriAdı_,
                in dchar[] veriYolu_)
   {
       string dosyaAdı = text(veriYolu_ ~ "/" ~ veriAdı_ ~ ".dkv");
       std.stream.File dosya = new std.stream.File(dosyaAdı, FileMode.In);

       foreach (char[] satır; dosya) {
           okunanVeri_ ~= to!(dchar[])(satır);
       }

       return 0;
   }

Bu 'char' ve 'dchar' konuları zorluk çıkartıyor değil mi... Programladıkça kuralları anlayacağız galiba.

Notlar:

  • std.conv modülündeki text'i kullandım. Onun wtext ve dtext diye arkadaşları da var.

  • std.stream'deki File'ı kullandım. std.stdio'yu eklemezsen, açıkça std.stream.File yazmak zorunda da kalmıyoruz. Onu kullanmamın nedeni, o foreach ile kullanılabiliyor. ('opApply' üye işlevin tanımlayan sınıflar foreach ile kullanılabiliyorlar.)

  • Parametreler için kullandığın 'inout''lar bende derlenmiyor. D2'de onları 'ref' olarak yazmak gerek. Ama onlara da burada gerek yok: dinamik diziler referans türleri oldukları için zaten kopyalanmıyorlar. Projenin diğer kodlarında da bütün inout'ları ref olarak değiştirdim.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 03, 2010

Alıntı (canalpay):

>

inout içinde siz dmd2.038 çıktığında dchar[] dstring ve const dchar[] için kullanılabiliyor demiştiniz.

dmd 2.038 ile mi derliyorsun? Ben senin kodundaki 'inout' parametrelerde şöyle bir hata alıyorum:

Error: inout on parameter means inout must be on return type as well (if from D1 code, replace with 'ref')

D2'de parametre türü olarak kullanılan 'inout' emekliye ayrılmaktaydı. Onun yerine bir süredir 'ref' kullanılıyordu.

2.038 sürümünden bu yana 'inout''a başka bir anlam verdiler. "Parametre olarak ne kullanıldıysa, dönüşte de onu kullan" anlamına geliyor. Bu kullanımda, 'inout', şu üç parametreden birisinin yerini alıyor: 'const', 'immutable', değişebilen.

Ama 'inout' hem parametrede, hem de dönüş türünde kullanılmak zorunda.

Böylece tek bir işlev yazarak bu üç durumu da karşılayabiliyoruz. Ama ben Functions sayfasındaki şu işlevi derleyemiyorum:

inout(int)[] foo(inout(int)[] a, int x, int y)
{
   return a[x .. y];
}

void main()
{
   int[] a;
   foo(a, 0, 0);
}

Alıntı:

>

Eğer kullanılmıyorsa hepsi için kullanan ne var acaba ?

Ben henüz emin değilim. Bu konuda deneyim kazanarak bize fikir verecek olan sensin. :) File'ı kullanırken bile text ile string'e dönüştürmenin gerekmesi bana saçma geliyor. Belki de zamanla her kütüphane işlevini her dizgi türünü alacak şekilde değiştireceklerdir.

Ya da bazı kurallar geliştireceğiz: "giriş/çıkış işlemlerinde char, programın iç taraflarında dchar" gibi... Yani senin dosyaya yazıp okuduğun yerlerde char olması mantıklı, programın içinde de dchar olmalı... Sanırım... :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 03, 2010

Şablonları söylemeyi unuttum. trileri'de "herhangi tür" anlamında işlev şablonları kullanmıştık:

void tolowerInPlace_tr(T)(ref T[] dizgi)
{
   dchar[] dene = to!(dchar[])(dizgi);

   foreach(int i, dchar büyükHarf; dene) {
       dene[i] = (büyükHarf == 'I') ? 'ı' : toUniLower(büyükHarf);
   }
   dizgi = to!(T[])(dene);
}
unittest
{
   dchar[] d = "AIİĞŞÖZ"d.dup;
   tolowerInPlace_tr(d);
   assert(d == "aıiğşöz");

   wchar[] w = "ĞIAİBbCIĞİZİşIıİ"w.dup;
   tolowerInPlace_tr(w);
   assert(w == "ğıaibbcığizişııi");

   char[] c = "AİIĞZ"c.dup;
   tolowerInPlace_tr(c);
   assert(c == "aiığz");
}

Testlerindeki bütün türlerle çalışıyor. Zaten şablonlar olduğu için yeni inout'un gereğini tam anlamış değilim.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 04, 2010

Alıntı (acehreli):

>

dmd 2.038 ile mi derliyorsun? Ben senin kodundaki inout parametrelerde şöyle bir hata alıyorum:

Dmd sürüm notlarında inout olanağının işinin değiştirildiğini belirtmediği için( yada ben göremedim. ) ve inout önceden de var olduğu için ben de herhalde inout önceden de vardı dedim ve inout kullandım. Ama inout'u kullanırken aslında referans şeklinde kullanıyormuşum(Şimdi anladım :-D ).

Sizde yeni derleyiciyi kullanınca herhalde hata verdi. Bir eski sürümü ile derleseniz herşey doğru çalışacak.( Buradan anlaşılan tembellik etme hemen güncel derleyiciyi edin :-) ).

Şablonu unuttuğum için şablon kullanmadım. Keşke şablon kullansaydım. Yakında düzeltirim. Çünkü projeye 2 haftalık ara veriyorum. (Daha doğrusu iş verimimi düşüreceğim. )

inout ile şablon olayını ben yine anladım, adam seni uğraştırmak istemiyor. İşleve eriştiğin değerde döndür diyor. Temelde bir farklılık var. ( Sanırım var; şablonu çok iyi bilmediğim için kesin yargıya varamıyorum. )

Ama şu sorularım var :

  1. cast olanağı ile to şablonun farkı var mı da 2'sini koyuyorlar.( Bunda bir fark olabilir.)
  2. std.stream.File ile std.stdio.File farkı( Hadi bunda çok fark var. Ama neden iki tane file aracı var. stream'i kabul et işte. )
  3. std.stdio.write() ile std.cstream.writef() farkı. (Ben bunların kaynak koduna baktığımda ikisininde C'den sarmalandığını hatırlıyorum. Ee ne farkı var. Hadi yanlış hatırlıyorum. )
    4.write ile writeln farkı. (aynı şey. Sadece işlevin argümanına \n karakteri ekliyor. Ben beceriksizim ama bir \n ekleyemeyecek kadar beceriksiz miyim ? Hadi bunu eklemese ben kendim ekleyeceğim. Beni düşünmüşsün eklemişsin ama daha eklenecek o kadar özellik var, daha senin dünya kadar hatan var. Niye bunlarla uğraştığın kadar kütüphaneni zenginleştirmek için uğraşmıyorsun. Tangoya öylesine baktım, kod düzeni bile çok iyi. Sanki adamlar kod yazmıyor resim çiziyor. ( Doğrusu resim çizerek kodlanan programlama dili vardı. Bilmem ne çiziyorsun hello world diyordu :-) )

Ve anlamadığım Walter Bright ne için phobos kütüphanesini geliştiriyor ? Eğer sen phobos kütüphanesini geliştiriyorsan neden Tango kütüphanesi ile uğraşıyorsun (Ben bazı modüllerde Walter Bright'in adı geçtiğini hatırlıyorum. Hadi diyelim sadece phobostaki kodları aldı -ki ben böyle olduğunu zannetmiyorum. - ne için onları phobosu geliştirmeye davet etmiyorsun yada ne için onların projesine katılmıyorsun.(Ee belki fikir ayrılıkları var. Ama bu belkilerin hepsi tutacak mı ? İlla ki tutmayanlar olacak. )) ? Bunu merak ettim.

Ve birde sorum ,sadece meraktan soruyorum, D ile(sadece phobos kütüphanesini kullanarak) aklımıza gelen herşeyi teorikte yapabilir miyiz ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 04, 2010

Alıntı (canalpay):

>
  1. cast olanağı ile to şablonun farkı var mı da 2'sini koyuyorlar.( Bunda bir fark olabilir.)

'cast', C'den beri gelen bir olanak. C'de yalnızca temel türlerle çalışır. C++'da ise sınıfları istediğimiz her türe dönüşebilecek şekilde yazabilirdik.

D'de de bu dönüşüm 'cast' ile devam ediyor. Ama C++'dan daha kısıtlı: sınıflar için yalnızca tek bir dönüşüm işleci tanımlanabiliyor.

'to' şablonu ise her türü her türe dönüştürebilecek genel bir anlaşma gibi düşünülebilir. Ne kadar ilgisiz olsalar da kendimiz de tanımlayabiliriz.

Aşağıda 'to' şablonu özelleştirmesini (specialization), 'birDeğer' isminde üyesi olan herhangi bir türden 'Masa' nesnesi oluşturacak şekilde yazdım.

Oradaki 'if' ifadesini de 'dmd/src/phobos/std/conv.d' dosyasını inceleyerek öğrendim.

import std.cstream;
import std.conv;

class Masa
{
   int i_;

   this(int i)
   {
       dout.writefln("Masa.this ", i);
       i_ = i;
   }
}

class Okyanus
{
   const int birDeğer()
   {
       dout.writefln("Okyanus.birDeğer");
       return 42;
   }
}

class Duvar
{
   const int birDeğer()
   {
       dout.writefln("Duvar.birDeğer");
       return 100;
   }
}

class UyumsuzTür
{}

Masa to(Masa, S)(const ref S kaynak)
if (is (typeof(&S.init.birDeğer)))
{
   return new Masa(kaynak.birDeğer());
}

void main()
{
   auto o = new Okyanus;
   auto d = new Duvar;
   auto u = new UyumsuzTür;

   Masa mo = to!Masa(o);
   assert(mo.i_ == 42);

   Masa md = to!Masa(d);
   assert(md.i_ == 100);

//     Masa mu = to!Masa(u);  DERLEME HATASI
}

Alıntı:

>
  1. std.stream.File ile std.stdio.File farkı( Hadi bunda çok fark var. Ama neden iki tane file aracı var. stream'i kabul et işte. )

Benim anladığım kadarıyla, 'std.stdio.File' C'nin 'FILE' yapısı etrafında bir sarma. Yapı olarak gerçekleştirilmiş.

Ben 'std.stream.File''da karar kıldım, çünkü hem sınıf olduğu için daha yetenekli; hem de 'dout' ile aynı şekilde çalışıyor. Tek bir arayüz öğrenmek bütün akımlar için yeterli oluyor.

Alıntı:

>
  1. std.stdio.write() ile std.cstream.writef() farkı. (Ben bunların kaynak koduna baktığımda ikisininde C'den sarmalandığını hatırlıyorum. Ee ne farkı var. Hadi yanlış hatırlıyorum. )

Ne olursa olsun, ben 'cstream' arayüzünü daha genel ve daha D'ce buluyorum.

Alıntı:

>

4.write ile writeln farkı. (aynı şey. Sadece işlevin argümanına \n karakteri ekliyor. Ben beceriksizim ama bir \n ekleyemeyecek kadar beceriksiz miyim ? Hadi bunu eklemese ben kendim ekleyeceğim. Beni düşünmüşsün eklemişsin ama daha eklenecek o kadar özellik var, daha senin dünya kadar hatan var. Niye bunlarla uğraştığın kadar kütüphaneni zenginleştirmek için uğraşmıyorsun.

Haklısın. Ama gerçekten yazdırılanların çoğunun sonunda '\n' oluyor. Amaç, çok yapılanları kolaylaştırmak, az yapılanlara da kapı açmak olmalı.

Ayrıca, eskiden bir yerde okuduğum bir yazıya göre, metin işlemenin birimi aslında satırdır. (Yazarın fikri.)

Başka bir bakış açısı: eğer "satır oku" diye bir işlev varsa, bütünlük açısından onun karşıtı da olmalı.

Hatta, amacımızı '\n' gibi kodlarla belirtmek yerine işlevin ismini açık hale getirmek daha yararlı. (Ama 'ln' gibi bir ek o kadar da açık etmiyor. :D )

Alıntı:

>

Tangoya öylesine baktım, kod düzeni bile çok iyi. Sanki adamlar kod yazmıyor resim çiziyor. ( Doğrusu resim çizerek kodlanan programlama dili vardı. Bilmem ne çiziyorsun hello world diyordu :-) )

Ben Tango'ya henüz bakmadım.

Phobos'u yalnızca daha standart olduğu için seçmiştim. Andrei Alexandrescu şu sıralarda aralık kavramını (range) ekliyor. C++'ın STL'inin erişicileri (iterator) getirdiği kadar büyük bir değişiklik getirebilir. (Phobos'ta aralık örnekleri yazılmaya başlandı bile. Yapı taşları 'std.range' içinde...

Tabii Tango'yu da aralıklı hale getirebilirler. O zaman daha da güzel olur.

Alıntı:

>

Ve anlamadığım Walter Bright ne için phobos kütüphanesini geliştiriyor ?

Şimdilerde Phobos'un tasarımı çoğunlukla Andrei Alexandrescu'nun. Başkaları da yardım ediyor ve katkıda bulunuyor.

Alıntı:

>

Eğer sen phobos kütüphanesini geliştiriyorsan neden Tango kütüphanesi ile uğraşıyorsun (Ben bazı modüllerde Walter Bright'in adı geçtiğini hatırlıyorum. Hadi diyelim sadece phobostaki kodları aldı -ki ben böyle olduğunu zannetmiyorum. - ne için onları phobosu geliştirmeye davet etmiyorsun yada ne için onların projesine katılmıyorsun. (Ee belki fikir ayrılıkları var. Ama bu belkilerin hepsi tutacak mı ? İlla ki tutmayanlar olacak. )) ? Bunu merak ettim.

Değişik insanlar değişik taraflara yöneliyorlar; değişik fikirleri var. Normal. Biraz da politik olmalı...

Alıntı:

>

Ve birde sorum ,sadece meraktan soruyorum, D ile(sadece phobos kütüphanesini kullanarak) aklımıza gelen herşeyi teorikte yapabilir miyiz ?

Teoride herşeyi yalnızca D'nin (ve başka dillerin) iç olanaklarıyla da yapabiliriz.

Standart kütüphaneler fazla özel de olmamalılar zaten. Örneğin DNA işlemleriyle ilgili kütüphaneleri içermemeliler.

Bence Phobos gayet kapsamlı bir kütüphane. Hatta zipleme gibi özel amaca yönelik modüllerin olması biraz şüpheli bile.

C++'tan düşünüyorum: Standart kütüphanesi algoritmalar ve veri yapıları açısından oldukça yeterlidir ama eksiklikleri olduğu söylenir. Onun eksikliklerini kapatmak için Boost doğmuştur.

İçimden bir ses örneğin std.zip'in standart kütüphanede bulunmaması gerektiğini söylüyor, ama bulunursa da ihtiyacı olanlar için standart bir temel oluşturmuş oluyor.

D'de daha çok bir "pratiklik" hakim. "Koyalım, işe yarasın" gibi bir yaklaşım var. Yararlı; ama tutarsızlık da getiriyor.

Phobos'ta olmayan bir şey: pencereleme modülleri. Olmalı mı? Bilmiyorum. :D

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 05, 2010

Alıntı (acehreli):

>

İçimden bir ses örneğin std.zip'in standart kütüphanede bulunmaması gerektiğini söylüyor, ama bulunursa da ihtiyacı olanlar için standart bir temel oluşturmuş oluyor.

Ben ise tam zıttını düşünmüşümdür. Hepsi programlama ile ilgili şeyler. Eğer şuan zip ile ilgili modül doğru düzgün çalışsaydı dkv için gereken şifreleme işini yapabilecektim. Eğer indirme modülü olsa dsss gibi bir projeyi çok rahat yazacaktım. Bana göre gereksiz olanlar windows gibi belirli bir platforma yönelik şeyler ki aslında bunu bile belirli yere kadar ben kabul görebilirim.

Şuan benim düşüncem daha etkin :-D Bir programlama dili seçerken kütüphanesinin genişliğine ve standart kütüphanesinin genişliğine bakılıyor.

Valla şu pythonun kütüphanesini filan çok özlüyorum. Olanak olarak D çok iyi. Phobosta hatasız ve eksik olmayan şeyler çok iyi. Ama gel gelelim çok ama çok eksiği var. Eğer D2 ile ilgili başka bir kütüphane olsa yine önemli değil. Ama yok.(PHP'de grafik bile çizebiliniyordu. Hem de ne grafikler. Neredeyse photoshop muadili :-D ) Kendimi D2'nin gelişimi bitecek o zaman kütüphane gelecek diyorum. Ama ne yazıkki aklıma D3 ve yeni bir macera geliyor :-)

Ama ikimizin programlama yapımız farklı. Ben programcının işi kolay olmalı diyorum. Siz daha çok ben gerçek bir programcıyım demek istiyorsunuz(Bence.). Galiba başka ülkelerde bu iki farklılığa ayrı adlar veriliyormuş. Biri coder diğeri programmer sanırım.

Merak ediyorum. Bir hello world yazısı D'nin iç olanakları ile nasıl yazılır. (ki benim aklım almıyor.).Hele c için hiç aklım almıyor. Daha tür tanımlamak için bile kütüphane eklemek gerekirken hiç almıyor.

Kusura bakmayın konu çok dağıldı.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

« First   ‹ Prev
1 2 3 4 5 6