Thread overview
Kütükde takma isim ile yapılan değişiklikleri kaydetmek
Aug 22, 2017
erdem
Aug 22, 2017
erdem
Aug 22, 2017
erdem
Aug 24, 2017
erdem
Aug 26, 2017
erdem
Aug 26, 2017
erdem
Aug 28, 2017
Salih Dinçer
Aug 29, 2017
erdem
August 22, 2017

Hatırlarsanız gtkd dersleri hazırlıyordum. Ama bu gün denediğimde baktım ki 64 bit üzerinde kütüphanenin 3.5.1 sürümü derlenmiyor.

Eski kütüklerde yerelleştirme çalışması yapmıştım. Örneğin eski kütüğümüz:

class Birseyler
{

   public string getLabel()
   {
   }

   alias etiketÖğren = getLabel;

   public void setLabel()
   {
   }

   alias etiketBelirle = setLabel;

   gulong addOnClicked()
   {
   }
   alias tıklandığında = addOnClicked;

   protected void internalRemoveOnReleased(OnReleasedDelegateWrapper source)
	{
	}
}

alias Düğme = Button;

Bu kütüphane güncellendikten sonra değişmiş. Örnek olsun diye yazıyorum:

class BirseylerYeniSurum
{

   public string getLabel()
   {
   }

   public void setLabel()
   {
   }

   gulong addOnClicked()
   {
   }

   protected void internalRemoveOnReleased(OnReleasedDelegateWrapper source)
	{
	}

   // yeni işlevler eklenmiş


	extern(C) static void callBackReleasedDestroy(OnReleasedDelegateWrapper wrapper, GClosure* closure)
	{

	}
}

Şimdi eski kütükte bulunan alias tanımlamalarını yeni kütüğe nasıl aktarabiliriz bir fikri olan var mı acaba.

Örneğin 'alias etiketBelirle = setLabel;' için düşünürsek hem bu bilgiyi hem de kendisinden önceki işlevin ismini ve dönüş türünü kaydedersek 'void setLabel()' sizce yeterli olur mu.

Buradaki en sondaki takma isim de hiç işlevlerle bağlantısı yok sadece kütük ismi için bir takma isim.

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

August 22, 2017

Şimdilik şu şekilde aldım. ;-)

import std.stdio;
import std.string;
import std.algorithm;

struct Yerel
{
   string kayıt;
   string bağlandığıYer;
}

void main()
{
   Yerel[] yereller;

   File dosya = File("eski/Button.d", "r");

   string[] öncekiSatırlar;

   while (!dosya.eof())
   {
       string satır = strip(dosya.readln());

       if (canFind(satır, "alias"))
       {
           // writeln(satır);
           // writeln("Önceki satırlar :");
           for (auto i = öncekiSatırlar.length - 1; i!= 0; --i)
           {
               auto seçiliSatır = öncekiSatırlar[i];

               if (canFind(seçiliSatır, "{"))
               {

                   writeln(öncekiSatırlar[i-1]);
                   yereller ~= Yerel(satır, öncekiSatırlar[i - 1]);
                   break;
               }

           }
           öncekiSatırlar = [];

       }
       öncekiSatırlar ~= satır;
   }

   writeln ("Yerelleri yazıyorum");

   foreach (yerel; yereller)
       writeln(yerel);

   File yeniDosya = File("yereller/Button.d.tr", "w");

   foreach (yerel; yereller)
       yeniDosya.writeln(yerel);

}

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

August 22, 2017

Kodun güncel hali de şu şekilde oldu:

import std.stdio;
import std.string;
import std.algorithm;

struct Yerel
{
   string kayıt;
   string bağlandığıYer;

   this(string kayıt, string bağlandığıYer)
   {
       this.kayıt = kayıt;
       if (canFind(bağlandığıYer, "("))
       {
           // write("Bağlandığı yer");
           // writeln(split(bağlandığıYer, "(")[0]);
           auto kısaltılmış = (split(bağlandığıYer, "(")[0]);
           this.bağlandığıYer = kısaltılmış;
       }
       else
       {
           this.bağlandığıYer = bağlandığıYer;
       }

   }

