Thread overview
const ile alakalı basit bir hata
Mar 12, 2023
Salih Dincer
Mar 12, 2023
Salih Dincer
Mar 12, 2023
Ali Çehreli
Mar 13, 2023
Salih Dincer
Mar 12, 2023
Ali Çehreli
March 12, 2023
>

onlineapp.d(7): Error: function onlineapp.xDot without this cannot be const

Basit ama çözemiyorum! Yani V2'nin kurucusunun mu olmasını istiyor yoksa kastedilen başka bir şey mi? Kod şöyle:

alias i32 = uint;
struct V2 {
  i32 x;
  i32 y;
}

i32 xDot(const V2 v0, const V2 v1) const {
  return v0.x * v1.x  + v0.y * v1.y;
} unittest {
  auto result = xDot(V2(125, 225), V2(325, 425));
  assert(result == 136250);
}

i32 xLen(const V2 n) /* const */ {
  return xDot(n, n).floorSqrt;
} unittest {
  auto v = V2(125, 225);
  assert(v.xLen == 257);
}

i32 floorSqrt(i32 n) {
  i32 result = 1;
  if(n == 0 || n == 1) {
    result = n;
  } else {
    i32 i = 1;
    while(result <= n) {
      i++;
      result = i * i;
    }
    result = i - 1;
  }
  return result;
} unittest {
  uint i; import std.math;
  foreach(real n; 0..20) {
    assert(n.sqrt.floor == floorSqrt(i++));
  }
}

Burada, standart kütüphaneden bağımsız grafik uygulamaları için sdb.graph modülümü geliştirmeye çalışıyorum. Her şey şimdilik 2 boyutlu ama henüz karmaşık algoritmalara geçmeden basit bir şeyde takıldım.

Tamam, hala const olayını tam anlayamıyorum. Zaten nesne aktarılırken kopyası alınmıyor mu?

Neyse hatanın sebebini bilen var mı?

Gerekli/gereksiz kendimi const kullanıyor buldum; anlama yolunda ve's-selam!

March 12, 2023

On Sunday, 12 March 2023 at 07:44:01 UTC, Salih Dincer wrote:

> >

onlineapp.d(7): Error: function onlineapp.xDot without this cannot be const

Basit ama çözemiyorum!

const'u anlama (gerçekten D dünyasında ihtiyaç var mı!) çabası ağır basmış olacak ki kendimi bir örnek (class Foo) ve bunu test eden A ve B işlevleri (auto inConst & const(T) outConst) yazarken buldum. İşte şurada Learn'e sordum:

https://forum.dlang.org/post/aryixsjohgrgkhsjxfea@forum.dlang.org

Sanırım bu const'u anlama girişimlerinden 10.'su ve hala çok gerekli olmadığına inananlardanım. Tabi ki performans istiyor ve kopyalar ile çalışıyorsanız belki de gereklidir ha?

Konuya katkı saplayacak herkese şimdiden teşekkür ederim, sevgilerimle...

Tekniker Salih Dinçer

March 12, 2023
On 3/11/23 23:44, Salih Dincer wrote:

> i32 xDot(const V2 v0, const V2 v1) const {

İlk iki 'const'ın anlamı: "Bu parametreyi değiştirmeyeceğim".[1]

Üçüncü 'const'ın anlamı: "Gizli 'this' parametresinin 'const' olmasını istiyorum böylece bu nesnede değişiklik yapmayacağım."

Üçüncü 'const'taki hata, xDot'ın bir üye işlev olmamasından kaynaklanıyor. Derleyici, "this'i olmayan işlevi nasıl 'const' yapayım" anlamında bir hata veriyor. Yani o 'const' yalnızca üye işlevlerde anlamlıdır.

Ali

[1] Senin de dediğin gibi, parametrelerdeki 'const'ların anlamı yok. Çağıran taraf şöyle diyor: "İyi demişsin, güzel demişsin de, bana ne? V2 kopyalandığına göre ister değiştir, ister değiştirme, beni ilgilendirmez."

Gerçekten de öyle: Kopyalandığına göre o 'const'ların tek anlamı, işlevi yazan kişinin kendi kendisine "aman bu kopyayı işlev içinde yanlışlıkla değiştirmeyeyim, derleyici beni korusun" anlamına geliyor. Çağıranı hiçbir zaman ilgilendirmeyecek olan bir heves.

O 'const'ın çağıranı ilgilendirmesi için, V2'nin içinde gösterge gibi bir eriştiricinin bulunması (örneğin 'int* p;') gerekir. İşte o zaman çağıran yapı nesnesini işleve güvenle gönderebilir. (Bu durum, xDot bir şablon olduğunda önemlidir.)

March 12, 2023
On 3/12/23 08:21, Salih Dincer wrote:

> Sanırım bu `const`'u anlama girişimlerinden 10.'su ve hala çok gerekli
> olmadığına inananlardanım.

Kendi kodun içinde gerek yok ama yararlı bir olanaktır.

Kodun başka insanların 'const' nesneleriyle kullanılabilmesini istiyorsan 'const' doğruluğunu (const-correctness) sağlaman gerekir.

Ali

March 13, 2023

On Sunday, 12 March 2023 at 19:20:49 UTC, Ali Çehreli wrote:

>

Kodun başka insanların 'const' nesneleriyle kullanılabilmesini istiyorsan 'const' doğruluğunu (const-correctness) sağlaman gerekir.

Learn'deki cevabınız ve özellikle -preview=in öneriniz için teşekkür ederim. Ben bunu bilinçli bir şekilde ilk defa kullanıyorum ama evet, bir kere JitsiMeet'de göstermiştiniz ve varsayılan özellik olmadığından hayatımda yer almamıştı...

Heyecanla hemen denemek için ctor'u kapattım ve başıma gelecek şeyi bilerek parametreyle derledim ve ekrana yazarken patladı. Sonra alias x this ile denedim olmadı. Belki kendi toString'imi yaparım dedi o da olmadı :)

En sonunda to!string ile çevirmek aklıma geldi çünkü yapı kopyalanamıyordu. Neyse çalışan örneği paylaşayım (-preview=in ile derleyin):

struct Foo(T) {
  T x;
  @disable this(this);
  // alias x this; // işe yaramadı
  alias fmt = void delegate(in char[]);
  void toString(scope fmt sink) const
  {
    sink("Foo.x = ");
    sink(this.x.text);
  }
}
alias Int = Foo!int;

import std.stdio;
import std.conv;
import std.traits: isMutable;

void main()
{
  auto a = Int(41);
  auto b = Int(1);
  auto r = a.inConst(b);/*
  auto r = a.outConst(b);
  assert( r.x == 42 &&
    !isMutable!( typeof(r) )
  );//*/
                     //               inConst()  outConst()
  writefln("%s\n%s", a.to!string  // Foo.x = 41        "41"
                   , r.to!string);// Foo.x = 42  const("42")
}

auto inConst(
  //const   const ref
  in Int a, in Int b)
{
  //a.x += 1;
  return Int(a.x + b.x);
}

auto outConst(in Int a, in Int b)
{
  return const Int(a.x + b.x);
}