Scilab'de C Programlarının Derlenmesi ve Çağrılması
Scilab'de C Programlarının Derlenmesi ve Çağrılması[1]
Tüm yorumlanan programlama dillerinde olduğu gibi Scilab'de yazılan programlar C programlama dili gibi doğal programlama dillerinde yazılan programlardan daha yavaş çalışırlar. Bu problem optimize edilmiş kütüphaneleri (örneğin BLAS ve LAPACK gibi) çağırarak ve Scilab'i arayüz gibi kullanarak çözülebilir.
Burada kısaca Scilab'de C programlarının nasıl yazılacağı, derleneceği, ve kullanıcı tarafından oluşturulmuş bir C programının nasıl çağrılacağı gösterilecektir.
64-bit Windows 7 makine üzerinde Scilab-5.4.1 kullanılmıştır. Başlamadan önce aşağıdakileri kontro edin.
havecompiler ile sisteminizde kurulu bir derleyici (compiler) olup olmadığını kontrol edin
Eğer yoksa, en iyi çözüm ücretsiz olarak edinebileceğiniz Microsoft Visual Studio 2010 Express C++[2] derleyicisidir.
Eğer Scilab'in 64-bit versiyonunu kullanmak isterseniz Microsoft Windos SDK[3] edinmeniz gerekir. Bu da ücretsiz olarak edinilebilir.
Derleyici kurulduğunda Scilab derleyiciyi otomatik olarak tanıyacaktır.
Burada Scilab yardım sayfasındaki optim[4] maddesi altında bulunan örnek kullanılacaktır.
Kodu doğrudan kopyalayıp Scilab komut penceresine yapıştırabilirsiniz. Örnekte verilen C programı string matris olarak yazılmış ve kayıt edilmiştir.
// External function written in C (C compiler required) // write down the C code (Rosenbrock problem) C=['#include <math.h>' 'double sq(double x)' '{ return x*x;}' 'void rosenc(int *ind, int *n, double *x, double *f, double *g, ' ' int *ti, float*tr, double *td)' '{' ' double p;' ' int i;' ' p=td[0];' ' if (*ind==2||*ind==4) {' ' *f=1.0;' ' for (i=1;i<*n;i++)' ' *f+=p*sq(x[i]-sq(x[i-1]))+sq(1.0-x[i]);' ' }' ' if (*ind==3||*ind==4) {' ' g[0]=-4.0*p*(x[1]-sq(x[0]))*x[0];' ' for (i=1;i<*n-1;i++)' 'g[i]=2.0*p*(x[i]-sq(x[i-1]))-4.0*p*(x[i+1]-sq(x[i]))*x[i]-2.0*(1.0-x[i]);' ' g[*n-1]=2.0*p*(x[*n-1]-sq(x[*n-2]))-2.0*(1.0-x[*n-1]);' ' }' '}'];
Mevcut bir C (veya FORTRAN) programınız varsa önceki adımı atlayabilirsiniz.
cd TMPDIR; mputl(C,TMPDIR+'/rosenc.c')
C programını aşağıdaki şekilde derliyoruz.
l=ilib_for_link('rosenc','rosenc.c',[],'c');
TMP klasörü altında aşağıdaki dosyalar üretilecektir.
rosenc.c Makelib.mak loader.sce librosenc.lib librosenc.exp librosenc.dll librosenc.def cleaner.sce
Derlenen C fonksiyonunu Scilab'e aşağıdaki şekilde yüklüyoruz.
exec loader.sce;
Yeni oluşturulan fonksiyonu aşağıdaki şekilde kullanabiliyoruz.
//solve the problem x0=[40;10;50]; p=100; [f,xo,go]=call('rosenc',x0,p)
Sonuç aşağıdaki gibi olacaktır.
-->[f,xo,go]=call('rosenc',x0,p) go = 100. xo = 40. 10. 50. f = rosenc
NOT: Güncel bir yöntem için Kaynak-5' bakabilirsiniz.
Kaynaklar
Compiling and calling a C program in Scilab @ Equalis Scilab Tips
Microsoft Visual Studio 2010 Express C++
Microsoft Windos SDK
Scilab Help Sayfası optim maddesi
WildCruncher Scilab Tip @ Equalis Scilab Tips
================================== Proge Consulting Ltd 2013, Tüm Hakları Saklıdır.











