Tam Sürümünü Görmek İçin : Bu işi nasıl yaparım :(
Selam arkadaşlar.Size bir sorum var.Şimdi C++Builder'da kodları Code Window'a yazıyoruz.Ben öyle birşey yapmak istiyorum ki, program çalışırken bir dosyayı açıp içindeki kodları, sanki önceden Code Window'da yazılıymış gibi kullanayım.Bu iş epey aşar.Ama nasıl yapabilirim?
Teşekkürler...
nasil yani mesela compile edilmis kodu tekrar decompile edip kullanmak mi?
Hayır, örneğin;
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//Başla
int x, y;
x=4;
y=3;
ShowMessage(IntToStr(x+y));
//Bitir
}
//---------------------------------------------------------------------------
Bu koddaki //Başla ve //Bitir satırları arasındaki kısmı compile.dat dosyasına kaydedip, sonra tekrar bu kısmı, program çalışırken compile.dat dosyasından çağırıp uygulamaya sokmak istiyorum.
Biraz karışık ama :uff:
bu kodları tekrar çağırman biraz zor .tam olarak ne istediğini anlamadım ama .exesini çağırmayı düşünmedinmi.
Program normal çalışırken ben kendim bu kodları çağıracağım.Örneğin; Bir memo nesnesine bu kodları gireceğim, o da sanki önceden derlenirken varmış gibi bu kodları işleyecek.
program kodun herhangi yerinde yer alacak mı yoksa dosyadan memoya mı yükleyeceksin.
senin düşündüğünün olması biraz zor galiba.bunu denemedim ama bir bakabilirim
Tahmin ettiğin gibi dosyadan memoya yükleyeceğim.
Peki bu işin mantığı nedir?
acehreli
01/07/2003, 19:58
C ve C++ gibi derleyicili (compiled) dillerle yazilan kodlar, derleyici kullanilarak program haline getirilirler. Yorumlayicili (interpreted) dillerle yazilan kodlar ise dogrudan program olarak kullanilabilirler.
Bu durumda, benim aklima üç çözüm geliyor:
1) Kullanicinin girdigi kodu bir sekilde derlemek: Bunun çalisabilmesi için, kullanicinin bilgisayarinda mutlaka bir derleyici olmali, ve kod önce derlenerek çalisma zamaninda baglanabilecek bir koda (.dll, .so gibi) dönüstürülmelidir.
2) Kullanicinin kodunu baska bir dilde yazmasi: Bunun için kullanicinin python, scheme, tcl, vs. gibi yorumlayici kullanan dillerden birisini bilmesi, ve o dilin C (veya C++) ile iletisim saglayan bir kütüphanesini kullanilmasi gerekir. (Ben bunu eski bir projede scheme diliyle yapmistim.)
Kullanicidan alinan kod dogrudan o yorumlayiciya gönderilir ve yorumlayici tarafindan çalistirilir. O arayüz, C tarafindaki veri türleriyle o ikinci dilin veri türleri arasinda dönüsüm saglayan islevler de sunar. Örnegin C tarafindaki tamsayilar 32 bitlikken, scheme tarafindaki tamsayilar sonsuz haneli olabilirler.
3) Nette bir C (veya C++) yorumlayicisi bulunur: Evet, böyle seyler var. :) Bir zamanlar birisi bunu C++ için yapmaya çalisiyordu. google'da biraz aramak gerekebilir. Ben söyle bir sey buldum:
http://www.programmersheaven.com/zone3/cat215/18609.htm
Yanilmiyorsam bu yorumlayicilar dilin bütün olanaklarini destekleyemezler ama yine de ise yarayabilirler.
Ali
Teşekkür ederim, Ali.
Bu seçeneklerden en kolayı ve uygunu 1.şık.Zaten bunu yapabiliyorum;orada bir sorun yok.ancak ben biraz daha farklı şeyler istiyorum.Haklısın projeyi anlatmadan nerden bilebilirsin ki?
Benim yazdığım DOS benzeri(Win32 arayüzlü ve daha gelişmiş)bir komut satırı yorumlayıcısı programı var.Onu şuan geliştirmekteyim(Zaten Alpha sürümünü Ceviz.net üyelerine test ettireceğim :) ).Bu programda kodları özelleştirmek istiyorum.Mesela:
ab merhaba
diye bir kod olsun programda.Ben bu "ab" komutunun kullanıcı tarafından istenildiği gibi değiştirilmesini istiyorum.Ve program kullanıcıları programı geliştirmek için C\C++ dilini kullanarak programa eklemeler yapabilecek.
Aslında bütün amacım da bu.
acehreli
02/07/2003, 03:27
Ben birinci şıkkı da program içinden çağıracak şekilde önermiştim aslında. Yani kullanıcı bir şeyler yazacak, biz arkada derleyiciyi çalıştıracağız, sonra da o kodu çağıracağız...
Asıl istediğini yavaş yavaş daha doğru anlıyoruz galiba :) Belki de hâlâ doğru anlamıyoruz :)
Şimdi anladığıma göre, sen aslında bir yorumlayıcı yazıyorsun. Yani bir anlamda kendi programlama dilin var. Bu program kullanıcılarına bir pencere içinde kod yazma olanağı sağlıyor. Sen de yazılan kodu yorumlayıcı olarak çalıştırıyorsun.
Eğer o pencere içinde kullanılacak olan dilin C/C++ olmasında ısrar ediyorsan, aslında daha önce verdiğim bağlantıdaki programın benzeri bir iş yapıyorsun. Yani aslında bir C/C++ yorumlayıcısı yazıyorsun. Peki... :)
O zaman belki de soru, bu programın o pencereyi nasıl oluşturacağı ve kullanıcının metni nasıl düzenleyeceği... "Komut satırı" dediğine göre de görsel bir ortamdan yararlanamıyorsun. Evet, gerçekten soru bu galiba :) Eğer öyleyse, google'da 'text editor library' gibi bir aramayla bu işi yapan bir şeyler bulabilirsin.
Acaba vi ve emacs böyle arayüzler sunuyorlar mı? Hımmm... Şimdi aklıma geliyor... emacs'in buna benzer bir arayüzü var. Programlar emacs sunucusuna bağlanıp kullanıcının orada bir şeyler yazıp kaydetmesini bekliyorlar. Ondan sonra emacs bizim programa kullanıcının işini bitirdiğini söylüyor ve programımız da kullanıcının yazdığını yorumlamaya başlıyor.
Bu konuda
http://www.gnu.org/software/emacs/windows/ntemacs.html
sayfasındaki gnuserv/gnuclient bilgileri yardımcı olabilir.
vi'ın da buna benzer bir olanağı olmalı...
Ali
Orjinal mesajı gönderen MUBNET
Benim yazdığım DOS benzeri(Win32 arayüzlü ve daha gelişmiş)bir komut satırı yorumlayıcısı programı var.
Orjinal mesajı gönderen Ali Çehreli
"Komut satırı" dediğine göre de görsel bir ortamdan yararlanamıyorsun.
Komut satırı dememin sebebi, yazım kurallarının ve imlasının MS-DOS'a benzemesi.Yoksa arayüz Win32.Win32 de olmak zorunda.Başka türlü başa çıkılamaz;ayrıntıya girmiyorum.
Neyse seni de yoruyoruz.Tekrar teşekkürler :)
Kögüdey Meygen
09/07/2003, 16:07
Linux'te dlopen(),dlerror(),dlsym(),dlclose() foksiyonları var.
herhangi bir kütüphane dosyasını açıp içerisindeki bir fonksiyonu kullanabiliyorsunuz.
visual C++ tada vardı ama şuan hatırlayamıyorum ve kitabım yanımda değil.
Borland da birşeyler vardır bunlara karşılık gelen.
Zaten pluginler bu fonksiyonlar sayesinde yapılır.
orneğin x.dll olsun
bunun içerisinde abc_plugin() gibi bir fonksiyon olur.
program bu dosyayı plugin dizininde bulduğunda daha önceden kullanılan bir pointer fonksiyonu abc_plugine eşitleyip çalıştırır.
Yani sizin tam istediğiniz şey.
kullanıcı kendisi bir dll oluşturur ve belli bir yerde durur.
sizin programınız belli bir yerde bu dosyayı bulur ve içerisindeki belli bir fonksiyonu sizin orjinal ab fonksiyonu ile değiştirebilir.
dinamycally loading libraries gibi bir şeyler arat yardım içerisinde eminim birşeyler olacaktır.
Forum Yazılımı : vBulletin v3.6.8, Copyright ©2000-2008, Jelsoft Enterprises Ltd.