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) ()

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 ชี้อยู่ค่าก็จะเปลี่ยนตามด้วย อาจทำให้ทั้งโปรแกรมล่มได้..

ความคิดเห็น

NHiGH กล่าวว่า
มีความสุขกับการอ่าน ขอบพระคุณสำหรับข้อมูลดีดีครับ ส่วนตัวกำลังพัฒนา ESP32-WROVER-C20 โดยไม่มีพื้นฐานใดใด อ้างอืงจากบทความต่างๆ ที่หาเจอใน Google :D ฮ๋าๆ ตอนนี้กำลังพัฒนา ระบบ Tasking รับค่าจาก Semsor อุณหภูมิ 5 จุด ให้กับการแสดงผลบน Blynk ติดปัญหา การ Reboot ตัวเอง บ่อยครั้งและหลุดจาก Blynk Server ทุก 10-20 นาที นานสุด 1 ชั่วโมง อยากเข้าใจเรื่อง Multitasking มากกว่านี้ Core 0 Core 1 ทำงานยังไงให้สัมพันธกัน โดยไม่เกิดการ Reboot บ่อยๆ **แต่ตัวบอร์ดยังคงทำงานได้ปกติ กรณี สั่งงาน Relay ก็ยังคงสั่งงาน ขณะที่ Reboot ยังไม่แน่ใจเรื่อง Tasking สักเท่าไร

โพสต์ยอดนิยมจากบล็อกนี้

ว่าด้วยเรื่องหน่วยความจำ สิ่งที่หลายคนมองข้าม : รู้จักกับ Memory

คณิตศาสตร์กับโปรแกรมมิ่งมันเป็นยังไงนะ ตอนที่ 1 เกริ่นพีทาโกรัส

Pointer กับตัวแปร Array นะจ๊ะ.. [Back to basic แต่ไม่ basic]