User Tools

Site Tools


tutorial:proceduraltype

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:proceduraltype [2018/09/09 11:07]
admin
tutorial:proceduraltype [2018/10/28 12:32] (current)
admin
Line 1: Line 1:
 =====Procedural Type===== =====Procedural Type=====
  
-====Procedural Type คืออะไร====+=====Procedural Type คืออะไร=====
 คือ การสร้างตัวแปรชนิดที่เป็น procedure/​function เพื่อให้สามารถนำไปใส่ใน input Argument ของ procedure/​function อันอื่นได้ หรือเรียกอีกอย่างหนึ่งคือ การทำให้ procedure/​function กลายเป็นตัวแปร คือ การสร้างตัวแปรชนิดที่เป็น procedure/​function เพื่อให้สามารถนำไปใส่ใน input Argument ของ procedure/​function อันอื่นได้ หรือเรียกอีกอย่างหนึ่งคือ การทำให้ procedure/​function กลายเป็นตัวแปร
 +\\ \\
 +=====รูปแบบ=====
 +Procedural Type มีรูปแบบดังนี้
 +^  Topic  ^  Format ​ ^ 
 +|Type Declaration|<​sxh delphi;>
 +TYPE
 +  TFunc1 = function(x:​integer):​real;​ //for function 1-argument
 +  TFunc2 = function(x,​y:​integer):​real;​ //for function 2-arguments
 +  ​
 +  TProc = procedure; //for procedure with no argument
 +  TProc1 = procedure(y:​string);​ //for procedure 1-argument
 +</​sxh>​ |
  
  
-<hidden Example-1: ​Use a function as Input Argument>+<hidden Example-1: ​Function Finding Max Value>
 **ตัวอย่าง** การส่ง function เข้าไปอีก function หนึ่ง \\ **ตัวอย่าง** การส่ง function เข้าไปอีก function หนึ่ง \\
 __ข้อสังเกต__:​ การหาค่าสูงสุดของ function โดยการสร้าง function ที่มีชื่อว่า Find_Max จะสังเกตว่าภายใน function ดังกล่าว มีการเรียก function จากภายนอกเข้ามาคำนวณ ซึ่งเรียกว่า f() ดังนั้นเราจึงต้องกำหนดให้ f() เป็นตัวแปรชนิด Procedural Type\\ __ข้อสังเกต__:​ การหาค่าสูงสุดของ function โดยการสร้าง function ที่มีชื่อว่า Find_Max จะสังเกตว่าภายใน function ดังกล่าว มีการเรียก function จากภายนอกเข้ามาคำนวณ ซึ่งเรียกว่า f() ดังนั้นเราจึงต้องกำหนดให้ f() เป็นตัวแปรชนิด Procedural Type\\
-สำหรับ Lazarus การเรียก func เข้ามาใน Find_Max ในบรรทัดที่ 30 จะเป็นการเรียกผ่าน Pointer ดังนั้นจึงต้องใส่ @ นำหน้าชื่อ function เสมอ ​+สำหรับ Lazarus การเรียก func เข้ามาใน Find_Max ในบรรทัดที่ 30 จะเป็นการเรียกผ่าน Pointer ดังนั้นจึงต้องใส่ @ นำหน้าชื่อ function เสมอ 
 + 
 +{{ :​introduction:​plot_polynomial.png?​400 |}} 
 + 
 <sxh delphi;​highlight:​ [4,​13,​30]>​ <sxh delphi;​highlight:​ [4,​13,​30]>​
 PROGRAM Find_MaxValue_Of_Function;​ PROGRAM Find_MaxValue_Of_Function;​
Line 44: Line 59:
 </​sxh> ​ </​sxh> ​
 </​hidden>​ </​hidden>​
-----+\\ 
  
 ====ข้อแตกต่างระหว่าง Lazaus กับ Delphi ==== ====ข้อแตกต่างระหว่าง Lazaus กับ Delphi ====
Line 50: Line 65:
 ข้อสังเกต การใส่ function เข้าไปสำหรับ lazarus กับ delphi จะแตกต่างกัน โดย Lazarus จะใช้การส่งค่าผ่าน pointer ดังนั้นจึงต้องมีเครื่องหมาย @ นำหน้าชื่อ function แต่สำหรับ delphi สามารถส่งชื่อ function เข้าไปได้เลย ดูตัวอย่างที่ 2 ข้อสังเกต การใส่ function เข้าไปสำหรับ lazarus กับ delphi จะแตกต่างกัน โดย Lazarus จะใช้การส่งค่าผ่าน pointer ดังนั้นจึงต้องมีเครื่องหมาย @ นำหน้าชื่อ function แต่สำหรับ delphi สามารถส่งชื่อ function เข้าไปได้เลย ดูตัวอย่างที่ 2
  
-<hidden Example-2: ​Use a function as Input Argument ​(Delphi) >+<hidden Example-2: ​Function Finding Max Value (Delphi) >
 <sxh delphi;​highlight:​ [3,32]> <sxh delphi;​highlight:​ [3,32]>
 PROGRAM Find_MaxValue_Of_Function;​ PROGRAM Find_MaxValue_Of_Function;​
Line 90: Line 105:
 ---- ----
  
-====Function of Object====+=====Function of Object=====
 ตัวอย่างข้างบนนั้น ใช้ได้กับกรณีที่ function ถูกประกาศเป็น Global Scope เท่านั้น (จะสังเกตว่า func ไม่ได้อยู่ภายใต้ Class หรือ Object ใดๆ) ในกรณีที่ function ถูกประกาศเป็น Local Scope ภายใต้ Class หรือ Object ใดๆ จะต้องเปลี่ยนการประกาศ Type ใหม่เป็นดังนี้ ตัวอย่างข้างบนนั้น ใช้ได้กับกรณีที่ function ถูกประกาศเป็น Global Scope เท่านั้น (จะสังเกตว่า func ไม่ได้อยู่ภายใต้ Class หรือ Object ใดๆ) ในกรณีที่ function ถูกประกาศเป็น Local Scope ภายใต้ Class หรือ Object ใดๆ จะต้องเปลี่ยนการประกาศ Type ใหม่เป็นดังนี้
 +
 +  Type 
 +    TFunc = function(x:​real):​real of Object ;
  
 <hidden Example-3: Function of Object (TForm)> <hidden Example-3: Function of Object (TForm)>
Line 161: Line 179:
 </​hidden>​ </​hidden>​
 ---- ----
 +=====Function is Nested=====
 +สำหรับการทำ Nested Function ให้กลายเป็น Procedural Type เพื่อส่งผ่านเป็นตัวแปรนั้น เราสามารถระบุ Function ดังกล่าวได้ตามนี้
  
 +  Type 
 +    TFunc = function(x:​real):​real is Nested ;
  
 +จะสังเกตได้ว่าคล้ายกับการระบุ Function of Object นั่นเอง เพียงแต่เปลี่ยนจากคำว่า of Object เป็น is Nested แต่อย่างไรก็ตามสิ่งที่แตกต่างกันอีกอย่างหนึ่ง คือ คำสั่งข้างต้น จำเป็นต้องระบุ Compiler Directive ดังนี้ก่อนเสมอ ​
 +
 +  {$modeswitch nestedprocvars}  ​
 +  ​
 +  ​
tutorial/proceduraltype.1536466053.txt.gz · Last modified: 2018/09/09 11:07 by admin