Thread overview
Üye fonksiyonu şablon olarak geçmek
Mar 16, 2019
kerdemdemir
Mar 16, 2019
kerdemdemir
Mar 16, 2019
kerdemdemir
Mar 17, 2019
kerdemdemir
March 16, 2019
struct MaxMinData
{
	PeakData maxMinData;
	int hours;

	void MaxMinUpdate( double price, SysTime time, TimePrice delegate(SysTime time ) func1, TimePrice delegate(SysTime time ) func2 )
	{
		maxMinData.Update(price, time);
		if ( Config.singleton().IsDurationPassed( maxMinData.max.time, hours.hours + 2.hours ) )
		{
			maxMinData.max = func1( Config.singleton().loopStartTime - hours.hours );
		}

		if ( Config.singleton().IsDurationPassed( maxMinData.min.time, hours.hours + 2.hours) )
		{
			maxMinData.min = func2( Config.singleton().loopStartTime - hours.hours);
		}
	}
}

struct PriceData
{
	MaxMinData[] maxMinData;

	void Update( double price, SysTime time )
	{
		maxMinData.each!( a => a.MaxMinUpdate(price, time, &GetMax, &GetMin)  );
	}
..
}

İlginç bir şekilde yukardaki fonksiyon parametrelerini bir türlü şablon olarak geçemedim . Yani şunu derleyemedim:

	void MaxMinUpdate(Max, Min)( double price, SysTime time, Max func1,  Min func2 )

Sebenini biliyormusunuz?

İkinci sorum :

Ali Abi'nin kitabında "http://ddili.org/ders/d.en/lambda.html" bölümünde "Member function pointers" diye bir başlık var ama

auto f = &MyStruct.func; // on a type
auto d = &o.func; // on an object

Eğer ben func fonksiyonunu MyStruct'ın bir instance'dan geçmeye çalışıyorsam (yukardaki gibi) nasıl yapmam gerektiği yok ne yazakki

acaba aşağıdakilerden hangisi doğru ?

auto f2 = this.func;
auto f2 = &this.func;
auto f2 = &func;
auto f2 = func;

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 17, 2019

Çok acayip acaba versiyondan kaynaklanıyor olabilir mi benim versiyonum

LDC - the LLVM D compiler (1.4.0):
based on DMD v2.074.1 and LLVM 4.0.1

Deneyip geri dönüş yapacağım 1. soru ile ilgili .

  1. soru biraz daha açayım member fonksiyon göstericileri şöyle belirticeğimizi yazmışsın Ali Abi

struct MyStruct {
void func() {
}
}

auto f = &MyStruct.func; // on a type
auto d = &o.func; // on an object

Fakat ya durum şöyle ise :

void func2(T)(T func )
{
}

struct MyStruct {
void func() {
// burda artık &o.func yapamam elimde o yok çünkü sadece this var.
// sorun ise aşağıdakilerden hangisinin doğru olduğu
auto f2 = this.func;
auto f2 = &this.func;
auto f2 = &func;
auto f2 = func;

  func(f2);

}
}

Abi bu durumda kafam daha öncede karışmıştı. Kitaba ekleme gibi bir durumun olabilirmi ?

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 17, 2019
  1. soruya dönüyorum :

Aldığım hata şu :

source/Utility/PeakData.d(186,13): Error: template Utility.PeakData.PriceData.Update.each!((a) => a.MaxMinUpdate(price, time, &GetMax, &GetMin)).each cannot deduce function from argument types !()(MaxMinData[]), candidates are:
/usr/local/bin/../import/std/algorithm/iteration.d(890,10): Utility.PeakData.PriceData.Update.each!((a) => a.MaxMinUpdate(price, time, &GetMax, &GetMin)).each(Range)(Range r) if (!isForeachIterable!Range && (isRangeIterable!Range || __traits(compiles, typeof(r.front).length)))
/usr/local/bin/../import/std/algorithm/iteration.d(925,10): Utility.PeakData.PriceData.Update.each!((a) => a.MaxMinUpdate(price, time, &GetMax, &GetMin)).each(Iterable)(auto ref Iterable r) if (isForeachIterable!Iterable || __traits(compiles, Parameters!(Parameters!(r.opApply))))
ldc2 failed with exit code 1

Çok üzgünüm ama D'nin range hata çıktıları benim açımdan C++ kadar anlaşılmaz.

Şimdi şunu ekledim

dub build --nodeps --skip-registry=none --compiler=dmd

Sonuç değişmedi :

source/Utility/PeakData.d(186,13): Error: template Utility.PeakData.PriceData.Update.each!((a) => a.MaxMinUpdate(price, time, &GetMax, &GetMin)).each cannot deduce function from argument types !()(MaxMinData[]), candidates are:
/usr/include/dmd/phobos/std/algorithm/iteration.d(904,10): Utility.PeakData.PriceData.Update.each!((a) => a.MaxMinUpdate(price, time, &GetMax, &GetMin)).each(Range)(Range r) if (!isForeachIterable!Range && (isRangeIterable!Range || __traits(compiles, typeof(r.front).length)))
/usr/include/dmd/phobos/std/algorithm/iteration.d(943,10): Utility.PeakData.PriceData.Update.each!((a) => a.MaxMinUpdate(price, time, &GetMax, &GetMin)).each(Iterable)(auto ref Iterable r) if (isForeachIterable!Iterable || __traits(compiles, Parameters!(Parameters!(r.opApply))))
dmd failed with exit code 1.

