Thread overview
D. ershane Karakterler
Mar 02, 2011
erdem
Mar 02, 2011
erdem
Mar 02, 2011
erdem
Mar 02, 2011
erdem
Mar 03, 2011
erdem
March 02, 2011

Dersleri takip ediyordum. Karakterler konusunda şöyle bir bölüm var:

Alıntı:

>

Örnek olarak "aĞ" UTF-16'da

> 0 97   1 30
> ```

>
> şeklinde 4 bayt olarak kodlanır.
>

a'nın ondalık değerinin :97 sekizli değerinin: 141 onaltılı değerinin: 61
Ğ için ondalık değerinin: 286 sekizli değerinin: 436 onaltılı değerinin: 11E olduğunu biliyoruz.

Herhalde yeni başlayanların kafası karışmasın diye ondalık olarak gösterdiniz. O zaman

0 97 2 86


Ya da onaltılık sistemde:

0 61 1 1E


demek istediniz sanırım.

Aslında *"bazılarının gerçek değerleri farklıdır"* demişsiniz ama yukarda *Ğ harfinin Unicode'daki değeri 286'dır* ifadesini okuyunca çoğu kişi bu 130 nerden geldi diye düşünebilir.

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

Uyarı için teşekkür Erdem. :)

Alıntı (erdem):

>

Herhalde yeni başlayanların kafası karışmasın diye ondalık olarak gösterdiniz.

Doğru. O noktaya kadar tamsayı değerden başka bir şey bilmiyoruz.

Alıntı:

>

O zaman

> 0 97   2 86
> ```

> Ya da onaltılık sistemde:
>
>

0 61 1 1E

>

demek istediniz sanırım.

Değil: 286 değeri 255'ten büyük olduğu için iki bayt olarak saklanır: Üst bayt 1, alt bayt 30 olarak. (30, "286 eksi 256"dan geliyor).

Alıntı:

>

Aslında "bazılarının gerçek değerleri farklıdır" demişsiniz ama yukarda Ğ harfinin Unicode'daki değeri 286'dır ifadesini okuyunca çoğu kişi bu 130 nerden geldi diye düşünebilir.

Ben 1 ve 30 diye iki farklı değer olarak göstermek istemiştim. 130 olarak algılanacağı aklıma gelmemişti. Düzelteceğim. :)

'Ğ'w, gerçekten de bellekte 1 ve 30 değerleri olarak durur. (Sonculluk (endianness) nedeniyle 30 ve 1 olarak da durabilir.)

Göstergeler dersinde nesnelerin bellekte nasıl durduklarını gösteren iki işlev yazmıştım:

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

Onları biraz geliştirdim. Sonuçta aşağıdaki program istediğiniz nesnenin bellekteki baytlarını gösterir:

import std.stdio;
import std.traits;
import std.ctype;

/**
* Belirtilen adresteki belirtilen sayıdaki baytı gösterir
*/
void belleğiGöster(T)(T * bellek, size_t uzunluk, string girinti = "")
{
   const ubyte * baş = cast(ubyte*)bellek;

   foreach (i; 0 .. uzunluk) {
       const ubyte * adres = baş + i;
       const char karakter = isprint(*adres) ? *adres : '.';

       writefln("%s%s:  %02x (% 3d) %s",
                girinti, adres, *adres, *adres, karakter);
   }
}

/**
* Belirtilen değişkenin bellekteki baytlarını gösterir.
*
* Dizi türlerinde ayrıca dizi elemanlarını oluşturan baytları da gösterir.
*/
void baytlarınıGöster(T)(ref T değişken)
{
   const ubyte * baş = cast(ubyte*)&değişken;    // (1)

   writefln("tür    : %s", T.stringof);
   writefln("değer  : %s", değişken);
   writefln("adres  : %s", baş);                 // (2)
   writef(  "baytlar: ");

   foreach (bayt; baş .. baş + T.sizeof) {       // (3)
       writef("%02x ", *bayt);                   // (4)
   }

   writeln();

   static if (isArray!T) {
       writeln("elemanlar:");

       /*
        * Bu adet, dizgilerde daha fazla da olabilir; tembellik ediyor ve tam
        * doğru olarak hesaplamıyoruz. Tam doğru olması için std.utf.count ve
        * std.utf.codeLength'ten de yararlanmak gerekirdi.
        */
       size_t uzunluk = değişken.length * typeof(değişken[0]).sizeof;
       belleğiGöster(değişken.ptr, uzunluk, "  ");
   }

   writeln();
}

