PDA

View Full Version : یه سوال در مورد struct در سی شارپ



Mr.reCoder
پنج شنبه 16 تیر 1390, 14:01 عصر
سلام

اقا یه سوال در مورد struct دارم!:لبخندساده:
مثلا در سی وقتی struct تعریف میکنیم میتونیم اونو مثل یه متغیر به یه تابعی مثل ReadFile بفرستیم (که البته راهی برای نامگذاری حافظه و بافر است!!) حالا در سی شارپ struct رو چطوری به تابع ReadFile بفرستیم؟؟؟

navidiran
پنج شنبه 16 تیر 1390, 14:22 عصر
یه متغییر عمومی تعریف کن بفرست.
آیا نیازی داری که با دستورات اولیه C++ کار کنی؟

Farshid007
جمعه 17 تیر 1390, 10:37 صبح
کی گفته در سی شارپ struct وجود نداره؟؟؟؟؟

flash118
جمعه 17 تیر 1390, 11:39 صبح
دوست عزیز Mr.reCoder :
اولا لطفا اول از حرفتون مطمئن بشید بعد بگید وجود داره یا نداره و دوم همان طور که میدونید C# از خانواده c هست و از این خانواده بوجود آمده تو کدوم نسل این خانواده ساختار وجود نداره؟؟؟!!!
دوم دوست عزیز که پیشنهاد دادید از متغییر عمومی استفاده کنه پیشنهاد میکنم یه بررسی اجمالی کنید که چه وقت از ساختار استفاده میکنیم و چه وقت از متغییر فکر کنم اگه بررسی کنید خواهید دید که وجود ساختار خیلی از کد نویسی و بار اضافی حافظه رو کم خواهد کرد و غیر که در این بحث نمی گنجه
اگه در مورد تعریف و استفاده ساختار مشکل دارید بفرمایید تا براتون نمونه قرار بدیم
به امید موفقعیت تمام ایرانی و ایرانی یا حق

Mr.reCoder
شنبه 18 تیر 1390, 11:11 صبح
اقایون اولا ممنون از جوابتون!!
مثل اینکه من منظورم رو خوب نروسندم!!:اشتباه:
بنده منظورم اینه که اونطوری که struct در c کار میکنه تو سی شارپ اینجوری نیست! من میخوام یه struct در سی شارپ رو به تابع ReadFile بدم! این جرمه؟؟:عصبانی++:
سی شارپ که میگه آره!!!!:ناراحت:


---------------------------------------------------------

ثانیا بنده از اصولا دات نت رو به دلایل سرعت و پرتابل نبودن قبول ندارم. هر چند که کد نویسی رو کم کرده!!!
اما دنیا به هیچ کس وفا نمیکنه!! مار از پونه بدش میاد، با پست براش میفرستن!!!! یا ایمیل میکنن!:متفکر:

Farshid007
شنبه 18 تیر 1390, 14:34 عصر
File.ReadAllText فقط یه رشته می تونه پارامتر بگیره نمیشه که بهش Struct بدی!!!!!!!!!!!!!!!!!

Mr.reCoder
یک شنبه 19 تیر 1390, 08:58 صبح
File.ReadAllText فقط یه رشته می تونه پارامتر بگیره نمیشه که بهش Struct بدی!!!!!!!!!!!!!!!!!


من منظورم تابع ReadFile توی kernel32.dll است. تو سی که میشه!! میخوام تو سی شارپ هم بشه:متفکر:!!!!

Farshid007
یک شنبه 19 تیر 1390, 13:47 عصر
تو باید Import DLL
کنی
اینجوری:

[System.Runtime.InteropServices.DllImport("kernel32.dll")]

به مغز من نمیشه اکتفا کرد این کارو بسپبر به حرفه ای تر از من

Mr.reCoder
دوشنبه 20 تیر 1390, 09:27 صبح
تو باید Import DLL
کنی
اینجوری:

