September 29

Merhaba,

Başka bir başlıkta, renkleri (RGB) tutan bir yapıyı, başkasıyla (ArrayMatrix adıyla) sarmalamıştık. Hem anlam olarak aslında kare matrisleri kullanıyoruz hem de anlamsız bir uzunluk değeri vardı...

Hataları aşağıdaki gibi düzelttim. Önce length'e gerçek anlamımını verdim ve hazır dokunmuşken diziDizisi (sürüm 1)'den gördüğümüz sıralı adresler halinde bellekten tahsis gerçekleştirdim. Sonra ekstra rowLength() ekleyerek (aslında kendisi karekök işlevidir) belki kolaya kaçmış olabilirim :)

struct KareMatris(T)
{
  T[][] elements;
  size_t length;

  size_t rowLength()
  {
    auto x = length;
    auto y = (x + 1) >> 1;
    while (y < x)
    {
      x = y;
      y = (x + length / x) >> 1;
    }
    return x;
  }

  this(size_t length)
  {
    this.length = length * length;
    size_t m = T.sizeof * this.length;
    ubyte[] arr = new ubyte[](m);

    m /= length;
    foreach (i; 0 .. length)
    {
      size_t n = i * m;
      elements ~= cast(T[])arr[n .. n + m];
    }
  }

  ref T opCall(Point i)
  in(i.x < rowLength &&
     i.y < rowLength)
  {
    return elements[i.x][i.y];
  }
}

O kadar da kolaya kaçmadım ve in'nin yakaladığı 2 durumun hatasının testini icra ettim. Üstelik bu teknikle program sonlanmaz, en azından hata verdiği sürece:

unittest
{
  imported!"std.exception".assertThrown!Error(
  {
    auto errX = KareMatris!Color(1)(Point(1, 0));
    auto errY = KareMatris!Color(1)(Point(0, 1));
  }());
}

struct Point { size_t x, y; }

struct Color { ubyte r, g, b; }

Özetle, D gerçekten üstün bir dil ve yukarda sadece bunlardan birkaçını görmektesiniz. Kodu çalıştırmak ve üzerinde oynamak için şu örnekle devam edin lütfen:

https://run.dlang.io/is/CkR9if

SDb@79

September 30

On Friday, 29 September 2023 at 18:45:16 UTC, Salih Dincer wrote:

>

Özetle, D gerçekten üstün bir dil ve yukarda sadece bunlardan birkaçını görmektesiniz. Kodu çalıştırmak ve üzerinde oynamak için şu örnekle devam edin lütfen:

https://run.dlang.io/is/CkR9if

Şimdi lezzetli bir hale (sürüm 1.1'e) dönüştü!

Bunun için sarmalamaya 2 ekleme yapın: Birincisi aşağıdaki opSliceAssign() ekleyin:

  T* ptr;
  auto opSliceAssign(T value, size_t a, size_t b)
  {
    return this.ptr[a..b] = value;/*
    this.ptr[a..b] = value;
    return this;//*/
  }

İkinci kurucu this() içine lütfen şunu eklemeyi unutmayın ve:

  ptr = cast(T*)arr.ptr;

Netice de şu 2 kullanımı özgürce yaşayabilirsiniz (-ki sizce de 2 köşeli parantezi mallık seviyesinde 🤗 kullanmaya göre daha kolay ve avantajlı değil mi?):

  /*
  (1) ***/
  writeln(arr[13..23] = Color(3, 3, 3));

  /* [27, 27, 27, 27, 27, 27, 27, 27, 27, 27]

  (2) ***/
  arr[13..23] = Color(1, 1, 1));
  arr.elements.writefln!"%-(%-(%s %)\n%)";

/* ÇIKTININ DEVAMI:
   0 0 0 0 0
   0 0 0 0 0
   0 0 0 1 1
   1 1 1 1 1
   1 1 1 0 0
*/

Bekleyin bie dakka, D'nin bir tanesi $'ı da kullanmak için hazır length varken farklı varyasyonlar için hadi şunu da ekleyiverin:
auto opDollar() => length;

Büyüksün D! 😇

SDB@79