ทำไมเราถึงต้องสร้างฟังก์ชั่นเอง ?
ก็เพราะว่าในการเขียนโปรแกรมแต่ในครั้ง หากเราทำคำสั่งนั้น ซ้ำๆกัน จะทำให้โปรแกรมที่เราเขียน ย๊าวววววววว เกินไป ทำให้ลำบากต่อการแก้ได้ เช่น
main()
{
while(TRUE)
{
output_high(PIN_A0);
delay_ms(1000);
output_low(PIN_A0);
delay_ms(1000);
output_high(PIN_A1);
delay_ms(1000);
output_low(PIN_A1);
output_high(PIN_A2);
delay_ms(1000);
output_low(PIN_A2);
delay_ms(1000);
output_high(PIN_A3);
delay_ms(1000);
output_low(PIN_A3);
delay_ms(1000);
}
}
แบบนี้ ยาววไหมล่ะ อย่างในตัวอย่างด้านบนนี้ เป็นการเขียนโปรแกรมสั่ง Output ของทาง Port A0 - A3 โดยหน่วงเวลาขาล่ะ 1 วินาที โดยเป็นคำสั่งใน CCS C นะ ไม่ต้องตกใจ
เราสามารถใช้การสร้าง ฟังก์ชั่นเพื่อลดบรรทัดของโปรแกรมใน main ได้ มีรูปแบบอย่างนี้
รูปแบบ
ชนิดฟังก์ชั่น ชื่อฟังชั่น (ตัวแปรพารามิเตอร์)
{
คำสั่ง;
return ;
}
ชนิดฟังก์ชั่น = ข้อมูลที่ใช้ในการ ส่งค่ากลับ(return) หากไม่ได้มีการส่งค่ากลับจะใช้ void
ชื่อฟังชั่น = ชื่อฟังชั่น มีกฎการตั้งชื่อแบบเดียวกับตัวแปร
ตัวแปรพารามิเตอร์ = ตัวแปรที่นำเข้ามาในฟังก์ชั่น
คำสั่ง = ชุดคำสั่งในการทำงาน
return = ใช้ในการส่งค่ากลับ main ถ้าไม่มีการส่งค่ากลับก็ไม่ต้องมี
ตัวอย่าง
void PortA_blink(void)
{
output_high(PIN_A0);
delay_ms(1000);
output_low(PIN_A0);
delay_ms(1000);
output_high(PIN_A1);
delay_ms(1000);
output_low(PIN_A1);
delay_ms(1000);
output_high(PIN_A2);
delay_ms(1000);
output_low(PIN_A2);
delay_ms(1000);
output_high(PIN_A3);
delay_ms(1000);
output_low(PIN_A3);
delay_ms(1000);
}
main()
{
while(TRUE)
{
PortA_blink();
}
}
จากตัวอย่าง เราสร้างฟังก์ชั่นย่อยที่มีชื่อว่า PortA_blink เพื่อแสดง Output ของ Port A เราสามารถใช้ฟังก์ชั่นนี้ใน main ได้ ทำให้โปรแกรมหลัก(main) เหลือน้อยลงได้
ในกรณีที่เราต้องการสร้าง ฟังก์ชั่นย่อย ไว้ด้านล่างโปรแกรมหลัก(main) เราจำเป็นที่จะต้องประกาศต้นแบบ (Prototype) ไว้ด้านบนของโปรแกรมหลัก ดังนี้
void PortA_blink(void); // ประกาศ Prototype ของ ฟังก์ชั่นย่อย
main()
{
while(TRUE)
{
PortA_blink();
}
}
void PortA_blink(void)
{
output_high(PIN_A0);
delay_ms(1000);
output_low(PIN_A0);
delay_ms(1000);
output_high(PIN_A1);
delay_ms(1000);
output_low(PIN_A1);
delay_ms(1000);
output_high(PIN_A2);
delay_ms(1000);
output_low(PIN_A2);
delay_ms(1000);
output_high(PIN_A3);
delay_ms(1000);
output_low(PIN_A3);
delay_ms(1000);
}
แล้วการส่งค่ากลับคืออะไร งง ???
การส่งค่ากลับก็คือการนำตัวแปรเข้ามากระทำใน ฟังก์ชั่นย่อย แล้วส่งค่ากลับไปใน main เช่น การนำเลขมาบวกกัน หรือสูตรทางคณิตศาสตร์
ตัวอย่าง
int Add_number(int a,int b)
{
int sum;
sum = a+b;
return sum;
}
main()
{
printf("/fSum = %d",Add_number(5,7));
}
จากฟังก์ชั่นย่อย มีการนำค่าของ a มาบวกกับ b แล้วส่งค่าออกไปเป็น int ทำให้ Add_number เป็น int ตัวหนึ่ง ที่มีค่าเท่ากับ sum แล้วนำมาแสดงในโปรแกรมหลัก ในตัวอย่างก็คือนำเลข 5 + 7 = 12 ก็จะแสงข้อความว่า " Sum = 12 " ถ้าต้องการเป็นชนิดข้อมูลอื่นเช่น float ก็สามารถเปลี่ยนได้ เช่น
float Add_number(int a,int b)
{
int sum;
sum = a+b;
return sum;
}
main()
{
printf("/fSum = %f",Add_number(5,7));
}
พอเข้าใจกันนะ ๆ ไม่น่ายาก ๆ ต่อกันเลย ต่อไปคือ " ตัวแปรอาร์เรย์ "
ตัวแปรอาร์เรย์ คืออะไร ?? มันทำอะไรได้บ้าง
อาจารย์ไนท์ช่วยอธิบาย
ตอบลบ1)ฟังชันที่ผ่านค่าข้อมูลไปให้กับฟังก์ชั่น
2)ฟังชั่นที่ผ่านค่าอ้างอิงหรือแอดเดรสไปให้กับฟังก์ชัน
หน่อยคับ
ขอตัวอย่างการสร้างฟังก์ชั่นย่อยแบบมีการส่งค่ากลับไปยังฟังก์ชั่นหลัก
ตอบลบโดยการใช้คำสั่งreturn เพื่อให้มองภาพถึงความแตกต่างกับไม่ส่งค่ากลับที่ยกตัวอย่างไว้อะคับ
1 กับ 2 เป็นเรื่องตัวแปร pointer นะ บทความนี้ยังไม่เสร็จดีน่ะ
ตอบลบส่วนตัวอย่างการส่งค่ากลับได้ลงไว้ตั้งแต่แรกแล้วนะ ตัวอย่าง Add_number
while(TRUE) เหมือนกับ while(1) ไหมครับ??
ตอบลบสอนต่อครับ กำลังเริ่มเรียนครับ
ตอบลบขอบคุณครับ