dmd --version

DMD64 D Compiler v2.080.0
Copyright (C) 1999-2018 by The D Language Foundation, All Rights Reserved written by Walter Bright

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 16, 2019

Birinci sorunu anlayamadım. Aşağıdaki kod bende derleniyor. (dmd 2.085.0 ile.)

import std.stdio;
import std.algorithm;

alias SysTime = int;
alias TimePrice = int;

struct PeakData {
 void Update(double, int) {
 }

 TimePrice max;
 TimePrice min;
}

struct MaxMinData
{
   PeakData maxMinData;
   int hours;

 void MaxMinUpdate(Max, Min)(double price, SysTime time, Max func1, Min func2 )
   {
       maxMinData.Update(price, time);
       maxMinData.max = func1(SysTime.init);
       maxMinData.min = func2(SysTime.init);
   }
}

struct PriceData
{
   MaxMinData[] maxMinData;

   void Update( double price, SysTime time )
   {
     maxMinData.each!(a => a.MaxMinUpdate(price, time, &GetMax, &GetMin));
   }

 TimePrice GetMax(SysTime time)
 {
   writeln("GetMax");
   return TimePrice.init;
 }

 TimePrice GetMin(SysTime time)
 {
   writeln("GetMin");
   return TimePrice.init;
 }
}

void main() {
 auto p = PriceData([ MaxMinData() ]);
 p.Update(1.5, SysTime.init);
}

İkinci soruyu da tam anlayamadım ama galida C++ ile olan bir farkı gözlemliyorsun. D'de bazı durumlarda açıkça lambda oluşturmak gerekir:

import std.stdio;

struct S {
 int min() {
   return 0;
 }

 int max() {
   return 1;
 }
}

void main() {
 auto a = (S s) => s.min();  // <-- Aradığın bu mu?
 auto b = (S s) => s.max();

 auto s = S();
 writeln(a(s));
 writeln(b(s));
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 17, 2019

Ali Abi konu konuyu açıyor ama senin bu konuda konuşmayı sevdiğini düşünüyor ve çekinmeden soruyorum

1 - Acaba &func dediğimizde neden delegate oluşuyordu da fonksiyon oluşmuyordu?

2 - İspat olarak yazdığın pragma anahtar kelimesi ne yapıyordu acaba. Şimdi kitabından da bakıp öğrenicem ama forumda da bulunsun istiyorum.

3 - Abi bu sorunla bir kaç kere karşılaştım üç ay sonra bir daha unutucam her defasında da "http://ddili.org/ders/d.en/lambda.html" bağlantısını bir daha okuyup aradığımı bulamıyorum. Üye işlevini yollayan sınıf örneğini "http://ddili.org/ders/d.en/lambda.html" bağlantısına eklemek iyi bir fikir olurmu ?

Erdemdem

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 17, 2019

Kendim bilseydim kitaba yazmış olurdum. ;) Anlaşılan, &func yazmak &(o.func)'ın eşdeğeri oluyor: oluşan delegate 'this'e zaten sahip:

void func2(T)(T func )
if (is (T == delegate))  // <-- İSPATLAMA İÇİN EKLEDİM
{
 assert(func() == 42);
}

struct MyStruct {
 int i;

   void foo() {
         // burda artık &o.func yapamam elimde o yok çünkü sadece this var.
       // sorun ise aşağıdakilerden hangisinin doğru olduğu
       // auto f2 = this.func;
       // auto f2 = &this.func;
     auto f2 = &func;           // <-- BU
     pragma(msg, typeof(f2)); // <-- İSPATI
       // auto f2 = func;

      func2(f2);
   }

 int func()
 {
   return 2 * i;
 }
}

void main() {
 auto s = MyStruct(21);  // <-- Sonuç 42 çıksın diye
 s.foo();
}

Derleme hatası için haklısın. dmd'ye -verrors ve -mixin gibi yararlı seçenekler eklediler. Ya yeni derleyiciyle çalışır ya da belki daha yardımcı olur. Ama each yerine bir döngü yazarsan tam olarak hangi noktada bir hata olduğunu daha kolay görebilirsin. Kolay gelsin. :/

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 18, 2019
  1. Çünkü D'de kural öyle. :) C++'taki gibi de tasarlanabilirdi ama herhalde derleyici yazan birisi olan Walter'ın bir bildiği vardır. (?)

  2. pragma(msg), derleme sırasında mesaj yazılmasını sağlar. mixin vs. gibi D olanakları sırasında çok yararlı oluyor.

  3. İyi fikir:

https://bitbucket.org/acehreli/ddili/issues/26/give-an-example-on-how-to-take-a-member

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]