PDA

View Full Version : مقدار بولی بازگشتی از تابع؟



mbshareat
جمعه 03 مهر 1388, 00:17 صبح
من در برنامه از تابعی استفاده کرده ام که مقدار بولی بر می گرداند.در بدنه تابع اگر شرطی برقرار باشد مقدار بازگشتی برابر True خواهد بود.(در هیچ جای تابع مقدار false تعریف نشده است):بامزه:
حال در برنامه اگر برای یک تست شرط را نام تابع بگذارم مثلا {IF Test} دستور زیر شرط اجرا خواهد شد حتی اگر در تابع مقدار بازگشتی به True تغییر نیافته باشد ولی اگر شرط را به صورت {If Test=True} بنویسم مشکلی پیش نمی آید.:گیج:
آیا مشکل از نسخه دلفی من است(6) یا مقدار بازگشتی هیچگاه مقداردهی اولیه نمی شود و مقدار تصادفی می گیرد؟:لبخند:

vcldeveloper
جمعه 03 مهر 1388, 00:49 صبح
خب اون شرطی که شما میزارید، عملا باعث فراخوانی مجدد تابع Test توسط خودش میشه، یعنی تابع بصورت بازگشتی خودش خودش را فراخوانی میکنه، و اگر در سورس تابع کدی نباشه که به این فراخوانی های تو در تو پایان بده، نهایتا Stack Overflow می گیرید.

اگر نمی خواید فراخوانی بازگشتی داشته باشید، باید بجای نام تابع، از Result استفاده کنید: if Result then
مقدار برگشتی یک تابع Boolean بطور پیش فرض True هست. البته مقدار برگشتی یک متغیر Boolean بطور پیش فرض False هست.

mbshareat
جمعه 03 مهر 1388, 01:12 صبح
البته منظورم چیزی مانند این تابع بود:

Function IsInRange(N:Byte):Boolean;
Begin
If (N>13) And (N<45) then
Result:=True;
End;
procedure TForm1.Button1Click(Sender: TObject);
Var
N:Byte;
begin
N:=4;
{دستور زير پيغام خطاي غير قابل بررسي ايجاد مي کند}
//ShowMessage(BoolToStr(IsInRange(N)));
If IsInRange(N) then
ShowMessage('Yes');
end;
به نظر می رسد که مقدار بازگشتی تابع از نوع بولی به طور پیشفرض واقعا True نباشد!:گیج:

merced
جمعه 03 مهر 1388, 05:15 صبح
به نظر می رسد که مقدار بازگشتی تابع از نوع بولی به طور پیشفرض واقعا True نباشد!:گیج:

دقيقاً. هر متغيير نوع منطقي داراي مقدار اوليه False است

mbshareat
جمعه 03 مهر 1388, 07:27 صبح
آقای merced (http://barnamenevis.org/forum/member.php?u=5388) عزیز!:قلب:

لطفا زود جواب ندین.منظورم از اینکه واقعا Trueنیست این نبود که False باشه.:چشمک:
اگه ShowMessage رو از حالت توضیح در بیارین(بدون بک اسلش) بعد برناممو اجرا کنین می فهمین که مقدار بازگشتی نه True هستش نه False!:گیج:

Felony
جمعه 03 مهر 1388, 08:32 صبح
تابعی که نوشتید ناقص هستش ، تابع رو اینطور تغییر بدید تا تمامی مشکلات حل بشه .


Function IsInRange(N:Byte):Boolean;
Begin
If (N>13) And (N<45) then
Result:=True
else
Result:=False;
End;

علتش رو هم تو پست 2 آقای کشاورز توضیح داده .

vcldeveloper
جمعه 03 مهر 1388, 10:18 صبح
دقيقاً. هر متغيير نوع منطقي داراي مقدار اوليه False است
متغیرهای Global و فیلدهای Boolean کلاس ها بطور پیش فرض False هستند. مقدار برگشتی توابع نه. متغیرهای Local هم مقدار دهی اولیه نمیشند.


البته منظورم چیزی مانند این تابع بود
اینجور توابع را اینطوری بنویسید:

Result := (N>13) And (N<45);