PDA

View Full Version : آموزش: نحوه استفاده اشاره گر در vb



returnx
پنج شنبه 22 مهر 1389, 20:54 عصر
خیلی ها فکر می کنند که اشاره گر در vb وجود نداره اما این کار به عهده چند تابع Api هست
لینک آموزش استفاده از اشاره گر ها :http://www.codeproject.com/KB/vbscript/how_to_do_pointers_in_visual_basic.aspx?df=100&forumid=1232&exp=0&fr=26&select=5094
سورس رو هم میتونید دانلود کنید.

ali190
جمعه 23 مهر 1389, 11:00 صبح
سلام
تشکر میکنم از دوست خوبم ms2222 که این بحث رو مطرح کردند
بشخصه اطلاعات بسیار کمی در مورد اشاره گرها و کاربردشون در vb دارم
از اسایتد خواهشمندم نظرات و آموزشهای راهگشای خودشون رو در این زمینه مطرح کنند
ممنون و مشتکر
یاعلی

returnx
جمعه 23 مهر 1389, 11:34 صبح
شما همین کد که به زبا C هست رو یک بار دیگه در نظر بگیرید و این عکس هم که ضمیمه شده رو مشاهده کنید شاید بهتر بتونید مطلب رو درک کنید:

int *p,m,s
m=5
p=&m
s=*p

و حالا اون عکس.
باز هم میگم بحث اشاره گرها چیزی نیست که عرض 5 دقیقه بشه یاد گرفت باید خیلی تمرین کنید حتی اگر هم به بحث اشاره گر ها تسلط هم داشته باشید وقتی حرف از لیست پیوندی و
امثال این ساختمان داده ها میاد باز آدم گیج میشه...
اگه عکس نامفهوم هست عذر خواهی میکنم چون اصلا نقاشیم خوب نیست:خجالت:
شما به زبان C آشنایی دارید؟

ali190
جمعه 23 مهر 1389, 12:17 عصر
سلام
چرا ما بجای استفاده از اشاره گر چندین و چند متغیر تعریف نمیکنیم؟

returnx
جمعه 23 مهر 1389, 17:23 عصر
سلام
چرا ما بجای استفاده از اشاره گر چندین و چند متغیر تعریف نمیکنیم؟
قابل به ذکر است که خود اشاره گر ها هم یک نوع متغیرند.
فایده اصلی اشاره گرها اینه که شما میتونید به کمک اون یک متغیر داینامیک داشته باشید یعنی یک مقدار از حافظه را بگیرید و بعد آدرسش در یک اشارگر ذخیره کنید و زمانی که کار با این متغیر تمام شد اون مقدار رو دوبار ه آزاد کنید(به سیستم عامل پس بدید)
اما در متغیر های استاتیک(معمولی) این امکان وجود ندارد.

ali190
جمعه 23 مهر 1389, 17:33 عصر
سلام
اگر براتون مقدوره یک مثال محسوس بزنید
که تفاوت متغیر رو با اشاره گر نشون بده
یک مثال که قابل فهم باشه
ممنون

returnx
جمعه 23 مهر 1389, 17:56 عصر
بهترین مثالی که یادم میاد همان لیست پیوندی است:
همان طور که میدونید (شاید هم ندونید) در C دستوری به عنوان Redim وجود ندارد و برای همین محدودیت های زیادی برای اعمال ارایه هست یعنی نمیشه طول آرایه رو تغییر داد برای همین برنامه نویس مجبور از لیست های پیوندی استفاده کنه که در لیست پیوندی از آرایه استفاده نمیشه بجاش از ساختمان یا
(structure) استفاده میشه که معادلش در vb همون Type هست.
یعنی برای تعریف یک ساختمان در C از این کد استفاده میشه:

struct student
{
char name[10];
int id;
}

و در vb

Type student
name As String
id As Integer
End Type

تا اینجا رو داشته باش تا چند دقیقه دیگه ادامه رو برات میزارم...

returnx
جمعه 23 مهر 1389, 18:41 عصر
خوب بحث ادامه میدیم...
از دوستانی هم که اطلا عاتی دارند تقاضا میکنم به ما کمک کنند که این تاپیک یک تاپیک آموزشی خوب بشه...
همونطور که گفتم آریه در زبان های سطح پایین تر محدودیت داره اما ایجاد ساختمان خیر .
در لیست هر ساختمان به ساختمان بعدی اشاره میکنه برات عکسش ضمیمه کردم ..
اینم نحوه تعریف ساختمان برای لیست پیوندی در C

