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