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