PDA

View Full Version : آموزش: دسترسي به اعضاي متغيرهاي از نوع Object



Moharram
سه شنبه 31 مرداد 1391, 15:14 عصر
سلام
توي Matlab يه DLL از نوع Generic COM Component درست كردم كه يه تابع داره. اين DLL رو تو #C ميخوام استفاده كنم. Type متغيرها رو به شكل Object نشون داده. براي دو تا از متغيرها كه ورودي هستند تونستم از نوع int استفاده كنم اما براي متغير خروجي حتما بايد از ref object استفاده بشه.
برنامه درست اجرا ميشه و موقع debug ميتونم داخل متغير خروجي رو كه شبيه آرايه شده ببينم اما نميدونم چطوري بايد به اعضاي اين آرايه دسترسي پيدا كنم. كدش اين زيره:

my_com_class x;
x = new my_com_class();
object a = null;
int b = 7, c = 5;
x.my_sum(1, ref a, b, c);

ممنون

مهرداد صفا
سه شنبه 31 مرداد 1391, 16:12 عصر
سلام
از طریق Type مربوط به object مورد نظر میتوانید به اعضای آن دسترسی داشته باشید. به عنوان نمونه:

object[] parameter=new object[3]{ a,b,c}
x.GetType().InvokeMember("my_sum",System.Reflection.BindingFlags.InvokeMethod,null, x,parameter);

Moharram
شنبه 04 شهریور 1391, 14:36 عصر
با تشكر از M.safa

اينجور كه من متوجه شدم با تابع InvokeMember يكي از تابعهاي dll به اسم my_sum فراخواني ميشه و خروجيش تو خروجي تابع InvokeMember كه خودش هم از نوع Object هستش قرار ميگيره... اما اين تابع my_sum خروجي نداره (void) و قراره تو پارامتر a كه از نوع ref هم هستش، خروجي رو برگردونه. ضمنا وقتي تستش كردم برنامه close ميشه.

فكر كنم منظور سوال رو بد مطرح كردم. تو پست اول گفتم كه خروجي كه همون a باشه وقتي BreakPoint ميذاري و مقدارش رو ميبيني (Watch) به شكل آرايه هستش و مثلا اينجوريه:

a[1,1] = 5
a[1,2] = 6
...

اما بعدش وقتي ميخواهي يكي از اين اعضا رو تو يه متغير مثلا int بريزي Error ميده و نميشه.
گذشته از اين مشكل، تو گام بعدي، من نياز دارم كه بدونم اين آرايه چند تا عضو گرفته. چون تو سمت Matlab ميشه هر سايزي آرايه درست كرد و توي اين متغير a ريخت.
ممنون

hakim22
شنبه 04 شهریور 1391, 17:48 عصر
اول اینکه هر خطایی دریافت می کنید متن کاملشو اینجا بگذارید تا ما هم بفهمیم چه خبره !!!

درسته که شما میتوانید Object رو در watch ببینید اما برای اینکه به int یا هر نوع متغیر دیگر درون دات نت بریزید باید عملیات تبدیل رو انجام بدید.
Type متغیرهای Matlab با دات نت یکی نیست .

برای اینکار Matlab چند کتابخانه جهت تبدیل انواع مختلف متغیرها به کلاسهای دات نت ساخته است.
تا جایی که یادمه کلاسی با عنوان MWArray.dll برای تبدیل ماتریس های متلب به آرایه های استاندارد وجود داره !

hakim22
شنبه 04 شهریور 1391, 17:51 عصر
اول اینکه هر خطایی دریافت می کنید متن کاملشو اینجا بگذارید تا ما هم بفهمیم چه خبره !!!

درسته که شما میتوانید Object رو در watch ببینید اما برای اینکه به int یا هر نوع متغیر دیگر درون دات نت بریزید باید عملیات تبدیل رو انجام بدید.
Type متغیرهای Matlab با دات نت یکی نیست .

برای اینکار Matlab چند کتابخانه جهت تبدیل انواع مختلف متغیرها به کلاسهای دات نت ساخته است.
تا جایی که یادمه کلاسی با عنوان MWArray.dll برای تبدیل ماتریس های متلب به آرایه های استاندارد وجود داره !

Moharram
یک شنبه 05 شهریور 1391, 09:28 صبح
متغير a شبيه آرايه هاي دو بعدي شده. وقتي ميخواي بهش مقدار بدي يا مقدارش رو تو يه متغير ديگه بريزي، error زير رو ميده:


Cannot apply indexing with [] to an expression of type 'object'

hakim22
یک شنبه 05 شهریور 1391, 12:59 عصر
مشکل شما با Casting حل میشه
اگر فرض کنیم که d متغیری از نوع int باشه که میخواهید اندیس 1و1 از آرایه ی a رو توش بریزید داریم :


d=( a as int[,] ) [1,1]


امیدوارم درست نوشته باشم !

Moharram
سه شنبه 07 شهریور 1391, 08:36 صبح
با تشكر از hakim22 عزيز، مشكل از همون Type Cast بود.

تو پارامترهاي تابع دو متغير b و c هم از نوع object هستند اما به اونها ميشه يه آرايه فرستاد، اما اين متغير a از نوع ref object شده و بايد بعد از مقدار گرفتن، با Type Cast مقاديرش رو به دست بياريم.

اينجا فقط براي اينكه بحث تكميل بشه، يه نمونه كد ساده براي تمرين ميذارم:

دو تا آرايه به b و c ميديم و تو Matlab جمع اعضاش رو بدست مياريم. اين دو تا جمع بدست اومده تو متغير a ريخته ميشن كه با تبديل به آرايه تو متغيرهاي اول و دوم اون قرار ميگيرن:


my_com_class x;
x = new my_com_class();

object a = null;
int[,] b = { { 1, 2, 3, 4 } };
int[,] c = { { 5, 6, 7, 8 } };

x.my_sum(1, ref a, b, c);

double b_sum = (a as double[,])[1, 1];
double c_sum = (a as double[,])[1, 2];


با تشكر از راهنمايي دوستان