void main()
{
   double d = 1.25;
   baytlarınıGöster(d);
   baytlarınıGöster("aĞ"w);
}

1.25 gibi hazır değerler işleve 'ref' nedeniyle doğrudan gönderilemiyorlar. O yüzden açıkça 'd' gibi bir değişken tanımlamak zorunda kaldık.

Bendeki çıktısı şöyle:

'tür : double
değer : 1.25
adres : 7FFF32E84318
baytlar: 00 00 00 00 00 00 f4 3f

tür : immutable(wchar)[]
değer : aĞ
adres : 49DEC0
baytlar: 02 00 00 00 00 00 00 00 b0 de 49 00 00 00 00 00
elemanlar:
49DEB0: 61 ( 97) a
49DEB1: 00 ( 0) .
49DEB2: 1e ( 30) .
49DEB3: 01 ( 1) .

'

Görüldüğü gibi ben küçük soncul (little endian) bir ortamdayım: baytlar bellekte 30 1 sırasıyla duruyorlar. (Intel işlemcileri küçük sonculdur.)

Ali

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

March 02, 2011

Alıntı (acehreli):

>

Alıntı:

>

O zaman

> > 0 97   2 86
> > ```

> > Ya da onaltılık sistemde:
> >
> >

0 61 1 1E

> >

demek istediniz sanırım.

Değil: 286 değeri 255'ten büyük olduğu için iki bayt olarak saklanır: Üst bayt 1, alt bayt 30 olarak. (30, "286 eksi 256"dan geliyor).

Haklısınız. Benim kafa bazen gerçekten basmıyor :-p

Programın çıktısına bakarak bellekte bilgilerin bayt bayt saklandığını görünüyoruz. Sonuçta ikilik düzende saklandığı için bunları hangi sayı sisteminde istersek gösterebiliriz o zaman.

Bu arada bu bellekle ilgili program gerçekten güzel olmuş. Benim kullandığım ortamda da hemen hemen aynı çıktıyı verdiği için program çıktısını yazmaya gerek görmedim.

Artık bu programı göstergeler konusuna gelince daha ayrıntılı incelerim.

Verdiğiniz bilgiler için teşekkürler :) Çok faydalı oldu ..

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

March 02, 2011

Alıntı (acehreli):

>

Yaptığım değişiklik şu:

http://code.google.com/p/ddili/source/detail?r=153

Hımm.. Siteyi oluşturmak için de ddoc (http://en.wikipedia.org/wiki/Ddoc) kullanmışsınız anladığım kadarıyla :)

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

March 03, 2011
import std.stdio;
import std.cstream;
import std.uni;

void main()
{
   wchar harf;

   write ("Bir harf girin: ");
   din.readf (&harf);

   write (harf);
}

Gene karakterler dersinde bu programı ve 3.problemin çözümünü derleyip çalıştırınca şu şekilde bir hata veriyor. Derlerken basitçe :p sadece 'dmd karakterler.exe' şeklinde derliyorum.
Alıntı:

>

C:>karakterler.exe
Bir harf girin: a
object.Error: Access Violation

Bir de aynı dizinde 'karakterler.map' isminde '*.map' uzantılı bir dosya oluştu. İçeriği de şu şekilde:


Start         Length     Name                   Class
0002:00000000 0009DB57H  _TEXT                  CODE 32-bit
0002:0009DB58 000001F8H  ICODE                  ICODE 32-bit
0003:00000000 00000004H  .tls                   tls 32-bit
0003:00000004 00000034H  .tls$                  tls 32-bit
0003:00000038 00000004H  .tls$ZZZ               tls 32-bit
0004:00000000 00000004H  .CRT$XIA               DATA 32-bit
0004:00000010 00000004H  .CRT$XIZ               DATA 32-bit
0004:00000020 00000004H  .CRT$XCA               DATA 32-bit
0004:00000030 00000004H  .CRT$XCZ               DATA 32-bit
0004:00000040 00000004H  .CRT$XPA               DATA 32-bit
0004:00000050 00000004H  .CRT$XPZ               DATA 32-bit
0004:00000060 00000004H  .CRT$XTA               DATA 32-bit
0004:00000070 00000004H  .CRT$XTZ               DATA 32-bit
0004:00000074 00000000H  IMP__DATA              IMP__DATA 32-bit
0004:00000080 00013E42H  _DATA                  DATA 32-bit
0004:00013EC4 00000000H  FMB                    DATA 32-bit
0004:00013EC4 00000210H  FM                     DATA 32-bit
0004:000140D4 00000000H  FME                    DATA 32-bit
0004:000140D4 00000000H  XIB                    DATA 32-bit
0004:000140D4 00000018H  XI                     DATA 32-bit
0004:000140EC 00000000H  XIE                    DATA 32-bit
0004:000140EC 00000000H  XCB                    DATA 32-bit
0004:000140EC 00000010H  XC                     DATA 32-bit
0004:000140FC 00000000H  XCE                    DATA 32-bit
0004:000140FC 00000000H  XIFCB                  DATA 32-bit
0004:000140FC 00000004H  XIFU                   DATA 32-bit
0004:00014100 00000000H  XIFL                   DATA 32-bit
0004:00014100 00000004H  XIFM                   DATA 32-bit
0004:00014104 00000000H  XIFCE                  DATA 32-bit
0004:00014110 00000000H  CONST                  CONST 32-bit
0004:00014110 00000000H  EEND                   ENDBSS 32-bit
0004:00014110 0000188CH  _BSS                   BSS 32-bit
0004:0001599C 00000000H  XOB                    BSS 32-bit
0004:0001599C 00000004H  XO                     BSS 32-bit
0004:000159A0 00000000H  XOE                    BSS 32-bit
0004:000159A0 00000000H  XOFB                   BSS 32-bit
0004:000159A0 00000108H  XOF                    BSS 32-bit
0004:00015AA8 00000000H  XOFE                   BSS 32-bit
0004:00015AB0 00000421H  c_common               BSS 32-bit
0004:00015EE0 00000000H  STACK                  STACK 32-bit

Program entry point at 00094848

Sizce neden olabilir ?

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

March 03, 2011

Hımm. Sanırım bu konu daha önce forumda konuşulmuş:

http://ddili.org/forum/thread/459

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

March 03, 2011

Alıntı:

>

Hımm. Sanırım bu konu daha önce forumda konuşulmuş:

Evet. Çözüm kısaca cstream modülündeki readf yerine stdio modülündeki readf kullanılması. Yani :

import std.stdio;
//import std.cstream; //Artık gereksiz çünkü sadece stdio modülünü kullanacağız.
import std.uni;

void main()
{
   dchar harf;
   dchar sonuç;

   write("Dönüştürülecek harf? ");
   readf("%s",&harf); //Burası değişti.

   if (isUniLower(harf)) {
       // Küçükmüş; büyütmemiz gerekiyor; i'yi kendimiz
       // dönüştürmeliyiz

       if (harf == 'i') {
           sonuç = 'İ';
       } else {
           sonuç = toUniUpper(harf);
       }

       writeln("Büyüğü: ", sonuç);

   } else if (isUniUpper(harf)) {
       // Büyükmüş; küçültmemiz gerekiyor; I'yı kendimiz
       // dönüştürmeliyiz

       if (harf == 'I') {
           sonuç = 'ı';
       } else {
           sonuç = toUniLower(harf);
       }

       writeln("Küçüğü: ", sonuç);

   } else {
       writeln("HATA: ", harf, " bir harf değil");
   }
}

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

March 02, 2011

Alıntı (acehreli):

>

Ben 1 ve 30 diye iki farklı değer olarak göstermek istemiştim. 130 olarak algılanacağı aklıma gelmemişti. Düzelteceğim. :)

Farklı baytlar olduklarını göstermek için aralarına virgüller koymaya karar verdim:

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

Yaptığım değişiklik şu:

http://code.google.com/p/ddili/source/detail?r=153

Başka sayfalarda da küçük düzeltmeler yaptım:

http://code.google.com/p/ddili/source/detail?r=152

pdf dosyası da düzeldi ama sürüm numarasını değiştirmeye gerek olduğunu düşünmedim.

Ali

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

March 02, 2011

Evet, bu konularda hiç fikrim olmadan başladığım sırada ddoc'u öğrenmenin yararlı olacağını düşünmüştüm. Statik içerik için sorunsuz (gibi bir şey). :)

Ali

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