Thread overview
Dilim işaretçisi, neden işlev dışında bozulur?
Aug 06, 2013
Salih Dinçer
Aug 06, 2013
Salih Dinçer
Aug 06, 2013
agora
August 06, 2013

Merhaba,

Tam olarak nasıl ifade edeceğimi bilmiyorum. Konu başlığı da uyduruk oldu ama kodu denerseniz ne demek istediğimi anlayacaksınız!

Sanırım...:)

 class DilimTest {
   char[] memory;
   size_t konum;
   string[char[]*] AA;

   auto malloc(size_t boyut) {
     auto sınır = konum + boyut;

     scope(exit) konum += boyut;

     return &memory[konum..sınır];
   }
 }

 import std.stdio;

void main() {
 with( new DilimTest() ) {
   memory = "one"           /* 1 [0..3] */
            "two"           /* 2 [3..6] */
            "three"         /* 3 [5..$] */
            .dup;
//*///                          v----- TEST 1:
   AA[&memory[0..3]] = "bir";
   AA[&memory[3..6]] = "iki";
   AA[&memory[6..$]] = "üç";
/*///                          v----- TEST 2:
   AA[malloc(3)] = "bir";
   AA[malloc(3)] = "iki";
   AA[malloc(5)] = "üç";
//*/
   AA.writeln; /* print out: (TEST 1)

   [7FFF48A052D0:"bir", 7FFF48A052F0:"iki", 7FFF48A05320:"üç"]*/

   foreach(ref dilim; AA.keys) {
     writef("%s: %s ", dilim, *dilim);
   } /* print out: (TEST 1)
   7FFF48A052D0: one 7FFF48A052F0: two 7FFF48A05320: three */

   writeln;
 }
}/* print out: (TEST 2)
[7FFF651186B0:"üç"]
7FFF651186B0: �
*/

İkinci test için 23. satırdaki slash'lardan birini kaldırın...

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

August 06, 2013

Derleme hatası

Error 1 Error: this.memory[this.konum..sınır] is not an lvalue c:\users\talhazekeriya\documents\visual studio 2012\Projects\ConsoleApp7\ConsoleApp7\main.d 11
Error 4 Error: __withSym.memory[cast(uint)6..__dollar] is not an lvalue c:\users\talhazekeriya\documents\visual studio 2012\Projects\ConsoleApp7\ConsoleApp7\main.d 26
Error 3 Error: __withSym.memory[cast(uint)3..cast(uint)6] is not an lvalue c:\users\talhazekeriya\documents\visual studio 2012\Projects\ConsoleApp7\ConsoleApp7\main.d 25
Error 2 Error: __withSym.memory[cast(uint)0..cast(uint)3] is not an lvalue c:\users\talhazekeriya\documents\visual studio 2012\Projects\ConsoleApp7\ConsoleApp7\main.d 24

Zekeriya

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

August 06, 2013

Tamam şimdi oldu, Eti Eti Eti...:)
(90'lı yıllara gönderme, gençler izlesinler... (http://www.youtube.com/watch?v=QvQzZg8lACE))


 struct Düğüm {
    char[] dilim;
 }

 class DilimTest {
   char[] memory;
   size_t konum;
   Düğüm*[char[]*] AA;

   auto malloc(size_t boyut) {
     auto sınır = konum + boyut;
     auto düğüm = new Düğüm(memory[konum..sınır]);

     AA[&düğüm.dilim] = düğüm;
     konum += boyut;

     return &düğüm.dilim;
   }
 }

 import std.stdio;

void main() {
 with( new DilimTest() ) {
   memory = "one"           /* 1 [0..3] */
            "two"           /* 2 [3..6] */
            "three"         /* 3 [5..$] */
            .dup;

   AA.writeln(" memory[ \"", memory, "\" ]");

   auto test1 = malloc(3);
       (*test1)[0] = 'b';
       (*test1)[1] = 'i';
       (*test1)[2] = 'r';
   auto test2 = malloc(3);
   auto test3 = malloc(5);

   AA.writeln(" memory[ \"", memory, "\" ]");

   (*test2)[1] = 'o';

   foreach(ref dilim; AA.keys) {
     writef("%s: %s ", dilim, *dilim);
   }

   writeln;
 }
}

Bu kod, ilk gönderdiğimden farklı olarak, dilimi bir taşıyıcı (Düğüm) vasıtasıyla hayatta tutuyor. Sanırım Düğüm'ü de hayatta tutan AA dizisi. Aslında kodu, üzerinde çalıştığım MEM sınıfına uyarladım da çok yaklaşmışım. Ancak kod karmaşık olunca, yukarıdaki gibi sade bir şekilde olaya yaklaşmak gerekiyor. Yoksa saç baş yolmaca... :nuts:

Dip Not: Derleme hataları hakkında diyebileceğim bir şey yok. Bende çalışıyorsa sizde de çalışsın kardeşim...:)

Sevgiler, saygılar...

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

August 06, 2013

ÇIKTI:

[] memory[ "onetwothree" ]
[251FD0:251FD0, 251FB0:251FB0, 251F90
251FD0: bir 251FB0: too 251F90: three

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