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
tutorial:procedureandfunction [2018/09/21 10:48]
admin
tutorial:procedureandfunction [2019/01/06 16:54] (current)
admin
Line 5: Line 5:
   * Function จะส่งค่ากลับ   * Function จะส่งค่ากลับ
   * Procedure ไม่ส่งค่าใดๆกลับ   * Procedure ไม่ส่งค่าใดๆกลับ
-\\ \\+\\ 
 =====รูปแบบของ Procedure===== =====รูปแบบของ Procedure=====
 Procedure โดยปกติจะมีอยู่ 2 แบบ คือ แบบรับค่า input กับแบบไม่รับค่า input\\ Procedure โดยปกติจะมีอยู่ 2 แบบ คือ แบบรับค่า input กับแบบไม่รับค่า input\\
Line 71: Line 71:
 </​sxh> ​     </​sxh> ​    
 </​hidden>​ </​hidden>​
- 
 <hidden Example-4: Function แบบใช้ตัวแปรที่เป็นชื่อของฟังก์ชั่นเอง เป็น Output> <hidden Example-4: Function แบบใช้ตัวแปรที่เป็นชื่อของฟังก์ชั่นเอง เป็น Output>
 <sxh delphi;> <sxh delphi;>
Line 81: Line 80:
 </​hidden>​ </​hidden>​
  
 +\\ 
 +จากประสบการณ์ของผม ขอแนะนำให้ใช้ result แทนชื่อของ Function ครับ เพราะจะง่ายในการแก้ใขชื่อ Function ในภายหลัง
 \\ \\ \\ \\
  
-=====การประกาศ Procedure/​Function===== +=====การประกาศและการเรียกใช้ ​Procedure/​Function===== 
-Procedure/​Function จะต้องถูกประกาหลังจากการประกาศตัวแปร ​VAR เท่านั้น โดยจะวางอันไหนมาก่อนกได้+หลังจากการประกาศ 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.1537501738.txt.gz · Last modified: 2018/09/21 10:48 by admin