This shows you the differences between two versions of the page.
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} | ||
+ | | ||
+ | |