[System.Runtime.InteropServices.DllImport("kernel32.dll")]

به مغز من نمیشه اکتفا کرد این کارو بسپبر به حرفه ای تر از من


عزیزم ممنون از جوابت!!:افسرده: اما من تو فراخوانی یا import کردنش مشکلی ندارم!! فقط میخوام Struct رو به تابع بفرستم!! خیلی عجیبه !!!!:متفکر:

Legend M.A.R
پنج شنبه 23 تیر 1390, 19:21 عصر
یه کار میگم انجام بده اول ساختار رو به byte[]تبدیل کن یا برعکس بر اساس اندازه struct از فایل مورد نظرت بخون بعد با توابع تغییر byte اون رو به ساختار خودت تبدیل کن, یه مثال داشتم اگر پیداش کردم برات میفرستم
اینجا رو نگاه کن (http://stackoverflow.com/questions/2384/read-binary-file-into-a-struct-c)

Mr.reCoder
سه شنبه 28 تیر 1390, 09:46 صبح
یه کار میگم انجام بده اول ساختار رو به byte[]تبدیل کن یا برعکس بر اساس اندازه struct از فایل مورد نظرت بخون بعد با توابع تغییر byte اون رو به ساختار خودت تبدیل کن, یه مثال داشتم اگر پیداش کردم برات میفرستم
اینجا رو نگاه کن (http://stackoverflow.com/questions/2384/read-binary-file-into-a-struct-c)

آقا ممنون از جوابت! به صفحه ای که گفتی رفتم!! واح واح واح!! صد رحمت به اسمبلی خودم!! نمیدونستم C# هم گاوچرون ها رو میشناسه!! این مارشال چیه یا کیه دیگه!! :متعجب: هر چیزی رو بخوای به دیگری تبدیل کنی بایست این آقای مارشال رو ملاقات کنی:متفکر:
اما من یه کار دیگه کردم شاید ایده ی عالی نباشه! رفتم تو C توابعی رو که لازم داشتم تو اون نوشتم بعد DLL کردم اومدم تو C# استفاده کردم!(ایول به IQ ی خودم!!!:چشمک:) اینم بخاطر این بود که آقای مارشال هی گیر میداد.
اما مثل اینکه کدی که اونجاست خوبه شاید برنامه رو دوباره ویرایش کردم و از اینا استفاده کردم!!:تشویق:

saman6384
سه شنبه 28 تیر 1390, 10:09 صبح
من از این اتریبیوت استفاده کردم جواب گرفتم

StructLayoutAttribute Class (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribu te.aspx)

yeganehaym
سه شنبه 28 تیر 1390, 10:34 صبح
من متوجه موضوع نشدم ولی اگه استفاده این تابع در سی شارپ رو نگاه بکنی ممکنه کمکی بهت بکنه
http://msdn.microsoft.com/en-us/library/2d9wy99d%28v=vs.80%29.asp (http://msdn.microsoft.com/en-us/library/2d9wy99d%28v=vs.80%29.aspx)x

Legend M.A.R
سه شنبه 28 تیر 1390, 12:18 عصر
آقا ممنون از جوابت! به صفحه ای که گفتی رفتم!! واح واح واح!! صد رحمت به اسمبلی خودم!! نمیدونستم C# هم گاوچرون ها رو میشناسه!! این مارشال چیه یا کیه دیگه!! :متعجب: هر چیزی رو بخوای به دیگری تبدیل کنی بایست این آقای مارشال رو ملاقات کنی:متفکر:
اما من یه کار دیگه کردم شاید ایده ی عالی نباشه! رفتم تو C توابعی رو که لازم داشتم تو اون نوشتم بعد DLL کردم اومدم تو C# استفاده کردم!(ایول به IQ ی خودم!!!:چشمک:) اینم بخاطر این بود که آقای مارشال هی گیر میداد.
اما مثل اینکه کدی که اونجاست خوبه شاید برنامه رو دوباره ویرایش کردم و از اینا استفاده کردم!!:تشویق:

این جناب مارشال رو اینطوری نگاهش نکن, ایشون از هر پنجشون یه هنر میریزه, اگر برخوایی یه برنامه اوتماسیون اداری خوب طراحی کنی از .Net Remote باید کمک بگیری (البته یکی از راه هاشه) که یه پایه قضیه همین جناب مارشاله

Legend M.A.R
سه شنبه 28 تیر 1390, 12:21 عصر
من از این اتریبیوت استفاده کردم جواب گرفتم

StructLayoutAttribute Class (http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribu te.aspx)

نکته ظریف و جالبی بود اینکه مشخص کنی ظرفیت یک ساختار چه اندازست, اما یه مشکل داره و اون بر سر string هاست, چطوری می تونی اندازه یک رشته رو مشخص کنی وقتی طول رشته متغییره؟ توی مثالی که زدید همه مقدار ها دارای طول ثابت بودن شما ساختار خودتون رو چطوری طراحی کردید اگر ممکنه یک مثال بزنید
ممنون

saman6384
سه شنبه 28 تیر 1390, 13:03 عصر
من برای تابع sendinput نیاز به درست کردن ساختار داشتم!


[DllImport("user32.dll", SetLastError = true)]
staticexternuint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);


خوب نمیدونم با ورودی های این تابع آشنایی داری یا نه!!
اما من برای مثال واسه کار با موس این ساختار رو درس کردم

[StructLayout(LayoutKind.Sequential)]
structMouseInputData
{
publicint x;
publicint y;
publicuint mouseData;
public MouseEventFlags dwFlags;
publicuint time;
publicIntPtr dwExtraInfo;
}


که میگه به صورت ترتیبی داده هارو پشت سر هم قرار بده هنگام فرستادنشون به لایه مدیریت نشده!!

دقیق منظورتو از طراحی متوجه نشدم! اگه چیز دیگه ای منظورت بوده بگو!!

.................................................. ................................................

البته من با String تو این زمینه تاحالا کار نکردم اما :
در مورد string خوب فکر کنم باید بلاخره یه محدودیتی براش در نظر بگیری!!
واسه در نظر گرفتن محدودیت هم میتونی از اتریبیوت


FieldOffset
استفاده کنی!

من تو این کد زیر ازش استفاده کردم! البته نه با اون هدفی که منظورت بوده! تو این ساختار من چون فقط یکی از متغیرها باید ارسال میشد من اینجوری ازش استفاده کردم :


[StructLayout(LayoutKind.Explicit)]
structMouseKeybdhardwareInputUnion
{
[FieldOffset(0)]
public MouseInputData mi;

[FieldOffset(0)]
public KEYBDINPUT ki;

[FieldOffset(0)]
public HARDWAREINPUT hi;
}

Legend M.A.R
سه شنبه 28 تیر 1390, 14:07 عصر
من برای تابع sendinput نیاز به درست کردن ساختار داشتم!


[DllImport("user32.dll", SetLastError = true)]
staticexternuint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);


