Page 1 of 3 123 LastLast
Results 1 to 10 of 25

Thread: ช่วยตอบคำถามภาษา c ทีคับ(ฟังก์ชันmain)

  1. #1
    Junior Member
    Join Date
    Jun 2009
    Posts
    3


    ความแตกต่างระหว่าง
    main()
    void main()
    void main(void)
    main(void)
    เป็นอย่างไรคับ
    (คือที่ผ่านมาผมก็ใช้แต่ void main มาตลอดแต่ไม่รู้ว่ามันหมายถึงอะไร)

  2. #2
    Junior Member
    Join Date
    Apr 2009
    Posts
    17


    ที่ถูกต้องตามมาตราฐานของภาษาC คือ

    int main ( int argc , char *argv[])

    argc จะเป็นจำนวน Argument
    argv[] คือArgumentของ command line ครับ

    สองตัวนี้ค่อนข้างจำเป็นนะครับ โดยปกติ โปรแกรมของเราจะต้องรันใน command line ครับ แล้วจะมีการสงArgumentบางอย่างมาเพื่อบอกให้โปรแกรมทรอบ เช่นว่า ว่าควรจะเปิดไฟล์ไหน มี config อย่างไร
    เช่น

    C:\Program Files\Internet Explorer\iexplore www.google.com

    ในกรณีนี้ argc จะเท่ากับ 2 ครับ
    argv[0] = C:\Program Files\Internet Explorer\iexplore
    argv[1] = www.google.com

    ก็คือเป็นการบอกให้ Internet Explorer ที่เรากำลังจะเปิดให้ทราบว่า เปิดไปที่ google เลยนะ

    แต่.........ในกรณีมือใหม่เนี่ย เราคงไม่เขียนโปรแกรมละเอียดอะไรขนาดนั้นใช่ไหมครับ เราก็สามารถเขียนเป็น int main() หรือ int main(void) ไปก็ได้ครับ ก็จะไม่ได้2ตัวนั้นไปใช้เฉยๆ ไม่มีปัญหา

    ทีนี้ที่ต้อง type return เป็น int (int main() ) ก็เพราะว่าโปรแกรมของเราอาจจะไม่ได้ถูกเรียกตรงๆ แต่อาจจะถูกเรียกจากโปรแกรมอื่นได้
    การที่ main() ของเรามี return int เนี่ย มักจะให้ return 0; เพิ่มบอกว่า>>โปรแกรมเราจบการทำงานอย่างสมบูรณ์นะ
    ถ้าเกิด error ขึ้นเราอาจจะ returnค่าอื่นที่ไม่ใช้ 0 ก็แล้วแต่
    (พวกที่เขียน file batch จะรู้ดีครับ)

    แต่..........ก็อีกนั้นแหละ มือใหม่จะใช้ void ก็ไม่มีใครว่า มันก็จะถูกปล่อยค่าreturn มันก็จะถูกปล่อยตามมีตามเกิดแหละครับ (หรือสำหรับcompilerบางตัวอาจจะบังคับเป็น 0 ให้)

    แต่เป็นสักหน่อยแล้ว อยากจะขอนะครับว่า int main() นะครับ บางบอร์ดสอบC/C++ตามเมืองนอกเขาถือกันนะครับ
    ถ้าใช้ void main() อาจจะโดนหาว่า noob


  3. #3
    Junior Member
    Join Date
    Aug 2009
    Posts
    2


    {

    ขอร่วมแสดงความคิดเห็นแบบไม่ซีเรียสด้วยคนครับ

    เอาเป็นว่า ถ้าพูดกันตาม Standard ที่เขาว่า ก็ควรจะใช้

    int main()
    หรือ
    int main( int argc , char *argv[])

    แต่ทั้งนี้การจะใช้การประกาศในรูปแบบอื่นเช่น

    void main() หรือ main() หรือ void main()
    หรือ void main(void) หรือ int main(void) หรือ อื่นๆ

    ก็ไม่ใช่ว่าคอมไพล์เลอร์จะไม่ยอม แต่โดยพื้นฐานของ คอมไพล์เลอร์ทุกตัว ถ้าบางส่วนของ
    CODE ไม่เหมาะสม (แต่ก็ไม่ใช่ข้อผิดพลาด - error) จะมีข้อความเตือน (warning message)
    ขึ้นในขณะที่ทำการคอมไพล์ (หรือ BUILT)

    ทั้งนี้ขึ้นอยู่กับ Option ในการคอมไพล์ด้วย ซึ่ง Option นี้สามารถกำหนดให้เข้มงวดถึงขนาดถ้ามีความ
    ไม่ถูกต้องแม้เพียงเล็กน้อย ก็ให้เปรียบเสมือนมีข้อผิดพลาด (error) ซึ่งมีผลทำให้คอมไพล์ไม่ผ่านก็ได้

    หรือกำหนดให้ไม่สนใจข้อความเตือนเลย ก้มหน้าก้มตาคอมไพล์มันลูกเดียว
    ขอเพียงไม่มี ข้อผิดพลาดที่ร้ายแรง ก็ให้ผ่านหมดก็ยังได้


    ผมขอเสริมข้อความที่ คุณ ฺBerryBoy
    โพสท์ไว้ว่า การที่โปรแกรมใดๆ เมื่อทำงานเสร็จแล้วก็ควรส่งค่า Return เป็น 0 เพื่อบอกว่าโปรแกรม
    จบการทำงานอย่างสมบูรณ์ เป็นหลักการที่ยอมรับกันทั่วไป ผมก็เห็นด้วยว่าเป็นเรื่องที่ดี

    แต่ก็มีบางคนแย้งว่า แล้วเจ้า OS มันทำอะไรบ้างกับ รีเทิร์นศูนย์ หรือไม่ศูนย์ (ซึ่งผมเองก็ไม่ค่อยเห็น
    มีการทำอะไร นอกจากจะมีไดอะล็อกถามว่าจะให้ส่ง Report ไปให้ไมโครซอฟท์ช่วยตรวจสอบให้หรือปล่าว?
    ในบางครั้งเท่านั้น)

    แต่ในเมื่อเป็นมาตราฐาน เราควรยึดถือและปฏิบัติ การที่เราจะเป็นโปรแกรมเมอร์มืออาชีพก็เปรียบเสมือนกับ
    ขับรถบนถนนสาธารณะ ถ้าจะเปลี่ยนเลนก็ต้องเปิดไฟเลี้ยวมิใช่หรือ ต่างจากเวลาที่เราขับรถบนถนนในหมู่บ้าน
    ที่แทบไม่ต้องห่วงว่าจะมีรถที่วิ่งตามหลังมาจะชนท้ายรถเราเพราะ ซัก 10 นาทีจะมีมาซักคัน
    (แต่ผมแนะนำว่าทำให้เป็นนิสัยไว้ดีกว่านะ)

    ทีนี้ก็อยู่กับคุณแล้วละครับว่าจะเลือกแบบไหน

    แต่อยากจะให้เกร็ดไว้เล็กๆ ว่า

    “main() เป็นฟังก์ชันพิเศษ ที่ไม่ว่าจะใช้ void main() หรือ int main() หรือ main()
    เมื่อทำการคอมไพล์ (ด้วย gcc, g++, Borland C++ 5.5 ,VC++ .NET 2008)
    แล้วจะให้ผลเหมือนกัน >> คือ ถ้าโปรแกรมสามารถทำงานได้จนจบโดยไม่ถูก
    Terminate ทุกโปรแกรมจะส่งค่าเป็น 0 กลับมา จะยกเว้นก็แต่โปรแกรมที่คอมไพล์ด้วย VC++ 6.0 เท่านั้น”
    ผมว่ามันน่าแปลกนะครับ


    หมายเหตุ กรณีของ VC++ .NET และ VC++ 6.0 ถ้าเราประกาศเป็น void main() จะไม่สามารถวาง return 0;
    ไว้ที่ตอนท้ายของฟังก์ชัน main() ได้


    ถ้าใครลองแล้วได้ผลเป็นแบบอื่นหรือชอบแบบไหน ก็ลองมาแชร์ข้อมูลกันดูนะครับ

    return 0;
    }

  4. #4
    Junior Member
    Join Date
    Aug 2009
    Posts
    1


    ที่ผมเรียนมาถ้าจำไม่ผิดมันเกี่ยวกับการ return ค่า ยังไงสักอย่างนี่หละครับ จำม้ายค่อยได้แล้วเหมือนกัน


  5. #5
    Junior Member
    Join Date
    Apr 2009
    Posts
    7


    ถ้าเอาเท่าที่ ผมเรียนมานะ ครับ มันเป็นเรื่องของการ รับค่า ส่งค่าของฟังก์ชั่นอ่ะ ครับ

    โดยมีหลักการว่า type Func (type variable)

    จะเห็นว่ามีส่วนที่เป็น type อยู่ 2 ต่ำแหน่ง คือ ตำแหน่ง ด้านหน้า จะเป็นการส่งค่าของฟังก์ชั่น โดยฟังก์ชั่น นั้น จะสามารถส่งค่าได้ค่าเดียวเท่านั้น


    ส่วนตัวด้านในวงเล็บนั้นหมายถึงการรับค่าของฟังก์ชั่นอ่ะครับ

    main ก็เป็นฟังก์ชั่น ฟังก์ชั่นหนึ่งนะครับ มันเป็นฟังก์ชั่นหลัก ที่จำเป็นต้องมีอ่ะครับ

    ยังไงก็ลองศึกษาเพิ่มเติม ตามหนังสือเอานะครับ

    ผมก็กำลังศึกษาอยู่เช่นกัน ครับ มีอะไร ก็แชร์ ความรู้กัน แล้วกันครับ

  6. #6
    Junior Member
    Join Date
    May 2009
    Posts
    18


    **Hidden Content: To see this hidden content your post count must be 2 or greater.**

  7. #7
    Junior Member
    Join Date
    Sep 2009
    Location
    bangkok
    Posts
    1


    เรียนมาตั้งนานพึงจะเข้าใจมากกว่าเดิม ก็วันนี้

    ขอบคุณมากครับ

  8. #8


    อ่านๆแล้ว ท่าทางน่าสนุก มาคุยกันมั่งดีกว่า
    แต่..........ก็อีกนั้นแหละ มือใหม่จะใช้ void ก็ไม่มีใครว่า มันก็จะถูกปล่อยค่าreturn มันก็จะถูกปล่อยตามมีตามเกิดแหละครับ (หรือสำหรับcompilerบางตัวอาจจะบังคับเป็น 0 ให้)

    แต่เป็นสักหน่อยแล้ว อยากจะขอนะครับว่า int main() นะครับ บางบอร์ดสอบC/C++ตามเมืองนอกเขาถือกันนะครับ
    ถ้าใช้ void main() อาจจะโดนหาว่า noob
    [/b]
    อย่าทำ เพราะกลัวคนอื่นหาว่า noob ครับ แต่จงหาเหตุผลประกอบการทำ
    โพสท์ไว้ว่า การที่โปรแกรมใดๆ เมื่อทำงานเสร็จแล้วก็ควรส่งค่า Return เป็น 0 เพื่อบอกว่าโปรแกรม
    จบการทำงานอย่างสมบูรณ์ เป็นหลักการที่ยอมรับกันทั่วไป ผมก็เห็นด้วยว่าเป็นเรื่องที่ดี

    แต่ก็มีบางคนแย้งว่า แล้วเจ้า OS มันทำอะไรบ้างกับ รีเทิร์นศูนย์ หรือไม่ศูนย์ (ซึ่งผมเองก็ไม่ค่อยเห็น
    มีการทำอะไร นอกจากจะมีไดอะล็อกถามว่าจะให้ส่ง Report ไปให้ไมโครซอฟท์ช่วยตรวจสอบให้หรือปล่าว?
    ในบางครั้งเท่านั้น) [/b]
    มันไม่ส่ง report ไปให้ microsoft หรอกครับ '' เพียงแต่มันมีวิธีเรียกเพื่อดูค่าได้ว่า โปรแกรมนั้นๆ ถูกปิดไปแบบไหนโดยการใช้ API อีกทอดนึง ยกตัวอย่างเช่น ใน Windows API จะมี API ที่่่ชื่อว่า GetExitCodeProcess เพื่อใช้ในการ Get ค่าของ ExitCode ของ Process นั้นๆ (อ่านเพิ่มเติมได้ที่ http://msdn.microsoft.com/en-us/library/ms...8VS.85%29.aspx)
    ดังนั้นจึงควรมีการ Return ค่าเอาไว้ด้วย (แต่ถ้าไม่คิดอะไรมากก็ void ไปนั่นแหละ) เพื่อที่เราจะได้สามารถตรวจสอบได้ว่า Program หรือ Process ของเราทำงาน แล้วจบ ได้อย่างถูกต้องหรือไม่
    ที่ผมเรียนมาถ้าจำไม่ผิดมันเกี่ยวกับการ return ค่า ยังไงสักอย่างนี่หละครับ จำม้ายค่อยได้แล้วเหมือนกัน[/b]
    Return Exit Code ครับ
    เรียนมาตั้งนานพึงจะเข้าใจมากกว่าเดิม ก็วันนี้

    ขอบคุณมากครับ[/b]
    โปรดระวัง บอร์ดนี้ไม่สนับสนุนการพิมพ์ขอบคุณ

  9. #9
    Junior Member
    Join Date
    Sep 2009
    Location
    Bangkok
    Posts
    5


    ก็พอมีความรู้บ้างเกี่ยวกับการเขียนภาษาพวกนี้นะครับ ก็อยากจะอธืบายตามความรู้ของผมว่า

    int main() , void main , int main( int xx .char cc) , void(int yy,char* cc)

    การประกาศเหล่านี้ เป็นการประกาศส่วนหัวของฟังก์ชัน ในโปรแกรม โดยที่ผมเข้าใจ คือ ส่วนแรกสุดนั้น เป็นการประกาศ การ return ค่าของ ฟังก์ชั่นนั้นๆ เช่น ประกาศ

    void main() เป็นการประกาศฟังก์ชั่นที่ไม่มีการ return ค่านั่นเอง คือ return ค่าชนิดว่างเปล่า [void]

    int main() เป็นการประกาศฟังก์ชั่นที่มีการ return ค่า โดย ให้ return ค่ากลับไปเป็น ชนิด int เช่น ส่วนใหญ่ที่เราทำก็คือ return 0;
    คือจบโปรแกรมแล้ว ฟังก์ชั่นนี้ return ค่า 0

    ส่วนพวกที่อยู่ใน วงเล็บนั้นเป็นค่าของ argument ที่เรา จะ pass เข้าไปในฟังก์ชั่นนั้นๆ เช่น

    int main( int xx .char cc) <<< ฟังก์ชั่นนี้จะ return เป็นชนิด int และ รับค่าที่pass เข้ามาเป็นชนิด int และ char
    โดยค่าที่รับเข้ามาจะถูกเก็บไว้ ตัวแปรที่ประกาศไว้คือ xx และ cc แล้วนำค่าที่รับไปใช้ในโปรแกรม ซึ่งนำไปใช้อย่างไรนั้นก็แล้วแต่เรา จะ เขียนโปรแกรมในส่วน body นั่นเองครับ

    อาจจะพอช่วยได้บ้างนะ
    ผิดพลาดอย่างไรก็ขออภัยด้วยครับ

  10. #10
    Junior Member
    Join Date
    Jun 2009
    Posts
    11


    ตามความคิดของผมน่ะ เนื่องจาก ภาษา ซี และ ซีบวกบวก
    บังคับไว้แล้วว่าต้องมีการ รีเทินร์ค่า เพื่อตรวจสอบการทำงาน
    ซึ่งปกติแล้วจะส่งคืน ค่า 0 หรือ EXIT_SUCCESS ถ้าโปรแกรม
    ทำงานจบ ซึ่งก็รวมไปถึงการประกาศ void หน้า main ที่จริงๆแล้ว
    ก็มีการแอบส่งค่าออกไปเหมือนกัน ซึ่งถ้าเกิด ดวงแตก สิ่งที่รีเทินร์
    ออกไปทำให้ OS เข้าใจผิด ว่าโปรแกรมทำงานผิดพลาดล่ะ

    คิดดูว่าจะเกิดอะไรขึ้น ดีบักตาเหลือก เลย

    ผมมี ลิงค์ดีๆ เกี่ยวกับเรื่องนี้ รออ่านดูน่ะครับ
    แปลให้ไม่ไหว เพราะ ภาษา ตังเองก็ไม่เก่งมาก อ่านเข้าใจ เพราะดูโค๊ด

    http://users.aber.ac.uk/auj/voidmain.shtml

Page 1 of 3 123 LastLast

Similar Threads

  1. แนะนำ การเขียน dictionary ทีคับ
    By armcstu in forum C/C++,C#,VC++,MFC,Win32
    Replies: 3
    Last Post: 05-10-2007, 09:22 AM

Members who have read this thread : 0

Actions : (View-Readers)

There are no names to display.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •