امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
کار با بافر و پارامتر های بی نهایت
نویسنده پیام
arian_vc آفلاین
در حال پیشرفت
***

ارسال‌ها: 328
موضوع‌ها: 40
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 66
( 311 تشکر در 95 ارسال )
ارسال: #1
کار با بافر و پارامتر های بی نهایت
سلام
فرض کنید که میخواهیم روی یه بافر (اشاره گر به یه چیز نا معلوم) عملیات انجام بدیم مثلا کد گذاریش کنیم چه جوری میشه؟؟؟
بعضی از توابع هستن که بی نهایت پارامتر قبول میکنن . چطوری میشه و چطوری تعداد و نوع و ... پارامتر ها رو بدست میارن؟
۱۷-شهریور-۱۳۸۶, ۱۲:۲۶:۴۵
وب سایت ارسال‌ها
پاسخ
Pedram_HookEx آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 459
موضوع‌ها: 23
تاریخ عضویت: خرداد ۱۳۸۴

تشکرها : 1
( 109 تشکر در 65 ارسال )
ارسال: #2
RE: کار با بافر و پارامتر های بی نهایت
از آرایه ها استفاده کن

_______________________________________________________________________________
  • کشف الکتریسیته توسط پارتها برای اولین بار کلیک کنید
  • 135 نکته و آموزش از سطح پایین تا پیشرفته در غالب مثال های کوچک و قابل فهم (حجم 97KB)لینک دانلود
  • 101 آموزش پیشرفته ویژوال بیسیک. حتما دانلود کنید(حجم 314KB)لینک دانلود
  • اینم یه کتابچه ویژوال بیسیک برا اونایی که میخوان برنامه نویسی رو شروع کنن(حجم 916KB)لینک دانلود
  • تمام نکات و ترفند های مهم در ویندوز XP حتما دانلود کنید(حجم 86KB)لینک دانلود[تصویر:  new4.gif]
  • بروزرسانی ویژوال بیسک 6 به آخرین نسخه یعنی سرویس پک 6 (حجم 61MB)لینک دانلود[تصویر:  new4.gif]

۱۸-شهریور-۱۳۸۶, ۰۳:۳۲:۰۹
ارسال‌ها
پاسخ
arian_vc آفلاین
در حال پیشرفت
***

ارسال‌ها: 328
موضوع‌ها: 40
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 66
( 311 تشکر در 95 ارسال )
ارسال: #3
RE: کار با بافر و پارامتر های بی نهایت
میشه بیشتر تو ضیح بدید؟
یعنی چی ؟ بافرو بریزم تو آرایه؟ آخه حجمشو ندارم که حافظه Allocate کنم
۱۸-شهریور-۱۳۸۶, ۱۲:۵۲:۲۸
وب سایت ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #4
RE: کار با بافر و پارامتر های بی نهایت
نقل قول: فرض کنید که میخواهیم روی یه بافر (اشاره گر به یه چیز نا معلوم) عملیات انجام بدیم مثلا کد گذاریش کنیم چه جوری میشه؟؟؟

اگر منظورت اشاره گر از نوع void هست باید بگم که اولش باید یک تبدیل نوع یا همون casting روی اون اشاره گر انجام بدی تا بافرت معنا پیدا کنه بعد میتونی روش عملیات انجام بدی .

نقل قول: بعضی از توابع هستن که بی نهایت پارامتر قبول میکنن . چطوری میشه و چطوری تعداد و نوع و ... پارامتر ها رو بدست میارن؟

این مسئله بستگی به نوع تابع ، نوع پارامتر ورودی و نحوه طراحیش داره . همون طور که باید بدونی پارامتر های یک تابع در زمان صدا زده شدن توی Stack Frame مخصوص اون تابع و در حافظه قرار می گیرند . اینجا دو نکته خیلی مهمه .
1 - ترتیب پارامتر ها توی Stack Frame هست ( مثلا پارامتر ها میتونن از چپ به راست یا از راست به چپ داخل stack frame قرار بگیرن )
2 - توی stack frame باید یک نشانه ای وجود داشته باشه و نمایان گر آخرین پارامتر وارد شده باشه . مثلا یک NULL در انتهای Frame میتونه به ما بگه که به آخرین پارامتر ورودی رسیدیم . ( البته همیشه نمیتونه NULL باشه چون خیلی از توابع میتونن حتی NULL رو به عنوان پارامتر قبول کنند !! ) پس پیچیدگی نحوه تشخیص انتهای لیست پارامتر ها در stack frame هست . به علت این پیچیدگی زبان C++/C راه رو برای برنامه نویسان باز گذاشته که خودشون و با مسئولیت خودشون پارامتر ها رو از Stack Frame استخراج کنند و استفاده کنند . خیلی اوقات باید از Inline Assembly استفاده کنید ( کد اسمبلی درون کد های C )
این راه کاملا پیچیده است و باید طوری توابع رو طراحی کرد این حالت پیش نیاد و گرنه بازیابی اونها در خیلی مواقع خیلی مشکل میشه ( حتی کامپایلر هم هیچ قدرتی در چک کردن مقادیر ورودی و محلشون نداره و همش بر عهده خود برنامه نویسه !)

گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
(آخرین ویرایش در این ارسال: ۱۸-شهریور-۱۳۸۶, ۱۶:۲۰:۴۶، توسط Mamad2003.)
۱۸-شهریور-۱۳۸۶, ۱۶:۱۹:۱۳
ارسال‌ها
پاسخ
arian_vc آفلاین
در حال پیشرفت
***

ارسال‌ها: 328
موضوع‌ها: 40
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 66
( 311 تشکر در 95 ارسال )
ارسال: #5
RE: کار با بافر و پارامتر های بی نهایت
خیلی ممنون ولی در مورد سوال اول
اشاره گر به یه String دارم و میخام اونو Decode کنم میشه؟ آخه حتی اگه Casting هم بکنم وقتی حجمشو ندونم میشه؟
آیا تابعی هست که حجم یه بافرو به من بده؟
تا حافظه Allocate کنم؟
۱۹-شهریور-۱۳۸۶, ۱۰:۵۵:۴۹
وب سایت ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #6
RE: کار با بافر و پارامتر های بی نهایت
خوب شما اونو به *char تبدیل میکنی . این رو هم خوب میدونی که انتهای یه string همیشه یک NULL هست پس خیلی راحت میتونی رشته رو تا انتها بخونی . مشکل دیگه کجاست ؟؟
تابع که نه ولی عملگری که میتونه حجم یک بافر رو به شما بده همون sizeof هست ولی اگر روی یک اشاره گر استفاده بشه حجم اشاره گر رو بهت میده نه بافری که داره بهش اشاره میکنه !

گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
۱۹-شهریور-۱۳۸۶, ۱۷:۳۸:۴۱
ارسال‌ها
پاسخ
arian_vc آفلاین
در حال پیشرفت
***

ارسال‌ها: 328
موضوع‌ها: 40
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 66
( 311 تشکر در 95 ارسال )
ارسال: #7
RE: کار با بافر و پارامتر های بی نهایت
خب آخه وقتی تبدیلش میکنم باید توی یه متغیر بریزمش یانه؟
خوب اون متغیر هم باید سایزش حداقل اندازه بافره +1 باشه
یا هم منظورتون اینه که توی پارامتر های تابع تبدیلش کنم که بازم یه خورده مشکل داره
چون برای کد کردن باید بریزمش توی یه آرایه درسته؟ حجم بافر رو ندارم پس چه جوری بریزمش توی آرایه؟ (یعنی ممکنه بافر بزرگتر از آرایه باشه پس نمیشه تقریبی این کارو کرد باید حجم بافر رو بدست بیارم ، بعد با یه اشاره گر حافظه قرض بگیرم بعد تازه یه آرایه دارم که میتونم کد گزاریش کنم)
البته من یه کد دیدم که نفهمیدم چه جوری کار میکنه! توی سورس ویروس MyDoom اونم دقیقا همین کارو میکرد (رشته ها رو رمزگشایی میکرد اونم با بافر ولی نفهمیدم چه جوری!)
(آخرین ویرایش در این ارسال: ۲۰-شهریور-۱۳۸۶, ۱۴:۰۷:۱۱، توسط arian_vc.)
۱۹-شهریور-۱۳۸۶, ۲۱:۳۳:۵۵
وب سایت ارسال‌ها
پاسخ
arian_vc آفلاین
در حال پیشرفت
***

ارسال‌ها: 328
موضوع‌ها: 40
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 66
( 311 تشکر در 95 ارسال )
ارسال: #8
RE: کار با بافر و پارامتر های بی نهایت
اینجوری میشه؟؟؟؟
کد:
int function(a[])
۱۹-شهریور-۱۳۸۶, ۲۱:۴۱:۲۲
وب سایت ارسال‌ها
پاسخ
arian_vc آفلاین
در حال پیشرفت
***

ارسال‌ها: 328
موضوع‌ها: 40
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 66
( 311 تشکر در 95 ارسال )
ارسال: #9
RE: کار با بافر و پارامتر های بی نهایت
سلام
1-فکر کنم از CAPI استفاده کنم راحتتره!
2-تو C# یه کلمه کلیدی هست فکر کنم params که کار همین پارامتر های بی نهایت میکنه
تو C هم فکر کنم آخرش ... میزارن
یعنی تو C# راحتتر میشه این کارو کرد؟
۲۰-شهریور-۱۳۸۶, ۱۴:۰۲:۰۳
وب سایت ارسال‌ها
پاسخ
Mamad2003 آفلاین
کاربر با تجربه
****

ارسال‌ها: 1,150
موضوع‌ها: 18
تاریخ عضویت: آذر ۱۳۸۲

