Function Pointer กับการ Call back Function (C++ programming)
หัวข้อในวันนี้เจ้าของบล็อกจะขอพูดถึงเรื่องของ function pointer นะครับซึ่งในบทความนี้ก็จะอธิบายเกี่ยวกับการทำ call back function มันก็คือการให้ function มันสามารถคุยกันเองได้ โดยการที่เราสร้าง function มาตัวนึง แล้วส่ง function ที่เราสร้างมานี้ ส่งไปให้ function หลัก แล้วมันก็จะใช้งาน function ที่เราสร้างขึ้นมาเองโดยที่เราไม่ต้องทำอะไรกับ function นั้นเลย เดี๋ยวเราลองมาดูกันเลย
นี่คือตัวอย่างของ function หลักนะครับ ใน function นี้เจ้าของบล็อกก็กำหนัดให้การ return ค่าของมันเป็น void ก็คือไม่มีการ return ค่าใด ๆ จาก function นะครับ แต่ที่ต้องสังเกตุเลยก็คือ parameter ของ function ที่เป็น function หลักนี้ จะรับค่า parameter ว่า -> void (*callBack) ()
ผู้อ่านก็จะเกิดการสงสัยว่า ทำไมไม่สั่งใช้งาน function ที่สร้างขึ้นตรง ๆ เลย ทำไมต้องส่งไปให้ function call back..? ซึ่งก็เคยเป็นคำถามของเจ้าของบล็อกเหมือนกันครับ มันจะมีประโยชน์มากถ้าใช้กับการเขียน call back ใน library ซึ่งเราไม่ต้องมายุ่งเกี่ยวกับ function เลย ให้ function มันคุยกันภายใน library
อ้าแล้วถ้าเกิดเจ้าของบล็อกอยากสร้าง function เพิ่มมาซัก 4 ตัว แล้วให้แต่ละตัววน loop ซัก 10 รอบ ผู้อ่านก็อาจจะคิดว่าก็ใส่ loop ไว้ใน function หรือไม่ก็เอา function ที่เขียนมา มาเข้า loop แต่จะไม่ง่ายกว่าหรอ ถ้าเกิดเรามี call back function คือเราแค่ส่ง function ไปให้ call back function หลังจากนั้นก็ให้มันวน loop อยู่ภายใน call back function เลย
เจ้าของบล็อกจะเขียนโปรแกรมแบบ simple ให้ดูนะครับ
สังเกตที่ func_call_back() เจ้าของบล็อกเพิ่ม parameter เข้าไปให้อีก ก็คือ round ซึ่งก็เป็นตัวแปร int ที่มาเก็บรอบของการวน loop
มาดูผลลัพธ์ของโปรแกรมกันนะครับ
ก็จะเห็นว่ามันมีการ call back function กลับไป โดยผลลัพธ์จะถูกควบคุมผ่าน function หลัก ซึ่งทิศทางของโปรแกรมก็จะถูกกำหนดไว้ใน function หลัก เช่นอยากจะให้ callback กลับไปยังไง อาจจะใส่ loop ให้มัน หรืออาจจะนำเอา function มาคำนวณสูตรอะไรซักอย่างที่ต้องใช้หลาย ๆ สูตรมารวมกัน แต่เราสร้างแค่บางสูตรเท่านั้น
ถ้าสังเกตุใน library ของ arduino บางตัวที่มีกระบวนการซับซ้อน เรียกใช้หลาย class เชื่อมกัน ก็จะใช้ call back function ในการติดต่อกัน
สรุปสำหรับบทความนี้ เป็นบทความที่เกี่ยวกับการนำเอา Pointer ( * ) มาใช้ในการ Passing reference ก็คือการส่งผ่านตัวอ้างอิง ซึ่งจะใช้ Pointer ชี้ไปยัง address ของ function ที่ส่งเข้ามาและสามารถเรียกใช้งาน function นั้นตอนไหนก็ได้ Pointer ถ้าใช้ถูกวิธีก็ดีไป แต่ถ้าใช้ผิดวิธีก็ล่มได้นะครับ 555 เพราะมันชี้ไปที่ address ถ้าเกิดเราไปเปลี่ยนค่าไรซักอย่างใน pointer โดยไม่ระวัง ตัวแปร หรือ function ที่ pointer ชี้อยู่ค่าก็จะเปลี่ยนตามด้วย อาจทำให้ทั้งโปรแกรมล่มได้..
func_call_back( void (*callBack) () )
การรับ parameter แบบนี้ก็คือรับ parameter ที่เป็น function อื่นเข้ามาใน function เราด้วย ซึ่งเมื่อรับเข้ามาแล้ว ใน function นี้ก็จะสามารถเรียกใช้ function ที่ส่งมานี้ได้เลย สามารถเรียกตอนไหนก็ได้ ในส่วนนี้เขาเรียกว่าการ call back function
ความหมายของ parameter ที่ใส่เข้าไปก็จะดูจากรูปด้านล่างนี้
แล้วมาดูกันครับว่ารูปล่างหน้าตาโปรแกรมจะเป็นยังไง
ผลลัพของโปรแกรมที่เขียนไป
ผู้อ่านก็จะเกิดการสงสัยว่า ทำไมไม่สั่งใช้งาน function ที่สร้างขึ้นตรง ๆ เลย ทำไมต้องส่งไปให้ function call back..? ซึ่งก็เคยเป็นคำถามของเจ้าของบล็อกเหมือนกันครับ มันจะมีประโยชน์มากถ้าใช้กับการเขียน call back ใน library ซึ่งเราไม่ต้องมายุ่งเกี่ยวกับ function เลย ให้ function มันคุยกันภายใน library
อ้าแล้วถ้าเกิดเจ้าของบล็อกอยากสร้าง function เพิ่มมาซัก 4 ตัว แล้วให้แต่ละตัววน loop ซัก 10 รอบ ผู้อ่านก็อาจจะคิดว่าก็ใส่ loop ไว้ใน function หรือไม่ก็เอา function ที่เขียนมา มาเข้า loop แต่จะไม่ง่ายกว่าหรอ ถ้าเกิดเรามี call back function คือเราแค่ส่ง function ไปให้ call back function หลังจากนั้นก็ให้มันวน loop อยู่ภายใน call back function เลย
เจ้าของบล็อกจะเขียนโปรแกรมแบบ simple ให้ดูนะครับ
สังเกตที่ func_call_back() เจ้าของบล็อกเพิ่ม parameter เข้าไปให้อีก ก็คือ round ซึ่งก็เป็นตัวแปร int ที่มาเก็บรอบของการวน loop
มาดูผลลัพธ์ของโปรแกรมกันนะครับ
ก็จะเห็นว่ามันมีการ call back function กลับไป โดยผลลัพธ์จะถูกควบคุมผ่าน function หลัก ซึ่งทิศทางของโปรแกรมก็จะถูกกำหนดไว้ใน function หลัก เช่นอยากจะให้ callback กลับไปยังไง อาจจะใส่ loop ให้มัน หรืออาจจะนำเอา function มาคำนวณสูตรอะไรซักอย่างที่ต้องใช้หลาย ๆ สูตรมารวมกัน แต่เราสร้างแค่บางสูตรเท่านั้น
ถ้าสังเกตุใน library ของ arduino บางตัวที่มีกระบวนการซับซ้อน เรียกใช้หลาย class เชื่อมกัน ก็จะใช้ call back function ในการติดต่อกัน
สรุปสำหรับบทความนี้ เป็นบทความที่เกี่ยวกับการนำเอา Pointer ( * ) มาใช้ในการ Passing reference ก็คือการส่งผ่านตัวอ้างอิง ซึ่งจะใช้ Pointer ชี้ไปยัง address ของ function ที่ส่งเข้ามาและสามารถเรียกใช้งาน function นั้นตอนไหนก็ได้ Pointer ถ้าใช้ถูกวิธีก็ดีไป แต่ถ้าใช้ผิดวิธีก็ล่มได้นะครับ 555 เพราะมันชี้ไปที่ address ถ้าเกิดเราไปเปลี่ยนค่าไรซักอย่างใน pointer โดยไม่ระวัง ตัวแปร หรือ function ที่ pointer ชี้อยู่ค่าก็จะเปลี่ยนตามด้วย อาจทำให้ทั้งโปรแกรมล่มได้..
ความคิดเห็น
แสดงความคิดเห็น