   string toString()
   {
       return format("%s|%s", kayıt, bağlandığıYer);
   }

}

void main()
{
   Yerel[] yereller;

   string dosyaİsmi = "eski/Button.d";
   auto parçalar = findSplit(dosyaİsmi, "/");
   string aranan = parçalar[parçalar.length - 1];
   auto arananParça = findSplit(aranan, ".")[0];

   // writeln("Aranan parça ", arananParça);

   File dosya = File(dosyaİsmi, "r");

   string[] öncekiSatırlar;

   while (!dosya.eof())
   {
       string satır = strip(dosya.readln());

       if (canFind(satır, "alias"))
       {
           // writeln(satır);
           // writeln("Önceki satırlar :");
           for (auto i = öncekiSatırlar.length - 1; i!= 0; --i)
           {
               auto seçiliSatır = öncekiSatırlar[i];

               if (canFind(seçiliSatır, "{"))
               {

                   // writeln(öncekiSatırlar[i-1]);
                   if (canFind(satır, arananParça))
                   {
                       yereller ~= Yerel(satır, "son");
                   }
                   else
                   {
                       yereller ~= Yerel(satır, öncekiSatırlar[i - 1]);
                   }

                   break;
               }

           }
           öncekiSatırlar = [];

       }
       öncekiSatırlar ~= satır;
   }

   writeln ("Yerelleri yazıyorum");

   foreach (yerel; yereller)
       writeln(yerel);

   File yeniDosya = File("yereller/Button.d.tr", "w");

   foreach (yerel; yereller)
       yeniDosya.writeln(yerel);
}

Çıktısı da şu şekilde:

'$ ./yerellericek
Yerelleri yazıyorum
alias etiketÖğren = getLabel;|public string getLabel
alias etiketBelirle = setLabel;|public void setLabel
alias tıklandığında = addOnClicked;|gulong addOnClicked
alias Düğme = Button;|son'

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

August 24, 2017

Yerelleri yeni kaynak dosyaya ekleyen bölümü de yazdım. Kod içinde en çok püf nokta gerektiren kısım burası olabilir. Çünkü kodu şu şekilde kapsam parantezlerinden sonra eklemesi gerekiyordu.

' public string getLabel()
{
/+ .. +/
}

alias etiketÖğren = getLabel;'

std.stdio ile std.file çakışıyormuş. Onu da şu şekilde hallettim.

'alias write = std.stdio.write;'

Yerelleri kaynak dosyaya ekleyen bölümün kodu şu şekilde:

// yerelleriyaz.d
import std.stdio;
import std.string;
import yardımcı;
import std.algorithm;
import std.file;

alias write = std.stdio.write;

Yerel[] yerelleriOku(string kütükİsmi)
{
   auto dosya = File(kütükİsmi, "r");
   Yerel[] yereller;

   while (!dosya.eof())
   {
       string satır = strip(dosya.readln());
       auto parçalar = split(satır, "|");

       if (parçalar.length > 0)
       {
           write(parçalar[0] ~ "-->");
           //write("Parçalar", parçalar);

           yereller ~= Yerel(parçalar[0], parçalar[1]);
       }
   }

   return yereller;
}

