PDA

View Full Version : سوال در مورد RECORd



حمیدرضاصادقیان
سه شنبه 02 بهمن 1386, 20:18 عصر
سلام دوستان. اگه میشه یک توضیحی درمورد کد زیر بدین .


type
PGenericNode = ^TGenericNode;
TGenericNode = packed record
gnNext : PGenericNode;
gnData : record end;
end;


میخواستم ببینم کار متغیر gndata که در این رکورد تعریف شده چیه.کلش رو متوجه شدم ولی الان نمیدونم gndata چیکار میکنه.اصلا این رکورد کجا کارایی داره؟ آیا رکورد داینامیک تعریف شده؟
اگر اینطوریه پس فیلدهاش چطور مشخص میشن؟
باتشکر

JAFO_IRAN
سه شنبه 02 بهمن 1386, 21:28 عصر
سلام

ساختارهایی هستند که یک header مشخص دارند و بخشی هم برای data دارند که اندازه و ساختار معلوم (یا پیش فرض) نداره - مثل همین مثال شما - این یک linked list یک طرفه است که هیج فرضی در مورد ساختار داده‌ای که متصل میکنه نداره. با این ساختار مثلا هر PGenericNode رو به اندازه دلخواه GetMem کنید و با یک روش مثل Move در gnData داده قرار بدید- ممکنه یک مجموعه روتین برای کار با این linked list درست شده باشند که مستقل از اینکه واقعا شما چه داده‌ای رو دارید مدیریت میکنید قابل استفاده باشند.



var
ANode: PGenericNode;
begin
GetMem(ANode, Sizeof(TGenericNode) + SizeOf(MyData));
Move(MyData, ANode^.gnData, SizeOf(MyData));
:
:
later...
SomeLinkListMngr.GetNode(ANode);
Move(ANode^.gnData, MyData, SizeOf(MyData));


امروزه به جای این روش‌ها از class و inheritance میشه استفاده کرد و کلا کاربرد این جور رکوردها خیلی محدود شده؛ اما هنوز در بسیاری از روتین‌های API میشه این ساختارها رو دید و سرویس‌هایی رو بدون اینکه اندازه دقیق داده‌ها معلوم باشند دریافت کرد...

ارادت

حمیدرضاصادقیان
سه شنبه 02 بهمن 1386, 21:38 عصر
ممنون.حالا این mydata چی هست؟هر چیزی میتونه باشه؟ یعنی اگر بخواهیم در لینک لیست ما چند نوع مختلف داشته باشیم امکانش هست؟درحقیقت میخوام یک کلاس کلی برای مدیریت لینک لیست ها بنویسم و از اون استفاده کنم و هر دفعه با مقادیر مختلفی که خواستم کار کنم نیازی نباشه مجدد از کلاس فوق مشتق بگیرم و در توابع تغییری بدم. مثلا اگر چند داده مختلف داشته باشیم یعنی چند نوع فیلد داشته باشیم باید چطور مقدار دهی کنیم.؟؟

حمیدرضاصادقیان
سه شنبه 02 بهمن 1386, 21:40 عصر
در ضمن اگر امکانش هست در مورد روش استفاده از کلاسها و inheritance نیز توضیح بدین ممنون میشم.

JAFO_IRAN
سه شنبه 02 بهمن 1386, 21:50 عصر
سلام

همانطور که گفتم، الآن دیگه به جای رکوردهای اینچنینی میشه از کلاس‌های عمومی و چند ریختی (poly morphic) استفاده کرد.
کلاس، object و inheritance مفاهیم پایه‌ای object oriented programming هستند. و توضیح دادن آنها در پست‌های اینجوری از من بر نمیاد... ولی بسیار موجودات دوست داشتنی و لذت بخشی هستند.
من در دلفی linked list آماده ندیدم ولی یک یونیت به نام Contnrs داره که تعداد زیادی از این جور ساختارها رو به صورت عمومی و با توجه به همون داستانهای OOP درست کرده - مثل TQueue و TStack و TObjectQueue و TObjectStack و مانند اونها. help خوبی هم در مورد اونها وجود داره - Source هم هست که به نظر من کلاس درس OOP هستش. میشه از اونها ایده گرفت و مثلا linked listهای یک طرفه و دو طرفه رو هم نوشت - البته حتما source آماده برای اونها هم پیدا میشه - ولی نوشتن از اول برای یاد گرفتن خیلی خوبه....

ارادت

vcldeveloper
چهارشنبه 03 بهمن 1386, 00:21 صبح
اینجا هم می تونی یک نمونه دیگه پیدا کنی:
http://www.boyet.com/FixedArticles/EZDSL.html

