PDA

View Full Version : سوال: تبدیل c++ struct به c#



mesgar
چهارشنبه 01 مهر 1388, 11:58 صبح
سلام
نمی دونم جای مطلب رو درست انخاب کردم یا نه چون همزمان به دو زبان برنامه نویسی مرتبط می باشد .
در استفاده از توابع dll ای به زبان سی پلاس پلاس در برنامه ای به زبان سی شارپ تابع ورودی در سی پلاس پلاس پوینتری از یک struct می گیرد که در اصل اشاره گری به یک آرایه از آن struct می باشد
حالا نمی دانم معادل آن struct و تابع آن چی بنویسم تا تابع بدرستی فراخوانی شود
کد struct به زبان سی و تعریف تابع در زبان سی را در زیر می آورم



typedef struct
{
char* mName; // Name of the feature
char* mDesc; // Description of the feature
uint16 mClass; // classification assigned to the feature
AttrValue_t* mAttrList; // List of attributes associated with feature
uint16 mNumAttrs; // Number of attributes in mAttrList
} VectorFeature;
void SetDisplayOptions
(
const VectorFeature* aOptions
);


AttrValue_t نیز خود یک struct می باشد که این نوع متغیرهاش ساده بود و تبدیل به سی شارپش رو نوشتم
در ضمن به سورس dll سی پلاس پلاس دسترسی ندارم .
حالا کسی می تونه بگه که چه کد معادلی برای struct بالا بنویسم و تعریف تابع برای import کردن و فراخوانی آن در سی شارپ چگونه خواهد شد ؟
ممنون

reza_ak
چهارشنبه 01 مهر 1388, 14:36 عصر
اگه میشه یک توضیح بیشتر بدی بهت کمک می کنم چون من هر دو زبان رو بلدم فقط بگو چی می خوایی

بمن سر بزن:http://barnamenevis.org/forum/showthread.php?p=811239#post811239

mesgar
شنبه 04 مهر 1388, 15:08 عصر
همانطوری که گفتم می خواهم از تابعی در یک dll به زبان سی پلاس پلاس در برنامه ای به زبان سی شارپ استفاده کنم که تعریف تابع در زبان سی پلاس پلاس رو در بالا آوردم(تابعی که می خوام فراخانی کنم تابع SetDisplayOptions می باشد)
که همونطور که در تعریف تابع مشخص می باشد ورودی تابع اشاره گری به شی ای از یک struct می باشد که تعریف struct را هم به زبان سی پلاس پلاس آوردم حال می خواهم بدانم چگونه می توانم این کار را انجام دهم
برای این کار می دانم باید معادل تابع را با کمک دستور import بنویسم ولی نمی دانم معادل اشاره گر چی بنویسم چون اشاره گر در سی شارپ نداریم
در مورد struct هم می دانم باید معادلش را بنویسم ولی باز در درون struct اشاره گر وجود دارد
حالا کسی جواب مسئله رو می دونه ؟

alireza_tavakol
شنبه 04 مهر 1388, 17:01 عصر
کار کردن با اشاره گر ها در C# به آسانی نوشیدن جرئه ای آب می باشد ( حتی ساده تر از C )

مراحل انجام کار

1- در پنجره sulotion explorer روی گزینه properties دوبار کلیک کنید
2- از تب build گزینه allow unsafe code رو علامت بگذارید
3- در هر بخش از برنامه لازم دارید از اشاره گر ها استفاده کنید بلوک unsafe تعریف نمایید
4- برای مقابله با جابه جایی اتوماتیک متغییر های تعریف شده توسط مدیر حافظه از بلوک fixed استفاده نمایید

در کل به غیر از موارد بالا همه چیز مثل زبان C ویا C++ است.

فقط توجه داشته باشید برای تعریف اشار گره به متد از delegate استفاده نمایید
کلیه مقادیر Reference Types اشاره گر هستند ( دقیقا مثل نام آرایه ها توی C )
اگه می خواهید آدرس یک متغییر رو واسه یک متد ارسال کنید در هنگام call و تعریف سیگناجر از کلمه ref استفاده نمایید

اگه تاپیک های که من ایجاد کردم رو بررسی کنید یا با کلید واژه هایی که بهتون دادم جستجو کنید حتما به نتیجه می رسید
اگه مثالی لازم دارین بفرمایید در خدمتم

mesgar
یک شنبه 05 مهر 1388, 14:47 عصر
ممنون از پاسختون
من همین کارهایی که گفتید کردم ولی به یک ارور برخورد کردم
همانطور که در بالا تعریف sruct مورد نظر رو به سی نوشتم دیده می شود در درون struct یک اشاره گر به یک struct دیگر (AttrValue_t) وجود دارد ولی وقتی می خواهم اشاره گری به آن strcut تعریف کنم ارور می دهد که : can not declare pointer to manage code
این ارور رو چه جوری می تونم رفع کنم ؟

alireza_tavakol
یک شنبه 05 مهر 1388, 15:09 عصر
- برای مقابله با جابه جایی اتوماتیک متغییر های تعریف شده توسط مدیر حافظه از بلوک fixed استفاده نمایید

توی struct که به عنوان پدر تعریف میشه باید از fixed استفاده کنی تا متغییری که اونجا تعریف میکنه توسط مدیر حافظه GC جابه جا نشه!

برای برنامه نویسی حافظه های unmanage هم باید از کتابخانه
System.Runtime.InteropServices
کلاس marshal استفاده کنی