تشکرها : 9
( 388 تشکر در 232 ارسال )
ارسال: #10
RE: کار با بافر و پارامتر های بی نهایت
نقل قول: خب آخه وقتی تبدیلش میکنم باید توی یه متغیر بریزمش یانه؟
خوب اون متغیر هم باید سایزش حداقل اندازه بافره +1 باشه
یا هم منظورتون اینه که توی پارامتر های تابع تبدیلش کنم که بازم یه خورده مشکل داره
چون برای کد کردن باید بریزمش توی یه آرایه درسته؟ حجم بافر رو ندارم پس چه جوری بریزمش توی آرایه؟ (یعنی ممکنه بافر بزرگتر از آرایه باشه پس نمیشه تقریبی این کارو کرد باید حجم بافر رو بدست بیارم ، بعد با یه اشاره گر حافظه قرض بگیرم بعد تازه یه آرایه دارم که میتونم کد گزاریش کنم)

ببین وقتی بهت گفتم باید به *char تبدیلش کنی واسه همین بود . همون طور که باید بدونی در زمان کامپایل تمام آرایه ها در زبان ++C/C به اشاره گر تبدیل میشن مثلا شما یه آرایه 10 خونه ای رو تعریف کن . کامپایلر بهت ایراد نمیگیره اگه شما توی خونه 15 آرایه هم یه چیزی ذخیره کنی . مثال :
کد:
int a[10];
a[15]=2;

کامپایلر خط دوم رو یه همچین چیزی فرض می کنه :

کد:
*(a+15)=10;

اینطور تصور نکن که خونه های حافظه برای یک آرایه محدود هستند . این وظیفه شماست که حدود آرایه رو حفظ کنی و این وظیفه کامپایلر نیست ( تفاوت آرایه مثلا توی VB با C همینه ) اگر مثل کدی که من بالا نوشتم شما خونه 15 رو تغییر بدی خطایی از کامپایلر دریافت نمی کنی ولی جای دیگه از حافظه رو خراب می کنی که کامپایلر برای کار دیگه ای اختصاص داده پس برنامه شما خطای منطقی پیدا می کنه !

واسه string ها هم همینطور فقط تفاوت اینه که انتهای رشته ها با یک NULL مشخصه همچنین تغییر خونه های حافظه با کمک اشاره گر ها قابل انجام شدنه و حتما نیاز به یک آرایه نیست پس لازم نیست اندازه بافر رو بدونیم . یه مثال واست میزن که روشن بشی . مثلا یک اشاره گر به یک بافر نا معلوم داریم به اسمه buf . ما میدونیم که این بافر نامعلوم یک رشته هست پس آخرش یک NULL هست . فرض کن که میخواییم همه حروف توی این رشته رو به حرف K تبدیل کنیم . کد زیر خیلی راحت اینکار رو انجام میده :


کد:
char* str=(char*)buf;
for(int i=0;str[i]!='\0';i++)
str[i]='K'

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

گويند بهشت و حور و کوثر باشد  ..  جوي می و شير و شهد و شکر باشد
پر کن قدح باده و بر دستم نه      ..   نقدي ز هزار نسيه خوشتر باشد  
(آخرین ویرایش در این ارسال: ۲۰-شهریور-۱۳۸۶, ۱۸:۰۵:۳۱، توسط Mamad2003.)
۲۰-شهریور-۱۳۸۶, ۱۸:۰۴:۱۹
ارسال‌ها
پاسخ
arian_vc آفلاین
در حال پیشرفت
***

ارسال‌ها: 328
موضوع‌ها: 40
تاریخ عضویت: مرداد ۱۳۸۵

تشکرها : 66
( 311 تشکر در 95 ارسال )
ارسال: #11
RE: کار با بافر و پارامتر های بی نهایت
درسته ، من یه مقداری از اینا رو (90%) نمیدونستم!
من چند مدت پیش (2 سال پیش!) یه مقاله راجع به سرریز بافر خوندم فکر کنم منظورتون از خطای منطقی همین سرریز بافر هست Buffer overflow ()
خیلی خیلی ممنون
۲۰-شهریور-۱۳۸۶, ۲۰:۰۴:۲۲
وب سایت ارسال‌ها
پاسخ


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  [سوال] نحوه فراخوانی نرم افزار با پارامتر se8820726 2 2,970 ۱۵-اسفند-۱۳۹۰, ۱۹:۰۳:۲۵
آخرین ارسال: se8820726
  کپی ساختار داخل یه بافر pswin 0 1,581 ۲۸-آذر-۱۳۸۵, ۲۲:۱۲:۵۲
آخرین ارسال: pswin
  انتقال پارامتر تابع و تعیین خروجی تابع و اینکلود کردن Iron_Fist 3 4,269 ۱۴-خرداد-۱۳۸۵, ۱۵:۱۷:۲۵
آخرین ارسال: Iron_Fist

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 3 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS