User Tools

Site Tools


tutorial:procedureandfunction

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
tutorial:procedureandfunction [2018/07/31 06:15]
admin
tutorial:procedureandfunction [2019/01/06 16:53]
admin
Line 1: Line 1:
-=====Procedure and Function=====+======Procedure and Function======
  
-====Procedure/​Function คืออะไร====+=====Procedure/​Function คืออะไร=====
 ทั้งคู่ทำหน้าที่เป็นโปรแกรมย่อยเหมือนกัน แต่มีความแตกต่างกันอยู่ดังนี้ ทั้งคู่ทำหน้าที่เป็นโปรแกรมย่อยเหมือนกัน แต่มีความแตกต่างกันอยู่ดังนี้
   * Function จะส่งค่ากลับ   * Function จะส่งค่ากลับ
   * Procedure ไม่ส่งค่าใดๆกลับ   * Procedure ไม่ส่งค่าใดๆกลับ
- +\\  
-====รูปแบบของ Procedure====+=====รูปแบบของ Procedure=====
 Procedure โดยปกติจะมีอยู่ 2 แบบ คือ แบบรับค่า input กับแบบไม่รับค่า input\\ Procedure โดยปกติจะมีอยู่ 2 แบบ คือ แบบรับค่า input กับแบบไม่รับค่า input\\
  
Line 40: Line 40:
 end; end;
 </​sxh> ​     </​sxh> ​    
-</​hidden>​\\+</​hidden>​ 
 +\\ \\
  
-====รูปแบบของ Function====+=====รูปแบบของ Function=====
 รูปแบบของ function นั้น จะคล้ายกับ procedure ทุกประการ คือมีทั้งแบบรับค่า input กับแบบไม่รับค่า input\\ ​ รูปแบบของ function นั้น จะคล้ายกับ procedure ทุกประการ คือมีทั้งแบบรับค่า input กับแบบไม่รับค่า input\\ ​
 แต่โดยทั่วไปแล้ว function มักจะถูกใช้งานโดยการรับค่า input (เพราะถ้าไม่มีการรับค่า ก็ไม่ต่างจากการใช้ค่าคงที่)\\ แต่โดยทั่วไปแล้ว function มักจะถูกใช้งานโดยการรับค่า input (เพราะถ้าไม่มีการรับค่า ก็ไม่ต่างจากการใช้ค่าคงที่)\\
Line 70: Line 71:
 </​sxh> ​     </​sxh> ​    
 </​hidden>​ </​hidden>​
- 
 <hidden Example-4: Function แบบใช้ตัวแปรที่เป็นชื่อของฟังก์ชั่นเอง เป็น Output> <hidden Example-4: Function แบบใช้ตัวแปรที่เป็นชื่อของฟังก์ชั่นเอง เป็น Output>
 <sxh delphi;> <sxh delphi;>
Line 78: Line 78:
 end; end;
 </​sxh> ​     </​sxh> ​    
-</​hidden>​\\+</​hidden>​
  
-====การประกาศ Procedure/​Function==== +\\  
-Procedure/​Function จะต้องถูกประกาหลังจากการประกาศตัวแปร ​VAR เท่านั้น โดยจะวางอันไหนมาก่อนกได้+จากประสบการณ์ของผม ขอแนะนำให้ใช้ result แทนชื่อของ Function ครับ เพราะจะง่ายในการแก้ใขชื่อ Function ในภายหลัง 
 +\\ \\ 
 + 
 +=====การประกาศและการเรียกใช้ ​Procedure/​Function===== 
 +หลังจากการประกาศ uses แล้ว ​Procedure/​Function ​ที่เป็น Global Scope สามารถประกาศไว้ ณ ส่วนไหนของโปรแกรมก็ได้ แต่โดยปกติแล้ว ผมขอแนะนำให้ประกาศทีหลังสุด (หลังากปรกาศ var) แ่ถาหากเป็น Function/​Procedure ที่มาจาก Shared Library ผมขแนะนำให้วาไว้แรกสุด (ต่อจากการประกาศ uses) \\ 
 + 
 +การเรียกใช้ Procedure นั้นง่ายมาก เพียงแค่ใส่ชื่อ Procedure นั้นๆ (พร้อมกับ Input Parameters ​้ามี) ได้เลย ยกตัวอย่างเช่น 
 + 
 +<hidden Example-5: Calling Procedures>​ 
 +<sxh delphi>​ 
 +Program SayHellow;​ 
 + 
 +procedure HelloWorld;​ 
 +begin 
 +  writeln('​HelloWorld'​);​ 
 +end; 
 + 
 +procedure SayHello(sName:​string);​ 
 +begin 
 +  writeln('​Hello'​+ sName); 
 +end; 
 + 
 +Begin 
 +  HelloWorld; //Calling HelloWorld 
 +  SayHello('​Mr. Smith'​);​ //Calling Procedure 
 +End. 
 +</​sxh>​ 
 +</​hidden>​ 
 +\\ 
 + 
 +สำหรับการเรียกใช้ Function นั้นก็คล้ายกับการเรียกใช้ Procedure แต่มีข้อแตกต่างอีกอย่างหนึ่ง คือ Function ให้ค่า Output ด้วย  
 +\\ \\ 
 + 
 +=====Nested Function/​Procedure===== 
 +คือ Function/​Procedure ที่เป็น Local Scope ซ้อนอย่ใน Function/​Procedure อื่น\\ 
 +<hidden Example-6: Nested Function>​ 
 +<sxh delphi;​highlight:​ [4-10]>​ 
 +procedure SolvePolynomial(A,​B,​C:​real);​ 
 +//This function used for solving polynomial Ax^2+Bx+C = 0 
 +var Ans1,​Ans2:​real;​ 
 +  function IsReal(A,​B,​C:​real):​Boolean;​ //Nested Function 
 +  begin 
 +    if (B*B-4*A*C)>​= 0 then 
 +       ​result:​=true 
 +     ​else 
 +       ​result:​=false;​ 
 +  end; 
 +begin 
 +  if IsReal(A,​B,​C) then 
 +    begin 
 +      Ans1:​=(-B+power(B*B-4*A*C,​0.5))/​(2*A);​  
 +      Ans2:​=(-B-power(B*B-4*A*C,​0.5))/​(2*A);​ 
 +      writeln('​x1 = ', Ans1); 
 +      writeln('​x2 = ', Ans2); 
 +    end 
 +  else 
 +     ​writeln('​x1 = '+ FloatToStr(-B/​(2*A))+'​ + '+ FloatToStr(power((B*B-4*A*C)*(-1),​0.5)/​(2*A))+'​i'​);​ 
 +     ​writeln('​x2 = '+ FloatToStr(-B/​(2*A))+'​ - '+ FloatToStr(power((B*B-4*A*C)*(-1),​0.5)/​(2*A))+'​i'​);​ 
 +      
 +  //function Power() requires unit: math 
 +  //function FloatToStr() requires unit: SysUtils 
 +end; 
 +</​sxh> ​     
 +</​hidden>​ 
 + 
 +\\ \\ 
 + 
 +=====Passing Parameters===== 
 +ารส่งผ่าน Parameters เข้าไใน Procedure/​Function มี 2 แบบ คือ By Value และ By Reference 
 +  * **By Value** คือ ส่งเฉพาะค่าของ Parameter เข้าไปใน Procedure/​Function โดยหากมีกาเปลี่ยนแปลงค่าใดๆใน Procedure/​Function นั้น จ__**ไม่เปลี่ยนแปลง**__ต่อค่าที่แท้จริงของ Parameter สำหรับการรับค่าแบบปกติ ​  
 +  * **By Reference** คือ ​ากมีการเปี่ยนแปลงค่าใดๆของ Parameter ใน Procedure/​Function น้น จะ__**เปลี่ยนแปล**__ค่าที่แท้ริงของ Parameter ด้วย 
 + 
 +====By Value==== 
 +รใส่ตัวแปรแบบทั่วไป คือ ​ารส่งผ่าน Parameter ในแบบ By Value 
 + 
 +<sxh delphi;> ​  
 +  procedure DoItA(X:​integer);​ 
 +  begin 
 +    X:=10; 
 +    writeln('​X = ',​X);​ 
 +  end; 
 +</​sxh>​ \\ 
 + 
 +====By Reference==== 
 +เราสามารถใส่ var หน้า Parameter เพื่อให้กลายเป็น By Reference ได้ดังนี้ 
 + 
 +<sxh delphi;> ​  
 +  procedure DoItB(var X:​integer);​ 
 +  begin 
 +    X:=10; 
 +    writeln('​X = ',​X);​ 
 +  end; 
 +</​sxh>​  
 + 
 + 
 +<hidden Example-7: Passing Parameters (By Value, By Reference)>​ 
 +<sxh delphi;>​ 
 +program Passing_Param;​ 
 + 
 +var A,​B:​integer;​ 
 + 
 +procedure DoItA(X:​integer);​ //By Value 
 +begin 
 +  X:=100; 
 +  writeln('​DoItA,​ X = ',​X);​ 
 +end; 
 + 
 +procedure DoItB(var X:integer); //By Reference 
 +begin 
 +  X:=200; 
 +  writeln('​DoItB,​ X = ',​X);​ 
 +end; 
 + 
 +begin 
 +  A:=1; 
 +  B:=2; 
 + 
 +  writeln('​A = ',​A);​ 
 +  writeln('​B = ',​B);​ 
 + 
 +  DoItA(A); 
 +  DoItB(B); 
 + 
 +  writeln('​A = ',​A);​ 
 +  writeln('​B = ',​B);​ 
 + 
 +  readln(); 
 +end.  
 +</​sxh>​  
 + 
 +Compiled Results: 
 + 
 +  A = 1 
 +  B = 2 
 +  DoItA, X = 100 
 +  DoItB, X = 200 
 +  A = 1 
 +  B = 200 
 +     
 +</​hidden>​ 
 +\\ 
 + 
 +=====Forward Declaration===== 
 +คือ ​การประกาศ ​Procedure/​Function ล่วงหน้าเพื่อให้ทุก Procedure/​Function สามารถเรียกใช้งานกันและกันได้หมด สาเหตุที่ต้องทำแบบนี้เพราะว่า โดยปกตินั้น Compiler จะอ่าน source code จาก บนลงล่าง ดังนั้น หากมี Procedure/​Function ​ตัวใดตัวหนึ่งเรียกใช้งาน Procedure/​Function ตัวอื่นที่ยังไม่ได้ประกาศ จะทำให้เกิด Error \\ 
 + 
 +รูปบบการประกาศสำหรับ Program จะมีคำว่า forward ต่อท้ายดังนี้ 
 + 
 +  Procedure DoSomething;​ forward; 
 + 
 +สำหรับ Unit นั้น FPC บังคับให้ต้องมีการทำ forward declaration ทุกครั้งก่อนสมอ เพราะ unit อื่นหรือ program ​มีกร uses unit ดังกล่าวนั้น ​จะเข้าถึง Procedure/​Function ได้เฉพาะส่วนที่เป็น interface เท่านั้น ไม่สามารถเข้าถึงส่วน implementation ​โดยตรงได้ ดังนั้นึงต้องปรกาศล่งหน้ในตำแหน่ใต้คำว่า interface เสมอ โดยการประกาศจะม่มีคำว่า forward ต่อท้ายเมือของ program อีก ดังตัวอย่างต่อไปนี้ 
 + 
 +<sxh delphi;>​ 
 +unit Unit1; 
 + 
 +interface 
 +//Forward declaration 
 +procedure First; 
 +procedure Second; 
 + 
 +implementation 
 + 
 +procedure First; 
 +begin 
 +  writeln('​Hello First'​);​ 
 +  Second; 
 +end; 
 + 
 +procedure Second; 
 +begin 
 +  writeln('​Hello Second'​);​ 
 +end; 
 +end.  
 +</​sxh>​ \\ 
 + 
 + 
 +<hidden Example-8: Forward Declarations on Simple Program>​ 
 +__**อธิบาย**__ - ตัวอย่างนี้ ​ีกรประาศโปรแกรมย่อย ชื่อ Second ล่วงห้าในบรรทัดที่ 4 เพื่อให้โปรแรมย่อยที่ชื่อ First ได้รู้จัก Second ก่อน แน่นอนว่าหากตัด code ในบรรทัดที่ 4 ออกไปแล้ว สิ่งที่จะตามมาคือ เมื่อ compiler อ่านจนมาถึง First ก็จะฟ้องทันทีว่าไม่สามารถหา Second เจอ  
 + 
 +<sxh delphi;​highlight:​ [4]> 
 +program FWD_Declaration;​ 
 + 
 +//Forward declarations 
 +procedure Second; ​ forward; 
 + 
 +//​Implementations 
 +procedure First; 
 +begin 
 +  writeln('​Hello First'​);​ 
 +  Second; 
 +end; 
 + 
 +procedure Second; 
 +begin 
 +  writeln('​Hello Second'​);​ 
 +end; 
 + 
 +begin 
 +  First; 
 +  readln(); 
 +end.   
 +</​sxh>​  
 + 
 +Compiled Results: 
 + 
 +  Hello First 
 +  Hello Second 
 +     
 +</​hidden>​ 
 +\\
tutorial/procedureandfunction.txt · Last modified: 2019/01/06 16:54 by admin