خوب نمیدونم با ورودی های این تابع آشنایی داری یا نه!!
اما من برای مثال واسه کار با موس این ساختار رو درس کردم

[StructLayout(LayoutKind.Sequential)]
structMouseInputData
{
publicint x;
publicint y;
publicuint mouseData;
public MouseEventFlags dwFlags;
publicuint time;
publicIntPtr dwExtraInfo;
}


که میگه به صورت ترتیبی داده هارو پشت سر هم قرار بده هنگام فرستادنشون به لایه مدیریت نشده!!

دقیق منظورتو از طراحی متوجه نشدم! اگه چیز دیگه ای منظورت بوده بگو!!

.................................................. ................................................

البته من با String تو این زمینه تاحالا کار نکردم اما :
در مورد string خوب فکر کنم باید بلاخره یه محدودیتی براش در نظر بگیری!!
واسه در نظر گرفتن محدودیت هم میتونی از اتریبیوت


FieldOffset
استفاده کنی!

من تو این کد زیر ازش استفاده کردم! البته نه با اون هدفی که منظورت بوده! تو این ساختار من چون فقط یکی از متغیرها باید ارسال میشد من اینجوری ازش استفاده کردم :


[StructLayout(LayoutKind.Explicit)]
structMouseKeybdhardwareInputUnion
{
[FieldOffset(0)]
public MouseInputData mi;

[FieldOffset(0)]
public KEYBDINPUT ki;

[FieldOffset(0)]
public HARDWAREINPUT hi;
}


