บางคนอาจเจอปัญหา error ไม่เจอตัวแปรที่เรียกใช้งานทั้งที่ประกาศไปแล้ว เนื่องจากตำแหน่งของการประกาศตัวแปร มีผลต่อขอบเขตการเรียกใช้งานตัวแปรนั้นๆ วันนี้เรามาเรียนรู้ขอบเขตนี้กันครับ
Global Variables vs Local Variables
ตัวแปรที่เราประกาศตั้งแต่ส่วนต้นๆของโปรแกรม ก่อนจะเข้าสู่ function ต่างๆ เช่น OnInit() หรือ OnStart() ตัวแปรเหล่านั้นจะสามารถถูกเรียกใช้งานอ้างอิงได้ตลอดทั้งโปรแกรมครับ เราเรียกตัวแปรเหล่านี้ว่าเป็น Global Variables ส่วนตัวแปรที่ถูกประกาศภายในฟังค์ชั่นต่างๆ จะถูกเรียกใช้งานได้เฉพาะแค่ในฟังค์ชั่นนั้นๆ ตัวแปรลักษณะนี้เรียกว่า Local Variables ครับ
เพิ่มเติมหน่อยนะครับ โดยปกติแล้วใน MQL4 version เก่า Local Variables จะมีขอบเขตการเรียกใช้งาน(scope) ได้ทั่วทั้งฟังค์ชั่นที่ได้ประกาศใช้ แม้ตอนประกาศจะอยู่ในโค๊ดส่วนย่อย (block) ภายในฟังค์ชั่นนั้นก็ตาม แต่เมื่อมี MQL4 version ใหม่ ซึ่งบางครั้งจำเป็นต้องมีการประกาศ #Property Strict ด้านบน (จะมีเสมอเวลาสร้างไฟล์ใหม่ขึ้นมาด้วย MQL4 Wizard) Local Variables จะมี scope อยู่เพียงแค่กรอบวงเล็บปีกกา {…} ของส่วนย่อย(block)ของโค๊ดที่ทำการประกาศตัวแปรเท่านั้น หลุดจากวงเล็บปีกกา } นี้ไป จะเรียกใช้งานไม่ได้อีกแม้จะอยู่ในฟังค์ชั่นเดียวกันก็ตาม
จากในรูป มีการประกาศ #Property strict ต่อมาบรรทัดที่ 15 มีการประกาศตัวแปร x ซึ่งอยู่ในblock ของคำสั่ง if การสั่ง Print ค่า x ในบรรทัด ที่ 16 สามารถ ไม่เกิดปัญหาใดๆ เนื่องจากยังอยู๋ในวงเล็บปีกกาเดียวกับที่ประกาศไว้ {} แต่ คำสั่ง Print ค่า x ในบรรทัดที่ 18 เกิด error เนื่องจาก ค่า x นั้นถูกลบออกไปแล้วเมื่อหลุดจากวงเล็บปีกกาปิด } ไป
ซึ่งหลายคนมักเจอ error เกี่ยวกับตัวแบบทำนองนี้ เมื่อไปโหลด EA/Indicator ที่เขียนด้วย mql4 เก่า แล้วนำวางลง แก้ไขในไฟล์แบบใหม่ ซึ่งมักมีการประกาศ #Property strict ครับ
หวังว่าจะทำให้เพื่อนๆ ได้เข้าใจ ขอบเขตการเรียกใช้งานของตัวแปรทั้ง Global และ Local มากขึ้นนะครับ เวลาเจอ error จะได้เข้าใจและแก้ได้ถูกจุดครับ
หากคิดว่าบทความนี้มีประโยชน์กับคนที่สนใจ MQL4 ฝากแชร์ต่อด้วยนะครับ
ปล. หากมีส่วนไหนที่อาจให้ข้อมูลไม่ถูกต้อง แจ้งได้นะครับ ผมเองก็พร้อมจะเรียนรู้แก้ไข ให้ถูกต้องครับ เพื่อประโยชน์ต่อคนอ่านทุกท่านครับ