struct linklist
{
int data;
struct linklist *link
}

حالا شاید اهمیت اشاره گر ها رو با کد بالا درک کنید و اما توضیح کد بالا:
در ساختمان linklist دو متغیر وجود دارد ابتدا data که همونطور که مشخصه یک داده از نوع عدد رو میگیره و متغیر دوم که یک اشاره گر به نام link از نوع ساختمان linklist است اما این یعنی چی ؟
یعنی link به ادرس ساختمان بعدی اشاره می کنه.(عکس رو نگاه کنید)
با این روش میشه n تا ساختمان به نام linklist داشت و دیگه اون محدودیت آرایه رو نداره.
فکر کنم حالا کار اشاره گر رو متوجه شدید ؟
در زبان های سطح بالا برنامه نویس دیگه از اشاره گر استفاده نمیکنه چون کامپایلر این وظیفه رو به عهده داره و برای همین به راحتی میشه طول آرایه رو تغییر داد.

ali190
جمعه 23 مهر 1389, 19:03 عصر
سلام
یا مطالب خیلی سنگینه یا من سوادم خیلی پایینه
بدون رودربایستی بگم تقریباً هیچ چیز دستگیرم نشد
البته از جناب ms2222 کمال تشکر رو درام
یاعلی

ali.rezaei7
جمعه 23 مهر 1389, 19:11 عصر
سلام
این یه بحث مفهومی می باشه حتما باید با زبان هایی مثل سی یا سی پلاس پلاس کار کنید تا بتونید این بحث رو بهتر درک کنید.

returnx
جمعه 23 مهر 1389, 19:37 عصر
سلام
یا مطالب خیلی سنگینه یا من سوادم خیلی پایینه
بدون رودربایستی بگم تقریباً هیچ چیز دستگیرم نشد
البته از جناب ms2222 کمال تشکر رو درام
یاعلی
بحث خیلی سنگینه.(البته شایدم من بد توضیح دادم)
گفتم تا شما با زبان های سطح پایین کار نکنید درک اشاره گر یکم سخته...
بازم از دوستانی که اطلاعاتی دارند خواهش میکنم که کمکمون کنند تا مسئله از گنگ بودن در بیاد.
البته پیشنهاد میکنم برای درک بهتر اشاره گر ها این صفحه هم مطالعه شود:http://en.wikipedia.org/wiki/Pointer_(computing)

vbhamed
جمعه 23 مهر 1389, 21:54 عصر
سلام

يك مثال خيلي ساده

تا حالا كتابخونه كه رفتين

يك سري كشو داره كه توش كارتهايي هست كه مشخصات كلي كتابها در اونها يادداشت شده

اون كارت ها مشابه اشاره گر هستند كه خودشان حاوي اطلاعات نيستند و تنها چيزي كه دارند، آدرس كتاب اصلي است اما به كتاب اصلي رفرنس مي دهند، حالا اگر فرض كنيم روي اونها با مداد نوشته شده باشه، ميشه با پاك كردن و نوشتن مشخصات و آدرس كتابي ديگر، به آن كتاب جديد رفرنس داد

در اصل اشاره گر يعني آدرس يك سري اطلاعات اصلي

ali190
جمعه 23 مهر 1389, 22:17 عصر
سلام
حالا مثال شما رد vb تعمیم بدهیم
در vb کارت کدومه ، کتاب کدوم
اگر امکانش هست برای درک بهتر این مطلب یک مثال (پروژه نمونه) خیلی ساده مثال بزنید
ببینم ماتریسها در این مبحث میگنجند؟
یاعلی

returnx
جمعه 23 مهر 1389, 22:23 عصر
سلام
حالا مثال شما رد vb تعمیم بدهیم
در vb کارت کدومه ، کتاب کدوم
اگر امکانش هست برای درک بهتر این مطلب یک مثال (پروژه نمونه) خیلی ساده مثال بزنید
ببینم ماتریسها در این مبحث میگنجند؟
یاعلی
با اجازه اقای VBhamed اگه مثال جالبشون رو خراب نکنم ، باید بگم که متغیر ها(آزایه ها یا هر ساختمانی که بهش اشاره میشه) میشه کتاب های ما و اشاره گر ها هم حکم همون کارت های کتابخانه رو داره.

