ورود

View Full Version : یک سوال در پاسکال!!!



zahra_67
چهارشنبه 02 مرداد 1387, 20:22 عصر
سلام میدونم بی ربطه ولی خواهشا کمکم کنید چون امتحان دارم!!!! :ناراحت:
میخوام بدونم در پاسکال طول این رکوردو چطوری حساب میکنن:

type
stu=record
n:string[15];
stn:word;
case d:byte of
1 : ( a,b,c:integer);
2 : (e:real;f:byte);
end;

ممنون:خجالت:

vcldeveloper
پنج شنبه 03 مرداد 1387, 01:33 صبح
با استفاده از تابع SizeOf:


var
MyRec : Stu;
begin
Writeln('Size = ', SizeOf(MyRec));
readln;
end;

zahra_67
پنج شنبه 03 مرداد 1387, 20:26 عصر
مرسی از جوابتون ولی من منظورم به صورت تئوری بود نه توی خود محیط پاسکال یعنی همینطوری تو امتحان چطوری اندازه اینو باید حساب کرد ؟من اون قسمت case d of رو نمیفهمم!

vcldeveloper
جمعه 04 مرداد 1387, 01:29 صبح
من اون قسمت case d of رو نمیفهمم!
به اون بخش هایی که در تعریف یک رکورد case..of دارند، میگن Variant Parts یا بخش های متغیر. این بخش ها فضای مشترکی از حافظه را استفاده می کنند، یعنی در مثال شما، متغیر های a,b,c و متغیرهای e,f هر دو از خانه های حافظه مشترکی استفاده می کنند. پس باید فقط از یکی از این گروه هر بار استفاده کنید، وگرنه داده های شما روی هم نوشته میشند و داده های قبلی پاک میشند، مثلا اگر به a,b,c مقدار بدید، بعد برید به e,f مقدار بدید، مقادیر جدید e,f روی a,b,c نوشته میشند.
کامپایلر برای این نوع از رکوردها، سایز را بر اساس سایز بزرگترین گروه در نظر میگیره. در مثال شما، گروه e,f سایز بزرگتری از گروه a,b,c داره، پس از آن برای محاسبه سایز استفاده میشه.
با توجه به توضیحات بالا، نحوه محاسبه سایز به این شکل میشه:
n = 15+1, stn = 2, d = 1, e = 6, f= 1
Size = 26
دقت کنید که این سایز در پاسکال بدست میاد، وگرنه در دلفی - که در محیط 32 بیتی ویندوز اجرا میشه - نوع داده های Integer و Word هر کدام 4 بایت اشغال می کنند.
در ضمن، n هم 15 + 1 شد، چون: 15 کارکتر هر کدام یک بایت اشغال می کنند، و یک بایت هم برای نگه داری سایز رشته استفاده میشه. باز هم در دلفی این روال تغییر کرده و یک رشته string در دلفی 4 بایت برای سایز خودش استفاده میکنه و علاوه بر آن از چند بایت دیگه برای reference-counting و اشاره گر به رشته استفاده میکنه. مثلا همین رکورد در دلفی 40 بایت اشغال میکنه.