Forum: Ders Arası RSS
D. ershane Karakterler
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: D. ershane Karakterler
Dersleri takip ediyordum. Karakterler konusunda şöyle bir bölüm var:

Ö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.
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ı
Uyarı için teşekkür Erdem. :)

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.

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).

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
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
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 ..
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ı
Yanıtlanan mesaj #2
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
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 kullanmışsınız anladığım kadarıyla :)
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ı
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
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.
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 mesaj erdem tarafından değiştirildi; zaman: 2011-03-03, 01:15.
erdem (Moderatör) #8
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Hımm. Sanırım bu konu daha önce forumda konuşulmuş:

http://ddili.org/forum/thread/459
canalpay (Moderatör) #9
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ı
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");
    }
}
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:
Forum: Ders Arası RSS
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-18, 07:48:06 (UTC -08:00)