حمیدرضاصادقیان
چهارشنبه 03 بهمن 1386, 07:34 صبح
ممنون.البته من در نحوه پیاده سازی کلاس و مفاهیم inheritance مشکلی ندارم.ولی میخواستم بدونم چطور میشه این نوع رکورد رو با کلاس پیاده سازی کرد.البته این کدی هم که اینجا نوشتم از کتاب algorithms and data structure دراوردم.اخه اونجا دو روش برای مدیریت لینک لیستها توضیح داده که به صورت داینامیک باید باشند.یعنی طول فیلدهاش ممکنه متغیر باشه..و خودش این کد رو در یک کلاس نوشته و گفته مانند همین کار رو کلاس Tlist داره استفاده میکنه.

JAFO_IRAN
چهارشنبه 03 بهمن 1386, 10:11 صبح
سلام

1. اگر بخواهیم از روشهای OOP برای linked list استفاده کنیم، اگر من باشم از یک TObject (به جای رکورد) استفاده میکیم. مثل TLinkedNode = class(TObject تمام کدهای لازم رو در همون کلاس مینویسم. برای next (و یا prev اگر دو طرفه باشه) هم یک ضرب یک TLinkedNode تعریف میکنم. در ادامه میشه از همین TLinkedNode، یک کلاس derive کرد و مشخصه‌های لازم رو بهش اضافه کرد و به این ترتیب هر داده دلخواهی را link کرد.

2. راه دیگه یک کلاس مثل TObjectLinkedNode است که میتونه کدها رو داشته باشه و در ضمن یک TObject هم داشته باشه که به دلخواه قابل تعیین باشه. برای add کردن node در این راه باید یک object رو هم داشته باشیم که اون object نگهداری میشه - در مقایسه با راه قبلی که خود node همون objectای خواهد بود که قرار است داده‌ها رو حفظ کنه...

3. در دلفی، TList با یک array of pointer (واقعا به صورت یک list خطی) پیاده شده و Linked نیست. از مکانیزم grow استفاده میکنه که اینکار رو هم با Realloc انجام میده - شاید کتاب مورد اشاره شما در مورد یک Library دیگه بوده. اما با توجه به ذکر packed record که مال پاسکال دلفی است احتمالا در مورد دلفی صحبت شده است و نکته‌ای وجود دارد که از نظر من دور مانده...

4. در همون روش recordای ، به همون شکلی که در پست قبلی نوشتم باز میشه کد نوشت - خوبی اون روش میتونه این باشه که اگر زبان برنامه سازی ما OOP نباشه هم باز میشه کد عمومی نوشت. MyData هم "تقریبا" هر چیزی میتونه باشه (البته قاعدتا یک رکورد دیگه خواهد بود)...

ارادت

حمیدرضاصادقیان
چهارشنبه 03 بهمن 1386, 13:16 عصر
ممنون از توضیحات کاملتون.ظاهرا روش اول بهتر از همشون هست ودر زبانهای دیگر به راحتی میشه استفاده کرد.اگر امکانش هست یک مثال کوچک از قسمت اول بزنید ممنون میشم. نحوه نوشتن اطلاعات ، خواندن اطلاعات ، پیمایش نودها، حذف نودها، را چطور باید پیاده سازی کرد؟
آیا برای ایجاد نودهای پی در پی باید از دستور new استفاده کرد؟
هنوز یک مقدار برام گیجه که چطور node ها را ایجاد میکنه و چطور میشه رو دیتا کار کرد؟

JAFO_IRAN
چهارشنبه 03 بهمن 1386, 15:16 عصر
سلام

یک مثال کوچک آماده و ضمیمه کردم. فکر کنم جواب سوالهاتون رو بده. یک کلاس پایه داریم به نام TLinkedNode که میشه ازش دیرایو کرد و مثلا یک TLinkedStrings درست کرد. سعی کردم (تقریبا) تمام چیزهایی که پرسیده بودید هم توش (و هم توی مثال کاربردش) باشه....

ارادت

حمیدرضاصادقیان
پنج شنبه 04 بهمن 1386, 16:18 عصر
با تشکر.خیلی مثال قشنگی بود.فقط چند سوال.
اول اینکه اگه اشتباه نکنم به جای اینکه شما داده ها رو داخل یک رکورد تعریف کنی یک شی تعریف کردی و مقادیر رو داخلش نگه داری میکنی.
حالا اگه بخوام یک کلاس عمومی بنویسم چطوری باید عمل کنم.خوب بعضی مواقع تعداد فیلدها یکی یا دوتا هست بعضی مواقع هم زیاده.اینرو به چه صورت باید پیاده سازی کرد.
باز اگر امکانش هست بیشتر درمورد کد توضیح بدین ممنون میشم.