ورود

View Full Version : مشکل با procedure



apadana2008
شنبه 12 اردیبهشت 1388, 17:13 عصر
اگه به این برنامه 2+2 را بدیم بجای 4 یک عدد 8 رقمی رو جواب میده چرا؟؟؟؟؟؟؟


procedure sum1(var sum,a,b:integer)
;
begin
if a<b then
sum:=a+b else
sum:=b-a;
end;
procedure TForm1.Button1Click(Sender: TObject);
var sum, a,b:integer;
begin
sum1(a,b,sum);
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);
label1.Caption:=IntToStr(sum) ;

shervin farzin
شنبه 12 اردیبهشت 1388, 19:45 عصر
سلام
كد شما 2 تا مشكل داره .
اول اين كه در رويداد ButtonClick ، تابع SUM1 رو بايد بعد از مقدار دهي به a و b فراخواني كنيد
چون قبل از اون حاصل a + b رو نخواهيد داشت .
مشكل دوم از اينجاست كه وقتي شما تابع SUM1 رو فراخواني كرديد ترتيب ورود پارامترها رو
طبق اونچه كه در اعلان تابع نوشتيد رعايت نكرديد ، يعني بايد اول پارامتر a رو پاس بديد نه sum .
پس اصلاح شده كد شما ميشه اين :

procedure sum1(var sum,a,b:integer);
begin
if a < b then sum:=a+b else sum:=b-a;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
sum,a,b:integer;
begin
a:=StrToInt(Edit1.Text);
b:=StrToInt(Edit2.Text);
sum1(sum,a,b);
label1.Caption:=IntToStr(sum) ;
end;

يك پيشنهاد هم براتون دارم . از اونجا كه مقدار پارامتر sum تا قبل از خروج از تابع sum1 براتون
مهم نيست ( چون هنوز عمل جمع اتفاق نيفتاده ) ، پيشنهاد ميكنم اعلان پارامتر sum در تابع
رو با پيشوند OUT مشخص كنيد . در اين صورت تابع Sum1 به شكل زير ميشه :

procedure sum1(out sum:integer;var a,b:integer);
begin
if a < b then sum:=a+b else sum:=b-a;
end;

يك نكته انحرافي ديگه : ورودي 2 و 2 در اين تابع نبايد بشه 4 ، بايد بشه 0 .
موفق باشيد .

as13851365
یک شنبه 13 اردیبهشت 1388, 10:57 صبح
اگه از Function استفاده می کردند فکر کنم بهتر به نتیجه می رسیدن در هر صورت هر کس نظر خودش رو داره
function sum1(a,b:integer):integer;
begin
if a < b then result:=a+b else result:=b-a;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption:=IntToStr(sum1(StrToInt(Edit1.Text) ,StrToInt(Edit2.Text))) ;
end;


راستی جناب shervin farzin می شه کمی درباره OUT توضیح بدید ( تا حالا در این باره چیزی نخونم )


يك پيشنهاد هم براتون دارم . از اونجا كه مقدار پارامتر sum تا قبل از خروج از تابع sum1 براتون
مهم نيست ( چون هنوز عمل جمع اتفاق نيفتاده ) ، پيشنهاد ميكنم اعلان پارامتر sum در تابع
رو با پيشوند OUT مشخص كنيد . در اين صورت تابع Sum1 به شكل زير ميشه :

shervin farzin
یک شنبه 13 اردیبهشت 1388, 13:03 عصر
سلام
پيشند OUT قبل از نام پارامتر ( مثل VAR ) همون حالت پارامتر دهي به اشاره رو ايجاد ميكنه با
اين تفاوت كه متغييري كه با اين پيشند مشخص شده ، مقدارش در لحظه ورود به روال مهم نيست
و در داخل روال مقدار جديد بهش نسبت داده ميشه بر خلاف VAR كه مقدارش از ابتداي اجراء روال
مهم و معلومه . براي همين عرض كردم چون مقدار پارامتر sum تا قبل از خروج از تابع sum1 برامون
مهم نيست ، بهتره كه از پيشوند OUT استفاده بشه .
اميدوارم واضح گفته باشم .
موفق باشيد .