ali190
جمعه 23 مهر 1389, 22:28 عصر
خوب این اشاره گرها چه کاربردی دارند؟
در کجا استفاده میشوند؟
یک سئوال : منظورتون از ادرس ، آدرس ذخیره سازی متغیرها در حافظه سیستم است؟

returnx
جمعه 23 مهر 1389, 22:47 عصر
خوب این اشاره گرها چه کاربردی دارند؟
در کجا استفاده میشوند؟

والا چی بگم یعنی شما از پست های قبل من هیچی متوجه نشدین؟(یعنی انقدر بد توضیح دادم!!)

یک سئوال : منظورتون از ادرس ، آدرس ذخیره سازی متغیرها در حافظه سیستم است؟
بله، دقیقا منظور از آدرس همان آدرس خانه های Ram (حافظه اصلی) است.

ali190
جمعه 23 مهر 1389, 22:51 عصر
ببینید زمانیکه که من 10 متغیر رو در برمامه ام تعریف میکنم ، 10 مقدار در فضای رم ذخیره میشه
هر وقت هم که بخوام اونارو فراخوانی میکنم
در این بین آدرس به چه کاری میاد؟
کاربد آدرس اون متغیر در رم کجا ها استفاده میشه؟(من این رو متوجه نمیشم)

returnx
جمعه 23 مهر 1389, 23:00 عصر
شما یک لحظه متغیر ها رو بزار کنار و به سوال من پاسخ بده...(جواب پست قبلی تون رو بعدا میگم)
فرض کن شما میخواهی n تا رکورد از اطلاعات چند دانشجو رو بگیری و بدون اینکه در فایلی ذخیره کنی در Ram نگه دارید حالا از چه روشی استفاده میکنید؟(فرض کنید vb6 چیزی به نام Redim نداره)

ali190
شنبه 24 مهر 1389, 07:46 صبح
سلام


شما یک لحظه متغیر ها رو بزار کنار و به سوال من پاسخ بده...(جواب پست قبلی تون رو بعدا میگم)
فرض کن شما میخواهی n تا رکورد از اطلاعات چند دانشجو رو بگیری و بدون اینکه در فایلی ذخیره کنی در Ram نگه دارید حالا از چه روشی استفاده میکنید؟(فرض کنید vb6 چیزی به نام Redim نداره)
عجب مثال زیبا و ملموسی زدید
تقرباً یه چیزایی دستگیرم شد
خوب امکانش هست همین مسئله رو در vb6 با اشاره گر ها مدل کنیم؟
یعنی یه برنامه ساده شامل چندین فیلد از اطلاعات دانشجویان و و ذخیره سازی اطلاعات آنها درram با استفاده از اشاره گرها
براساس دریافت هایی که از توضیحات شما دوستان داشتم یک تعریف از اشاره گرها میکنم ، بفرمائید صحیح است یا غلط:


http://barnamenevis.org/forum/attachment.php?attachmentid=58449&stc=1&d=1287204263
به عبارتی با استفاده از اشاره گرها در vb ما از رکوردهامون یک ماتریس در حافظه ram میسازیم
یک ماتریس که ستون هاش همون متغیرهامون هستند و سطرهاش هم محل ذخیره سازی رکوردها در حافظه

فقط یک سئوال چطور با شاره گرها این اطلاعات رو از حافظه رم بیرون بکشیم؟
معیارها (شروط) برای بیرون کشیدن و فرا خوانی این اطلاعات از رم بر چه اساسی است (مثلاً شماره رکورد؟!)
ممنون و متشکر از تمامی عزیزانی که بحث رو تا اینجا پیگیری کردند
یاعلی

returnx
شنبه 24 مهر 1389, 21:04 عصر
تقرباً یه چیزایی دستگیرم شد
بله تقریبا دارید مفهوم اشاره گر ها رو درک میکنید.:تشویق:

براساس دریافت هایی که از توضیحات شما دوستان داشتم یک تعریف از اشاره گرها میکنم ، بفرمائید صحیح است یا غلط:
این روشی که شما گفتید درست است اما پیاده سازی فوق العاده سختی داره(توسط متغیر) ، این روش خیلی شبیه به فایل شاخص هست(فعلا اصلا به این بحث کاری نداریم)
حالا شما همین روش رو با استفاده از ساختمان تصور کنید .(به عکس نگاه کنید, البته شاید عکس از لحاظ علمی مشکل داشته باشه اما برای درک مطلب بد نیست)
سعی میکنم اگه شد یک لیست پیوندی توسط vb6 پیاده سازی کنم و سورسش بزارم.

