من هرچی به خودم فشار آوردم نفهمیدم
اگه میشه کلمه به کلمه تو ضیح بدین:
type
TRGB32 = packed record
B, G, R, A: Byte;
end;
TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
PRGB32Array = ^TRGB32Array;
من هرچی به خودم فشار آوردم نفهمیدم
اگه میشه کلمه به کلمه تو ضیح بدین:
type
TRGB32 = packed record
B, G, R, A: Byte;
end;
TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
PRGB32Array = ^TRGB32Array;
type
TRGB32 = packed record // تعریف متغییر برای رکورد
B, G, R, A: Byte;
end;
TRGB32Array = packed array[0..MaxInt div SizeOf(TRGB32)-1] of TRGB32;
// یک نوع جدید که در زیر هم ازش استفاده شده است تعریف میکند که از نوع رکورد پکت و نوع ارایه
//بر اندازه رکورد تعیین شده MaxInt که اندازه این آرایه برابر خارج قسمت
PRGB32Array = ^TRGB32Array;// این هم نتیجه عمل که استفاده شده
packed record
این یعنی چی؟
تا اونجایی که من یادمه packed نوع جدیدی رو تعریف میکرد اما بصورت فشرده
مثل اینجا یک نوع رکورد به اسم TRGB32 اما بصورت فشرده
یعنی چی فشرده؟
با سلام
میشه بفرمایید از این کد برای چه منظوری استفاده میکنید؟
این تاپیک رو نگاه کنی میفهمی که در چه موردی کار برد داره:
http://forum.p30world.com/showthread.php?t=232062
یعنی کامپایلر عناصر رکورد را Align نمیکنه. Align کردن شیوه ایی برای بالا بردن کارایی کد هست. روش کار هم به این شکل هست که در یک CPU 32 بیتی اگر داده ها به صورت بلوک های 32 بیتی ارسال بشند، نیاز به پردازش کمتری دارند. چون CPU در هر سیکل 32 بیت داده دریافت میکنه، اگر طول داده ایی بیش از این مقدار باشه، داده باید در دو بلوک به CPU ارسال بشه. پس در این شرایط، وقتی یک رکورد مثل رکورد زیر بخواد به CPU ارسال بشه:تا اونجایی که من یادمه packed نوع جدیدی رو تعریف میکرد اما بصورت فشرده
TTest Record = record
a : byte;
b : real;
c : integer;
end;
در حالت packed، سه بلوک داده به این شکل ارسال میشه:
1- a و 3 بیت از b
2- چهار بیت از b
3- بیت آخر b و 3 بیت از c
4- یک بیت از c و 3 بیت خالی.
اگر داده ها Align شده باشند، رکو به این شکل ارسال میشه:
1- a و 3 بیت خالی
2- چهار بیت از b
3- دو بیت از b و 2 بیت خالی
4- c.
Align فقط برای رکوردها صورت نمیگیره، بلکه برای متغیرهای عادی برنامه هم توسط کامپایلر صورت میگیره. این کار بطور خودکار توسط کامپایلر انجام میشه، هر چند میشه آن را غیر فعال کرد. جزئییات چگونگی انجام Align توسط کامپایلر مبحث پیچیده ایی هست.
در بعضی مواقع خاص لازم هست که مطمئن بشیم به همراه رکورد ما داده غیر ضروری دیگه ایی ذخیره نمیشه، مثلا زمانی که یک رکورد باید روی شبکه ارسال بشه، یا روی فایل نوشته بشه، در اون صورت، به کامپایلر، با استفاده از packed، گفته میشه که از Align کردن فیلدهای رکورد صرف نظر بکنه.
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.
آرايه هاي فشرده : آرايه فشرده آرايه اي است كه فاصله ميان عناصر آن كم است و درنتيجه ميزان حافظه كمتري براي ذخيره سازي آن مورد نياز است ولي سرعت اجراي برنامه در آرايه هاي فشرده كمتر است .
آرایه فشرده:
استفاده از یک آرایه فشرده شده برای یک رشته به پاسکال این امکان را می دهد که در هر سلول حافظه کامپیوتر بیش از یک کاراکتر ذخیره شود. علاوه بر این استفاده از آرایه های فشرده شده باعث می شود که اعمال روی آرایه های فشرده شده برای پردازش رشته به سادگی انجام شود.
تعریف آرایه های فشرده:
شکل استفاده :
type string type = packed array [1 . . size] of char ;
مثال:
type string10 = packed array [1 . . 10] of char ;
تذکر :
نوع اندیس برای string type باید از1 شروع شود.
تذکر:
هنگام نمایش یک متغیر رشته ای ، می توان از یک قالب مشخص استفاده کرد.
دستورات :
Write ( ‘Hello’ , FirstName :4 ) ;
writeLn ( ‘ ! Good to see you .’ )
Hello A.C. ! Good to see you .
کاراکتر های یک رشته درست مثل هر متغیر از نوع char می توانند مورد استفاده قرار گیرند.
مثال 1 :
در صورتی که FirstName حاوی رشته ‘A.C. Jones’ باشد،
دستورات
FirstName [1] := ‘D’ ;
FirstName [6] := ‘B ;’
محتویاتFirstName را به ‘D.C. Bones’ تغییر می دهند.
تذکر:
یک عنصر رشته ای برای یک پارامتر متغیر از نوع Char نمی تواند ارسال شود. ولی یک کاراکتر مستقیما می تواند به عنوان عنصری ازیک متغیر رشته ای خوانده شود.
دستور :
Read ( FirstName [1] )
اولین کاراکتر موجود در رشته FirstName را با کاراکتر داده خوانده شده جایگزین می کند.
مثال :
برنامه نوشتن نامه فرم :
Const
StringLength = 40
Type
StringType = packed array [1 . . StringLength] of Char ;
Var
BodyFile , { input – body of letter }
Letter : Text ; { output – completed letter file }
begin { FormLetter }
Reset ( BodyFile ) ;
Rewrite ( Letter ) ;
WriteLn (Output , ‘writing job application letter .’ ) ;
Preamble ( Letter ) ;
WriteBody ( BodyFile, Letter ) ;
WriteLn ( Output, ‘Letter copied to output file .’ )
End . { FormLetter }
این تعریف اشتباه هست.استفاده از یک آرایه فشرده شده برای یک رشته به پاسکال این امکان را می دهد که در هر سلول حافظه کامپیوتر بیش از یک کاراکتر ذخیره شود
وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.