ساخت dll برای رسم توابع در #C

m_mx2009

Member
سلام به همگی دوستان...
کسی dll آماده که یک رشته از توابع رو بگیره و بتونه مقدارش رو بدست بیاره سراغ داره...یا اصلا کلاسی واسه این کار در #C نوشته شده یا نه؟
مثلا رشته sin(x) + x^2 و همچنین مقدار x رو به عنوان ورودی بگیره و مقدارش رو حساب کنه....
با تشکر از همگی.....:rose::rose::rose:
 

the_king

مدیرکل انجمن
سلام به همگی دوستان...
کسی dll آماده که یک رشته از توابع رو بگیره و بتونه مقدارش رو بدست بیاره سراغ داره...یا اصلا کلاسی واسه این کار در #C نوشته شده یا نه؟
مثلا رشته sin(x) + x^2 و همچنین مقدار x رو به عنوان ورودی بگیره و مقدارش رو حساب کنه....
با تشکر از همگی.....:rose::rose::rose:

روش های مختلفی وجود داره که برای عبارت های ساده و عملگر های ابتدایی جواب میده :
کد:
            System.Xml.XmlDocument document = new System.Xml.XmlDocument();
            System.Xml.XPath.XPathNavigator navigator = document.CreateNavigator();
            double result = (double)navigator.Evaluate("2+3");
            MessageBox.Show(result.ToString());
یا
کد:
            DataTable table = new DataTable();
            table.Columns.Add(new DataColumn("Eval", typeof(double), "2+3"));
            table.Rows.Add(0);
            double result = (double)table.Rows[0]["Eval"];
            MessageBox.Show(result.ToString());

اما این روش ها در پشتیبانی کردن از توابع ریاضی خیلی ضعیف اند.
بهتره که از CSharpCodeProvider استفاده کنید که عملا می توانید هر کدی که خواستید در زمان اجرای برنامه
بصورت یک String تحویل دهید و باهاش اجرا کنید، نمونه اش در سایت codeproject.com هست :

Evaluate C# Code (Eval Function)
 

m_mx2009

Member
بهتره که از CSharpCodeProvider استفاده کنید که عملا می توانید هر کدی که خواستید در زمان اجرای برنامه
بصورت یک String تحویل دهید و باهاش اجرا کنید، نمونه اش در سایت codeproject.com هست :

Evaluate C# Code (Eval Function)

سلام دوست خوبم....
روشی که معرفی کردید رو من در ویژوال بیسیک 6 دنبالش میگشتم ولی متاسفانه به جایی نرسید .....
خیلی خوبه که در #C چنین امکانی وجود داره......اگه امکانش هست کمی بیشتر هم در موردش توضیح بفرمایید چون فکر میکنم سوال خیلی ها باشه....

ولی میخوام بدونم که میشه هر قسمت از کدهای برنامه رو با این روش جایگزین کنیم؟
مثلا در یک قسمت از برنامه : Y=.....code
میشه به جای code از این روشی که فرمودید استفاده کرد؟یعنی code رو با رشته ورودی جایگزین کرد؟
با تشکر:rose::rose:
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام دوست خوبم....
روشی که معرفی کردید رو من در ویژوال بیسیک 6 دنبالش میگشتم ولی متاسفانه به جایی نرسید .....
خیلی خوبه که در #C چنین امکانی وجود داره......اگه امکانش هست کمی بیشتر هم در موردش توضیح بفرمایید چون فکر میکنم سوال خیلی ها باشه....

ولی میخوام بدونم که میشه هر قسمت از کدهای برنامه رو با این روش جایگزین کنیم؟
مثلا در یک قسمت از برنامه : Y=.....code
میشه به جای code از این روشی که فرمودید استفاده کرد؟یعنی code رو با رشته ورودی جایگزین کرد؟
با تشکر:rose::rose:

کاری نیست که نشه با به این شیوه انجام داد چون در نوشتن کد هیچ محدودیتی ندارید، هر چی که بنویسید کامپایل
میشه و بعد می توانید اجرایش کنید، ولی صرفا زمانی قابل استفاده است که امکانات کامپایل کردن کد در سیستم
فراهمه، روی سیستمی که Windows SDK و کامپایلر #C نصب نیست صرفا با Net Framework. اجرا نمیشه چون
کامپایلری برای کامپایل کردن کد #C وجود نداره. به همین جهت اگر بخواهید برنامه را به شخص دیگری بدهید
باید مطمئن شوید که Visual Studio را نصب کرده باشد.

مساله دیگر سرعت اجرا است، اگر بخواهید یک یا چند حلقه محاسباتی بسازید، بهتر است که کد فرمول تان فقط یک بار
قبل از حلقه کامپایل شود و داخل حلقه فقط پارامتر اش را تغییر دهید، وگرنه کامپایل کردن کد هر بار که حلقه
اجرا می شود سرعت اجرا را خیلی کند خواهد کرد.

کد را طوری باز نویسی کردم که در کلاس ClassEVal سه تابع EVal و GetAssembly و EvalAssembly دارد.
تابع EVal عبارت مورد نظر را بصورت یک عدد double بر می گرداند، مثلا عبارت "2 + 3 * (Math.Pow(4, 5"
هر بار که EVal را فراخوانی کنید عبارت را در یک کد کامپایل خواهد کرد، پس سرعت اجرای بالایی ندارد.

تابع GetAssembly از شما یک عبارت را دریافت می کند که در آن متغیر x مجهول است و آنرا کامپایل می کند
و سپس Assembly اش را بر می گرداند. این Assembly را بعدا در تابع EvalAssembly بکار خواهید برد.

تابع EvalAssembly از شما Assembly و مقدار متغیر مجهول x را دریافت می کند و حاصل عبارت را بصورت
بصورت یک عدد double بر می گرداند. از آنجایی که Assembly قبلا کامپایل شده و EvalAssembly فقط آنرا
اجرا می کند سرعت اجرایش به مراتب بیشتر از EVal است، مخصوصا اگر بخواهید یک عبارت را چندین بار
اجرا کنید بهتر است بجای چندین EVal از ترکیب یک GetAssembly و چندین EvalAssembly استفاده کنید.

به مثال پیوستی مراجعه شود : EValFunction.zip
 

پیوست ها

  • EValFunction.zip
    45.9 کیلوبایت · بازدیدها: 5

جدیدترین ارسال ها

بالا