void yerelleriYaz(string kütükİsmi)
{
   auto kısaDosyaİsmi = dosyaİsminiGetir(kütükİsmi);
   auto yerelDosyaİsmi = "yereller/" ~ kısaDosyaİsmi ~ ".tr";

   writeln("Kısa dosya ismi", kısaDosyaİsmi);

   writeln("yerel dosya ismi :", yerelDosyaİsmi);

   auto yereller = yerelleriOku(yerelDosyaİsmi);

   string[] tümSatırlar;

   writeln("Yereller :");

   foreach (yerel; yereller)
       writeln(yerel);

   auto dosya = File(kütükİsmi, "r");

   int i = 0;

   while (!dosya.eof())
   {
       string satır = dosya.readln();
       tümSatırlar ~= satır;
       if (canFind (satır, yereller[i].bağlandığıYer))
       {
           writeln("Buldum:");
           write("Satır ...", satır);
           writeln("Kayıt ..", yereller[i].bağlandığıYer);

           while (!dosya.eof())
           {
               satır = dosya.readln();
               tümSatırlar ~= satır;

               write ("Satır -->", satır);
               if (canFind (satır, "}"))
               {

                   writeln("Konum", dosya.tell());
                   tümSatırlar ~= "\n";
                   tümSatırlar ~= '\t' ~ yereller[i].kayıt ~ '\n';
                   ++i;
                   break;
               }
           }
           // break;

       }
   }

   foreach (yerel; yereller)
   {
       if (yerel.bağlandığıYer == "son")
       {
           tümSatırlar ~= "\n";
           tümSatırlar ~= '\t' ~ yerel.kayıt ~ '\n';
       }
   }

   auto güncelDosyaİsmi = "güncel/" ~ kısaDosyaİsmi;
   auto yol = kısaDosyaİsmi.findSplit("/")[0];
   writeln ("Yol", yol);

   chdir ("güncel/");
   if (!exists(yol))
       mkdir(yol);
   chdir(yol);
   chdir("../");
   chdir("../");

   auto güncelKütük = File(güncelDosyaİsmi, "w");

   foreach (satır; tümSatırlar)
       güncelKütük.write(satır);

   writeln("Bulunduğum dizin", getcwd);
}

Yerel de basit bir yapı:

struct Yerel
{
   string kayıt;
   string bağlandığıYer;

   this(string kayıt, string bağlandığıYer)
   {
       this.kayıt = kayıt;
       if (canFind(bağlandığıYer, "("))
       {
           auto kısaltılmış = (split(bağlandığıYer, "(")[0]);
           this.bağlandığıYer = kısaltılmış;
       }
       else
       {
           this.bağlandığıYer = bağlandığıYer;
       }

   }

   string toString()
   {
       return format("%s|%s", kayıt, bağlandığıYer);
   }
}

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

August 26, 2017

Yerelleri ekleyen program kütüğün bir tanesinde çakıldı.

Alıntı:

>

eski/gobject/ObjectG.d
Aranan parçaObjectG
Kütük ismi eski/gobject/ObjectG.d
Yerelleri yazıyorum
alias bildirimGeldiğinde = addOnNotify;|gulong addOnNotify
alias Nesne = ObjectG;|son
Kısa dosya ismi : ObjectG.d
Yolgobject
Büyüklük2
Bulunduğum dizin/home/erdem/Belgeler/dsoru
Kısa dosya ismigobject/ObjectG.d
yerel dosya ismi :yereller/gobject/ObjectG.d.tr
alias bildirimGeldiğinde = addOnNotify;-->alias Nesne = ObjectG;-->Yereller :
alias bildirimGeldiğinde = addOnNotify;|gulong addOnNotify
alias Nesne = ObjectG;|son
Satır --> {
Satır --> string signalName;
Satır -->
Satır --> if ( property == "" )
Satır --> signalName = "notify";
Satır --> else
Satır --> signalName = "notify::"~ property;
Satır -->
Satır --> auto wrapper = new OnNotifyDelegateWrapper(dlg);
Satır --> wrapper.handlerId = Signals.connectData(
Satır --> this,
Satır --> signalName,
Satır --> cast(GCallback)&callBackNotify,
Satır --> cast(void*)wrapper,
Satır --> cast(GClosureNotify)&callBackNotifyDestroy,
Satır --> connectFlags);
Satır --> return wrapper.handlerId;
Satır --> }
Konum7488
Satır --> * is important state in the proxy object.
Satır --> *
Satır --> * Params:
Satır --> * notify = a function to call when this reference is the
Satır --> * last reference to the object, or is no longer
Satır --> * the last reference.
Satır --> * data = data to pass to @notify
Satır --> *
Satır --> * Since: 2.8
Satır --> /
Satır --> public void addToggleRef(GToggleNotify notify, void
data)
Satır --> {
Satır --> g_object_add_toggle_ref(gObject, notify, data);
Satır --> }
Konum14987
core.exception.RangeError@yerelleriyaz.d(62): Range violation

