การส่ง DATA ผ่าน Subroutine และความหมายของ Using & Changing.
มีการส่ง 2 แบบคือ
- USING คือ การส่งค่าไปยัง Subroutine ถึงแม้ตัวรับใน Subroutine มีการเปลี่ยนแปลงค่า ตัวแปรหลักที่ส่งไปจะไม่เปลี่ยนค่า (พูดง่ายๆ มันคือ Pass by Value )
- CHANGING คือ การส่งค่าไปยัง Subroutine แล้วตัวรับใน Subroutine มีการเปลี่ยนแปลงค่า ตัวแปรหลักที่ส่งไปจะเปลี่ยนค่าตามไปด้วย (พูดง่ายๆ มันคือ Pass by Reference )
สำหรับคนที่เข้าใจแล้ว พูดคำว่า "อ๋อ" ในใจและกดปิดไปได้เลย ส่วนค่าที่ยังไม่เข้าใจ อ่านต่อครับ
อธิบาย เพิ่มเติม ตามหลักการ
Pass by Value คือ Address ใน Memory มันอยู่คนละที่กัน มันเป็นเพียงแค่การ Copy ตัวแปรไปยังอีก ที่นึง ( Subroutine หรือ Function หรือ Method ก็แล้วแต่ภาษาที่เรียก ) ไม่ว่าค่าที่ปลายทางเปลี่ยนไปยังไงก็ตาม ค่าเดิมก็จะไม่มีการเปลี่ยนแปลง เพราะ Address ใน Memory มันอยู่คนละที่กัน
Pass by Reference คือ Address ใน Memory มันอยู่ที่เดียวกันเลย มันคือการส่งทั้งค่า และ Address ใน Memory ไปเลย เมื่อปลายทางเปลี่ยนไปเป็นอะไรก็ตาม ต้นทางก็จะเปลี่ยนตามไปด้วย เพราะมันคือ "ที่เดียวกัน ณ หน่อยความจำ"
ตัวอย่างเช่น
ผมจะทำการ Break point แล้วรันให้ดูทีละขั้นตอนนะครับ
Remark : เมื่อลูกศรสีเหลืองชี้ที่บันทัดไหน แปลว่าโปรแกรมกำลังอ่าน Code บันทัดนั้นอยู่
จะเห็นว่า
ตัวแปร A และ B ที่เราส่งไปแบบ USING นั้น ยังเป็นค่าเดิมตอนออกมาจาก Subroutine
นอกจากส่งเป็นตัวแปรแบบนี้แล้ว ใน SAP ยังสามารถส่งเป็น Internal Table ,Work Area ได้ด้วย ก็คือยัดใส่แบบนี้แหละ แต่พอดีขี้เกียจทำเยอะ เอาไปประยุกต์ดูนะครับ ติดตรงไหนคอมเม้นท์บอกกันได้นาจา
Code
- USING คือ การส่งค่าไปยัง Subroutine ถึงแม้ตัวรับใน Subroutine มีการเปลี่ยนแปลงค่า ตัวแปรหลักที่ส่งไปจะไม่เปลี่ยนค่า (พูดง่ายๆ มันคือ Pass by Value )
- CHANGING คือ การส่งค่าไปยัง Subroutine แล้วตัวรับใน Subroutine มีการเปลี่ยนแปลงค่า ตัวแปรหลักที่ส่งไปจะเปลี่ยนค่าตามไปด้วย (พูดง่ายๆ มันคือ Pass by Reference )
สำหรับคนที่เข้าใจแล้ว พูดคำว่า "อ๋อ" ในใจและกดปิดไปได้เลย ส่วนค่าที่ยังไม่เข้าใจ อ่านต่อครับ
อธิบาย เพิ่มเติม ตามหลักการ
Pass by Value คือ Address ใน Memory มันอยู่คนละที่กัน มันเป็นเพียงแค่การ Copy ตัวแปรไปยังอีก ที่นึง ( Subroutine หรือ Function หรือ Method ก็แล้วแต่ภาษาที่เรียก ) ไม่ว่าค่าที่ปลายทางเปลี่ยนไปยังไงก็ตาม ค่าเดิมก็จะไม่มีการเปลี่ยนแปลง เพราะ Address ใน Memory มันอยู่คนละที่กัน
Pass by Reference คือ Address ใน Memory มันอยู่ที่เดียวกันเลย มันคือการส่งทั้งค่า และ Address ใน Memory ไปเลย เมื่อปลายทางเปลี่ยนไปเป็นอะไรก็ตาม ต้นทางก็จะเปลี่ยนตามไปด้วย เพราะมันคือ "ที่เดียวกัน ณ หน่อยความจำ"
หากใครยัง งง อยู่ แสดงว่าไม่ได้เรียน OS มา
งั้นก็มาดูกันต่อที่ละ Step
ตัวอย่างเช่น
Code นี้ |
เมื่อกดรันโปรแกรม จะเห็นว่าค่าตัวแปรเป็นไปตาม Default ที่เราตั้งไว้ |
อ่านบันทัดถัดไป โปรแกรมจะกระโดดไปยัง Subroutine "fill_table_field" พร้อมส่งค่าไปให้ตัวแปรต่างๆ ในนั้นด้วย |
โปรแกรมอ่านมาถึงบันทัดที่ 15 จะเห็นว่า ตัวแปร AA และ BB เปลี่ยน แต่ตัวแปร A และ B ยังเหมือนเดิม |
อ่านมาถึงบันทัดที่ 24 คือ กำลังจะออกจาก Subroutine นี้แล้ว จะเห็นว่าตัวแปร A, B, C, D ยังเหมือนเดิม และตัวแปร AA, BB, CC, DD นั้นเป็น 10, 20, 30, 40 ตามลำดับ |
ไฮไลท์มันอยู่ตรงนี้แหละ
ผมจะกดอ่านบันทัดถัดไปอีกที......
โปรแกรมออกจาก Subroutine แล้วกลับมาอ่านที่บันทัดที่ 10 |
ตัวแปร A และ B ที่เราส่งไปแบบ USING นั้น ยังเป็นค่าเดิมตอนออกมาจาก Subroutine
แต่
ตัวแปร C และ D ที่เราส่งไปแบบ CHANGING นั้น เปลี่ยนไปตาม CC และ DD ตอนออกมาจาก Subroutineนอกจากส่งเป็นตัวแปรแบบนี้แล้ว ใน SAP ยังสามารถส่งเป็น Internal Table ,Work Area ได้ด้วย ก็คือยัดใส่แบบนี้แหละ แต่พอดีขี้เกียจทำเยอะ เอาไปประยุกต์ดูนะครับ ติดตรงไหนคอมเม้นท์บอกกันได้นาจา
ผลลัพธ์ |
Code
DATA: a TYPE i VALUE 1,
b TYPE i VALUE 2,c TYPE i VALUE 3,d TYPE i VALUE 4.
PERFORM fill_table_fields USING a b CHANGING c d.
WRITE : / 'A : ', a,b,c,d.
FORM fill_table_fields USING value(aa)
value(bb)CHANGING value(cc)value(dd).aa = 10.bb = 20.cc = 30.dd = 40.WRITE: / 'AA : ', aa,bb,cc,dd.
ENDFORM.
USING เปลี่ยนค่าได้เหมือนกันนะครับ
ReplyDelete