On Thursday, 27 October 2022 at 20:41:28 UTC, Ali Çehreli wrote:
> On 10/27/22 11:02, Salih Dincer wrote:
> Ben şu çokuzlu
döndüren kodu,
Çokuzlu yerine aralık demek istediğini varsayıyorum.
Aslında .array
kullanmak istemediğimi ve .tupleof
ile çokuzlu kullanmak istediğimi belirtmiştim. Ama evet dağınık bir anlatım tarzı olduğunu kabul ediyorum.
On Thursday, 27 October 2022 at 20:41:28 UTC, Ali Çehreli wrote:
> İkinci mesajındaki koda bakıyorum:
> auto size = range.length;
> ubyte[100] data;
Buradaki asıl sorun, 100 büyüklüğündeki bir dizinin içine yazmak mı? 'size' daha az mı olmak zorunda? Yoksa gerektikçe 100'ü arttırmak mı istiyoruz?
100 değeri varsayımsal, yani hiçbir zaman çıkmayacak değer. İşin ilginci yapı kurulurken size
değerini biliyoruz. Sorun kopyalama işlemini tersine yapmam gerektiği ve put()
bize bunu veriyor ama .array
'den kurtaramıyor...
On Thursday, 27 October 2022 at 20:41:28 UTC, Ali Çehreli wrote:
> Burada benim aklıma gelen bir eniyileştirme, 100'lük diziyi static yapmak ve doğrudan onun elemanlarına dilim döndürmektir:
void foo() {
static ubyte[100] data;
// ...
return data[0..size];
}
Ama dikkat edilmesi gereken konu: Döndürülen değer foo'nun bir sonraki çağrılmasında geçersiz olacaktır.
(D'nin thread-local-by-default özelliği nedeniyle multithread konusunda güvendeyiz.)
Evet hocam, bu dediğiniz ile çok karşılaşıyorum ve static
kullanmak hiç aklıma gelmemişti. Escape hatası ile karşılaşmamak için genelde dilimi .dup
ile kullanarak kolaya kaçıyordum. Bilgi için teşekkür ederim.
On Thursday, 27 October 2022 at 20:41:28 UTC, Ali Çehreli wrote:
> Buna ek olarak, ben data'yı dinamik de yapıyorum:
void foo() {
static ubyte[] data;
// ...
if (size > data.length) {
data.length = size;
}
// ...
return data[0..size];
}
Böylece data, şimdiye kadar gereken en uzun durumunda bulunuyor ve bir noktadan sonra bir daha bellek ayırmıyoruz.
Bu güzel aslında, ama aralık ile kullanıp kullanmayacağımdan emin değilim. Aslında aralık kullanmak benim için kolaylık ama uzun vadeli kullanıcıya hizmet eden (empty, front, popFront
'u olan) bir şey değil. Sadece kurulurken değeri kendi türüme insancıl olarak eşitliyor, hepsi bu...
On Thursday, 27 October 2022 at 20:41:28 UTC, Ali Çehreli wrote:
> Asıl soruya dönersek, ben olsam hex işlevinden doğrudan aralık döndürürdüm ve diziye kopyalama işini kullanıcılara bırakırdım. Dizi gerekmediği zaman bellek ayrılmaz. Gerektiği zaman da ayrılır.
Ve asıl sorunun tam cevabı, copy'yi kullanmak:
Maalesef .retro
gibi bir şey (o da map ile çalışmadı!) olmadan tersi sonuç veriyor. Yapıyı aşağıdaki test koduyla denedim, yapının ve 2 adet kurucusu vardır. Eğer çıktının 2. ve 3. satırlara bakarsanız .copy
ile insan algısının tersine kayıt ettiğini göreceksiniz:
alias Hex4 = HexString!int;
enum sample = 123456789; //0x075bcd15
void main()
{
Hex4 n = sample;
n.writeln; // "075bcd15"
auto hex = Hex4.fromString("075bcd15");
hex.writeln(": ", typeof(hex).stringof);
Hex4 hexStr = "075bcd15";
hexStr.writeln;
} /* ÇIKTISI:
0x075bcd15
0x15cd5b07: HexString!int
0x15cd5b07
*/
Özetle, defalarca bellek tahsisinden kurtulup kurulum sırasında gerek int¤, gerekse
stringolarak hexadecimal sayılar ile çalışmak istiyorum. An itibariyle yaptıklarım CTFE değil ama tersine veriyi kayıt etme zorluğu beni durdurdu. Bunun
.retro¤ ile çalışamaması beni klasik yöntemlere yakınlaştırdı.
D'nin modernliğini şu şekilde kullanabilmek güzel olurdu ama şu an bir ayağı (kurucusu) topallıyor!i 😀
struct HexString(T)
{
union
{
T veri;
ubyte[T.sizeof] data;
}
this(T veri)
{
this.veri = veri;
}
this(const(char)[] str)
{
str.chunks(2)
.map!(bin => bin
.to!ubyte(16))
.copy(data[]);
}
//...
Teşekkürler...