??:? _d_arrayboundsp [0x4ba022]
??:? void yerelleriyaz.yerelleriYaz(immutable(char)[]) [0x4b7dd0]
??:? _Dmain [0x4a05a9]

Bakıyorum yerel dosyasında da hata yok gibi gözüküyor.

// ObjectG.d.tr

Alıntı:

>

alias bildirimGeldiğinde = addOnNotify;|gulong addOnNotify
alias Nesne = ObjectG;|son

yerelleriyaz.d kütüğünde de hata veren kısım burası gözüküyor.

       if (canFind (satır, yereller[i].bağlandığıYer))

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

August 26, 2017

Sorun yerelleriyaz.d kütüğündeki yerel bilgileri ile güncel kaynak kodu birleştiren kısımdan kaynaklanıyormuş.

Aslında biraz mantıksız olsa da şöyle yaptım.

       if (i == yereller.length)
           i = 0;

Kodda da hala hatalar var ya da iyileştirmeler yapılabilir.

Örneğin:

	this(uint interval, bool delegate() dlg, bool fireNow=false)
	{
		timeoutListeners ~= dlg;
		timeoutID = g_timeout_add(interval, cast(GSourceFunc)&timeoutCallback, cast(void*)this);
		if ( fireNow )
		{
			if ( !dlg() )
			{
				timeoutListeners.length = 0;
			}

	alias dur = stop;
		}
	}

Gördüğünüz gibi alias ifadesini kapama parantezlerinden sonra koyması gerekirken işlevin içine atmış. Bunun dışında alt alta bir kaç tane alias tanımlaması yapıldığında bunları doğru alamadığını farkettim.

Aslında bu basit bir soru gibi gözükse de naçizane kanaatim işe alma için mülakat sorusu olabilir.

Sonra en iyileştirme yapılacak bölümlerden birisi de elimizde yereller var ve bunu güncel kaynak dosyayla birleştirmek istiyoruz. İşte belki de bu programın en püf noktalarından bir tanesi. Çünkü kaynak kodun ortasını veriler yazıyoruz, kapama parantezlerinden ( kod bloklarından) sonra yazmak istiyoruz. Sonra alt alta bulunan alias tanımları var.

Dosyada gezinirken auto konum = kütük.tell() şeklinde de gezebiliyormuşuz. Sonra değişikliklerin takibi için belki hash kütüklerinden faydalanılabilir.

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

August 26, 2017

Dosyanın sonunda boş satır bulunmaması ile ilgili bir sorun olabilir. D'de nasıl olduğunu hatırlamıyorum ama eof() true döndürmediği halde dosyada satır kalmamış olabiliyor.

Yani, D runtime'a güveniyorum ve yereller'de i'inci eleman olmadığını düşünüyorum. yereller.length'i hemen öncesinde yazdırmayı deneyebilirsin.

Ali

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

August 28, 2017

Burada yapılmak istenen, kod yazılırken otomatik şekilde kod eklemek mi, anlayamadım?

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

August 29, 2017

Burada yapılmak istenen gtkd kütüphanesinin 3.5.1 sürümündeki yerel tanımlamalarını çekip gtkd'nin 3.6.6 sürümüne aktarmaktı.

Örnek olarak bir yerel şuna benziyor.

https://github.com/erdemoncel/gtkd/blob/master/bak%C4%B1m/yereller/gtk/Button.d.tr

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