خوب عزیزمن نکته تو همینه string محدوده نداره وقتی شما مثلا int رو توی ساختار استفاده می کنید یعنی هشت بایت نه بیشتر نه کمتر ولی وقتی رشته رو استفاده می کنید یعنی چقدر فضا؟؟؟؟
من قبلا با مشکل مشابهی رو به رو شده بودم, قدیما توی c ما از char[] به جای string استفاده می کردیم, اینطوری طول یک ساختار کاملا مشخص بود مثلا 40 بایت که مثلا 10 بایت برای رشته بود و دقیقا هم همین فضا رو می گرفت حالا چه ازش استفاده کنی چه نکنی!!! اما ساختار string نیازمند نوعی ساختار متفاوت است که بهش Pile میگن و خیلی متفاوته وقتی می خواین از یک ساختار استفاده کنید که طول اون مشخصه ساختار فایل Sequential رو استفاده کردید, پس وقتی توی ساختارتون یک string داشته باشید C# اجازه نمی ده با این ساختار مثل یک Sequential یا ساختار ترتیبی رفتار کنید, به عبارتی باید ساختار string رو به یه ساختار Sequential تبدیل کنید یا از همون روشی که گفتم استفاده کنید که در این صورت ساختار فایل شما به Pile تبدیل میشه.

saman6384
سه شنبه 28 تیر 1390, 21:26 عصر
1. من اطلاعی در مورد pile ندارم! اگه بیشتر در موردش توضیح بدی ممنون میشم! یا اینکه بگی چه مبحثی رو سرچ کنم! چون خودم چیز خاصی گیر نیووردم!

2. string هم مگه تو بایتهای پشت سر هم ذخیره نمیشه؟

3. منم برای ارسال دریافت string هم همیشه اونارو به آرایه بایت تبدیل میکنم!

4. منظور من استفاده از فیلد آفست بود!!! به این صورت که یه آفستی براش در نظر بگیریم و حواسمون باشه طول رشتمون بیشتر از اون آفست نشه! (البته در صورتی که استرینگ هم تو بایتهای پشت سرهم ذخیره شه!)

Mr.reCoder
پنج شنبه 30 تیر 1390, 10:37 صبح
مثل اینکه تایپیک خیلی حرفه تر شده!! بریم سر سوال اصلی!!!
ببینید من میخوام کد زیر را به نوع سی شارپ تبدیل کنم.



struct mybuff
{
char mystr[10];
int myint;
}

mybuff mymem;
int tmp;

HANDLE myHandle = CreateFile("c:\in.txt",GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,0,0) ;
ReadFile(myHandle,&mymem,sizeof(mybuff),&tmp,0);




بازم ممنون...

Mr.reCoder
پنج شنبه 30 تیر 1390, 10:46 صبح
من متوجه موضوع نشدم ولی اگه استفاده این تابع در سی شارپ رو نگاه بکنی ممکنه کمکی بهت بکنه
http://msdn.microsoft.com/en-us/library/2d9wy99d%28v=vs.80%29.asp (http://msdn.microsoft.com/en-us/library/2d9wy99d%28v=vs.80%29.aspx)x

این کدی که اونجاست فقط یه آرایه رو پر میکنه. من میخوام struct باشه.

Read(byte[] buffer, int index, int count)