ali190
شنبه 24 مهر 1389, 21:16 عصر
سلام
یه سئوال
شما زمانیکه در ویندوز از روی یک فایل کپی میگیرید ، فقط میتونید از همون فایل کپی بگیرید
به عبارت دیگر در ویندوز ما در حالت معمولی فقط یک فایل رو میتونیم در حافظه سیستم ذهیره و بار گذاری کنیم
آیا با اشاره گر ها میشه چندین بار فایلها رو ذخیره کرد و در حافظه نگه داشت و سپس فایل دلخواه رو در محل مورد نظر past نمود؟
اگر امکانش هست مثالهاتون یک مقدار ملموس و قابل فهم باشه
مثلاً همون مثال اطلاعات دانشجو خیلی خوبه
یاعلی

returnx
شنبه 24 مهر 1389, 22:08 عصر
ابتدا برای اینکه محدودیت برای گرفتن اطلاعات در مسئله دانشجویان رو درک کنید بهتون پیشنهاد می کنم سورس که ضمیمه کردم رو دانلود کنید.

آیا با اشاره گر ها میشه چندین بار فایلها رو ذخیره کرد و در حافظه نگه داشت و سپس فایل دلخواه رو در محل مورد نظر past نمود؟
اگر طول فایل رو بدونیم شاید بشه (قطعا پیاده سازی خیلی سخته) در ضمن ویندوز برای انتقال فایل یا هر چیز دیگه(رشته و عدد و...) از حافظه ای به نام Clipboard استفاده میکنه که با vb هم به این حافظه میشه دستیابی داشت.

vbhamed
چهارشنبه 28 مهر 1389, 10:01 صبح
سلام

بزاريد يك مثال از كاربرد اشاره گر ها بزنم
فرض كنيد شما 1000 ركورد اطلاعات داريد كه هر ركورد با توجه به فيلدها، خودش 500 بايت ميشه يعني مجموعا 500000 بايت
حالا قراره اين اطلاعات مثلا به ترتيب نام مرتب بشن

در حالت عادي با استفاده از الگوريتمهاي مرتب سازي شما بايد ركوردها رو مرتب كنيد به اين صورت كه اگر قراره جاي دو ركورد عوض بشه كل محتويات هر ركورد يعني 500 بايت جابجا ميشه كه در بدترين حالت با استفاده از روش مرتب سازي حبابي 500*1000 مرتبه جابجايي داريم كه مجموعا ميشه 500*500*1000 بايت جابجايي اطلاعات يعني 250 مگابايت

حالا اگر به جاي جابجايي كل اطلاعات اشاره گري به ركوردها داشته باشيم تنها كافيه يك اشاره گر 4 بايتي جابجا بشه يعني باز هم در بدترين حالت 4 مگابايت بايت به جاي 250 مگابايت يعني 60 برابر سريعتر

حالا فرض كنيد ركورد شما شامل يك فيلد تصويري به سايز فقط 50 كيلوبايت هم باشه
ميزان جابجايي شما در اين حالت 25 گيگابايت داده هست در صورتيكه در حالت اشاره گري ديگه سايز ركورد مهم نيست و اگر تصوير شما به جاي 50 كيلوبايت، 500 كيلوبايت هم باشه باز هم همون 4 مگابايت داده در بدترين حالت جابجا ميشه

و اگر فرض كنيم جابجايي هر بايت داده يك ميليونيم ثانيه زمان ببره در حالت اشاره گري 4 ثانيه و در حالت معمولي 25000 ثانيه يا تقريبا 7 ساعت زمان لازم است

ali190
چهارشنبه 28 مهر 1389, 17:02 عصر
باسلام
با تشکر از vbhamed عزیز بابت مثالشون
خواهشاً در مورد اشاره گرها مثالی مفهوم و ملموس در vb بزنید
یک نمونه پروژه
فقط خواهشاً از این پروژه ها نباشه که از سایتهای خارجی دانلود میشه
یک مثال ساده که بشه در مرودش بحث کرد
خیلی خیلی ممنون و متشکر
یاعلی