November 02, 2022

On Wednesday, 2 November 2022 at 06:51:37 UTC, Salih Dincer wrote:

>

Bu kodun önbelleğinin (char[6] buffer) ilk 4 baytını çevirme, son 2 baytını birleştirme için kullandım...

Doğrulama yaptığım esnada, kodda bir takım hatalar tespit ettim. Aslında böyle olacaktı ama prensipte bellek ile ilgili konularda sıkıntı yok görünüyor:

import std;
import core.internal.string;

@safe void main()
{
  char[6] buffer;
  string hexStr;
  foreach(c; "D Lang".chunks(2))
  {
	auto str = buffer[4..$];
	     str.put(c);
    ushort n = buffer[5];
	      n |= buffer[4] << 8;
	 hexStr ~= n.unsignedToTempString!16(buffer)
                .format!" %s";
  }
  hexStr.writeln; //  4420 4c61 6e67

  auto backToString = hexString!"4420 4c61 6e67";
  backToString.writeln;
} /* ÇIKTISI:
 4420 4c61 6e67
D Lang
*/

Başarılar...

November 02, 2022
On 11/1/22 23:51, Salih Dincer wrote:

> Bu kodun önbelleğinin (`char[6] buffer`) ilk 4 baytını çevirme, son 2
> baytını birleştirme için kullandım.

Böyle akıllılıklar çok zevkli oluyor ama kodu anlamayı güçleştiriyor. Çalışıyorsa özel kodlarda diyecek bir şey yok ama bir "code review"da karşılaşmak istemezdim. :)

> Neticede `@safe` içinde ve hiçbir
> bellek taşması ve benzeri yok öyle değil mi? Yani kendi kümesinde öten
> bir horoz misali kimseyi rahatsız etmiyor olmalı :)

Evet, galiba hata yok.

Ali

November 03, 2022

On Wednesday, 2 November 2022 at 15:31:44 UTC, Ali Çehreli wrote:

>

Böyle akıllılıklar çok zevkli oluyor ama kodu anlamayı güçleştiriyor. Çalışıyorsa özel kodlarda diyecek bir şey yok ama bir "code review"da karşılaşmak istemezdim. :)

Olsun hocam çok şey öğreniyoruz. Hatta her iki işlevin de verileri karışmasın diye 6 elemanlı bir dizi yerine ushort için 4 elemanlı yetiyormuş bile:

auto toHexPair(R)(R str)
{
  import core.internal.string;
  import std.format, std.range;

  string result;
  char[4] buffer;

  foreach(pair; str.chunks(2))
  {
    auto slice = buffer[];
         slice.put(pair);

    ushort n = buffer[0] << 8;
    n |= pair.walkLength > 1 ? buffer[1] : 0;

    result ~= n.unsignedToTempString!16(buffer)
               .format!"%s ";
  }
  return result;
}

void main()
{
  import std.stdio;

  auto text = "Dlanguage";
  text.toHexPair.writeln;
  /* 446c 616e 6775 6167 6500
   * fazladan boşluk olunca ^-- bu kaybolcak
   */
}

Dikkatleri, özellikle auto toHexPair(const(char)[] str) satırına çekmek isterim; bu yeni öğrendiğim bir yöntem. Çünkü önceki gibi string alsaydı karakter temelli başka bir şey alamayacaktı.

Elbette işlev şablonu kullanarak (R)(R str) şeklinde de yapabilir, iota('a', 'z') gibi bir aralık da alabilirdi. Ama nedenini bilmediğim bir sebepten, chunks ya da walkLength öyle bir aralıkla çalışmıyor ve nihayetinde şöyle kullanmak gerekiyordu:

  auto text = iota('a', 'z').array;

toHexPair işlevi, ayrıca artık tek/çift ayrımı yaparak gelen dizgeye ekstra karakter eklemiyor. Basit bir ekleme ile (walkLength sağ olsun!) onu da halletim. Tabi UTF desteklemiyor. O beni şimdilik aşar 😉

Dip Not: Farkında olmadan, geçmişte Steven ile yaptığım tartışmada sunduğum HexStack ve onun önerdiği toChars() yerine yukardaki tek işlev çok daha başarılı sonuç verdiğini gördüm. Düşünsenize sadece 1 işlev!

Şimdi projeye takıldığım yerden son sürat devam...

1 2
Next ›   Last »