Thread overview
Dinamik diziDizisi v2
Jul 17, 2022
Salih Dincer
Jul 17, 2022
Salih Dincer
Jul 18, 2022
Ali Çehreli
July 17, 2022

Merhaba,

Ali hocanın şu başlıkta başlattığı ve tahsis edilen adreslerin sıralı olması için ekleme (v1) yaptığım işlevin yeni bir güncellemesini (v2) aşağıda bulabilirsiniz. Bilmiyorum daha mı karışık oldu ama bool türü ile çalışmayacak. Lütfen bool hariç açıkça hangi türde dizi üretmesi gerektiğini belirtin:

/*
 * diziDizisi.d (v2)
 * 17 Temmuz 2022
 */

auto diziDizisi(T, T artış = 0)(size_t x, size_t y, T başlangıç = 0)
{
  import std.array : uninitializedArray;
  size_t m = y * T.sizeof;
  ubyte[] arr = uninitializedArray!(ubyte[])(x * m);
  T[][] sonuç; // boş dizi ve hafızada bir bölge--^

  static if(artış == 0)
  {
    import core.stdc.string : memset;
    memset(arr.ptr, 0, x * m);
  }
  foreach(i; 0..x)
  {
    size_t n = i * m;
    auto dilim = cast(T[])arr[n..n + m];
    static if(artış > 0)
    {
      foreach(ref d; dilim)
      {
        d = başlangıç;
        başlangıç += artış;
      }
    }
    sonuç ~= dilim;
  }
  return sonuç;
}

unittest
{
  assert(diziDizisi!int(2, 2) == [[0, 0], [0, 0]]);
  assert(diziDizisi!(int, 1)(3, 3, -4) == [[-4, -3, -2],
                                           [-1,  0,  1],
                                           [ 2,  3,  4]]);

  assert(diziDizisi!(int, false)(2, 2) == [[0, 0], [0, 0]]);
  assert(diziDizisi!(int, true)(2, 2) == [[0, 1], [2, 3]]);

  assert(diziDizisi!(int, 1)(2, 2) == [[0, 1], [2, 3]]);
  assert(diziDizisi!(int, 2)(2, 2, 2) == [[2, 4], [6, 8]]);

  assert(diziDizisi!char(2, 2) == ["\0\0", "\0\0"]);
  assert(diziDizisi!(char, true)(2, 2, 99) == ["cd", "ef"]);
}

Ancak testlerden de göreceğiniz üzere artış ve başlangıç değerlerini dilediğiniz gibi değiştrebilirsiniz. Hatta türün yanına 2. parametreyi ekleyerek, örneğin (int, true) şeklinde yazarak türlerin dönüşüm imkanını kullanabilirsiniz. Çünkü bu şekilde göze daha güzel gözüküyor ama varsayılan değerlerin olduğunu hatırlatırım!

  auto dizi = diziDizisi!(int, true)(2, 2, 1);
  //      ^-- [[1, 2], [3, 4]]

Yani Türkçesi:

>

elemana sayısı ile aynı sayı değeriyle ilklenmiş dizi dizisi oluştur

Dilerseniz 2. şablon parametresi ve dolayısıyla manasız olan başlangıç değerini (3'ncü son parametreyi) kullanmayabilirsiniz. O zaman hepsi alışık olduğumuz şekilde T(0)'a ilklenecek. Mutlaka hatalarım vardır, deneyip iletirseniz düzeltiriz.

Dip Not: Dikkat ederseniz bu sefer std.array.uninitializedArray olanağını kullandım. Amacım zaten yeni eleman değerleri vermeyi düşünüyorsak neden 2 defa ilklensin çelişkisini gidermekti. Bunu da yapabilmek için ilk defa static if() kullandım.

Teşekkürler...

S.Dinçer

July 17, 2022

On Sunday, 17 July 2022 at 19:27:58 UTC, Salih Dincer wrote:

>

...ama bool türü ile çalışmayacak. Lütfen bool hariç açıkça hangi türde dizi üretmesi gerektiğini belirtin:

Düzeltiyorum; bool dizisi de döndürebiliyormuş!

Tabi artış parametresi verme gibi bir hataya girmemek lazım. Belki sözleşmeli programlama olanağını uyarlayabilirdik. Neyse fena değil, iş görür yani :)

  auto test = diziDizisi!bool(3, 3);
  bool* ilk = &test[0][0];
  foreach(n; 0..9)
  {
    auto p = ilk + n;
    p.writefln!"%s: %s"(*p);
  }/* Çıktsı:
    7F9738C0E000: false
    7F9738C0E001: false
    7F9738C0E002: false
    7F9738C0E003: false
    7F9738C0E004: false
    7F9738C0E005: false
    7F9738C0E006: false
    7F9738C0E007: false
    7F9738C0E008: false
   */

Başarılar...

July 17, 2022
On 7/17/22 12:43, Salih Dincer wrote:

> Düzeltiyorum; bool dizisi de döndürebiliyormuş!

Güzel. Özel kod gerekseydi de 'bool' için ayrı bir gerçeklemesi sunulabilirdi.

> iş görür yani :)

Kesinlikle ama artan değerlerle ilklemek sık karşılaşılan bir ihtiyaç değilse böyle bir işlevin ilklenme kodlarıyla ve mantığıyla karmaşıklaştırılmasının doğru olmadığı düşünülebilir.

Ali