Monthly Archives: กุมภาพันธ์ 2008

ชนิดข้อมูลในภาษา C# (ตอนจบ)

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

ชนิดข้อมูลในภาษา C# (ตอนจบ)

ผู้เขียน : ลาภลอย วานิชอังกูร (laploy.com) 

อ่านเรื่องซับซ้อนก้าวหน้ากันมามากแล้ว วันนี้มาดูเรื่องพื้นฐานใกล้ๆ ตัวที่ต้องพบเจอกันทุกวันบ้าง ในบทความชุดนี้จะนำเสนอเรื่องของหน่วยความจำ การอ้างแอดเดรส และชนิดข้อมูลในภาษา C# กันหน่อย เพราะเป็นเรื่องสำคัญในการเขียนโปรแกรมจัดการข้อมูลและโครงสร้างข้อมูลทุกแบบ บทความนี้มีสามตอน นี้คือตอนที่สามซึ่งเป็นตอนจบ

 

อีกไม่กี่วันผู้เขียนก็ต้องเข้ารับตำแหน่งในงานใหม่ ทำให้ต้องเดินทาง พบปะผู้คน และเรียนรู้สิ่งใหม่ๆ อีกมาก อาจทำให้ไม่มีเวลาอัพบล็อกไปสักพัก  ดังนั้นวันนี้จึงหาเวลามาบล็อกตอนจบของซีรีส์เรื่อง "ชนิดข้อมูลในภาษา C#" ตอนสุดท้ายกันเสียที

 

การอ้างหน่วยความจำ
การอ้างหน่วยความจำหรือ memory addressing หมายถึงการระบุตำแหน่งของหน่วยความจำ (แรมในคอมพิวเตอร์) เพื่อบอกให้ตัวแปลภาษารู้ว่าเราจะเอาอะไรไปเก็บที่ไหน เนื่องจากภาษา C# มีลักษณะ managed code ทำให้ปรกติเราจะไม่เขียนอ่านหน่วยความจำโดยตรง แต่จะให้ CLR และระบบปฏิบัติการจัดการให้โดยอัตโนมัติ ที่ผู้เขียนหยิบยกเรื่องนี้มาพูด เพราะการการรู้ว่าการอ้างหน่วยความจำเป็นอย่างไรก็เป็นสิ่งที่น่าสนใจและจะช่วยให้เห็นภาพรวมของโครงสร้างข้อมูลได้ดี

ลองจินตนาการว่าหน่วยความจำคือแถวของกล่องที่แบ่งเป็นกลุ่มๆ ละแปดใบ วางเรียงกันไม่มีที่สิ้นสุด กล่องแต่ละใบเก็บได้เฉพาะเลขศูนย์หรือหนึ่ง มีหมายเลขที่ไม่ซ้ำกันกำกับกล่องใบแรกของแต่ละกลุ่มไว้ (กลุ่มหนึ่งมีแปดใบคือที่เก็บข้อมูลแปดบิตหรือหนึ่งไบต์) ตัวเลขเหล่านี้คือตัวเลขสำหรับอ้างตำแหน่งของหน่วยความจำ (memory address)

 


รูปที่เห็นข้างบนเป็นตัวอย่างหน่วยความจำที่หนึ่งตำแหน่งเก็บข้อมูลได้หนึ่งไบต์ หรือแปดบิต เป็นเรื่องสำคัญมาก ที่คุณจะต้องรำลึกถึงสิ่งนี้ไว้ตลอดเวลา เมื่อเรียนเรื่องโครงสร้างข้อมูล มิฉะนั้นคุณจะสับสนได้โดยง่าย ให้นึกเสียว่าหน่วยความจำหนึ่งตำแหน่งคือกล่องแปดกล่อง แต่ละกล่องเก็บข้อมูลได้แปดชิ้น

 

เราอ้างถึงตำแหน่งของกล่องเหล่านี้ได้ทั้งโดยตรงและโดยอ้อม ยกตัวอย่างเช่น เราบอกคอมพิวเตอร์ว่าเราต้องการจะคัดลอกข้อมูลจากหน่วยความจำที่ตำแหน่ง 423 นั่นคือเราการอ้างถึงกล่องที่มีเลขประจำตำแหน่ง 423 คอมพิวเตอร์ก็จะไปที่ตำแหน่ง 423 แล้วคัดลอกข้อมูลจากกล่องนั้น แล้วไล่ไปอีกเจ็ดกล่อง กล่องเจ็ดกล่องที่อยู่ถัดจากตำแหน่ง 423 ไม่มีหมายเลขประจำตำแหน่ง นั่นคือกล่องเหล่านี้ใช้หมายเลขประจำตำแหน่งร่วมกับกล่องที่ 423

 

ตำแหน่งจริงของหน่วยความจำ
ผู้เขียนระบุตัวเลขที่ใช้อ้างตำแหน่งหน่วยความจำที่กล่าวถึงในบทนี้โดยใช้ตัวเลขฐานสิบมาตลอด เช่น กล่องใบที่ 423 แต่ในความเป็นจริงแล้ว การอ้างตำแหน่งหน่วยความจำคอมพิวเตอร์เราจะใช้เลขฐานสิบหก (Hexadecimal) เป็นตัวเลขที่มีขนาด 32 หรือ 64 บิต ขึ้นอยู่กับระบบปฏิบัติการที่ใช้ (เช่นใน Windows XP จะเป็น 32 บิต แต่ใน Windows XP64 จะเป็น 64 บิต)

เลขฐานสิบหกก็คล้ายคลึงกับเลขฐานสองและฐานสิบ ในแง่ที่ว่ามันถูกใช้เพื่อการนับ และการกระทำทางคณิตศาสตร์ได้ ตัวเลขที่ใช้ในระบบเลขฐานสิบหกมีจำนวนสิบหกตัว คือจาก 0 ถึง 9 และ A ถึง F ซึ่งใช้แทนที่ 10 ถึง 15 ยกตัวอย่างเช่น ถ้าตำแหน่งของหน่วยความในเลขฐานสิบเป็น 258,425,506 จะเขียนเป็นเลขฐานสิบหกได้ว่า 0x0F6742A2

 

 

ตารางเปรียบเทียบระหว่างเลขฐานสิบ สิบหก และเลขฐานสอง

 

สาเหตุที่เราใช้เลขฐานสิบหกเพราะต้องการเขียนเลขฐานสองแบบย่อ เพื่อให้เราเองอ่านและเขียนได้ง่ายขึ้น และที่สำคัญคือตัวแปลภาษา C# ไม่สนับสนุนการป้อนเลขฐานสอง เมื่อต้องการทำงานกับเลขฐานสองหรือทำงานในระดับบิต เราจึงจำเป็นต้องใช้เลขฐานสิบหกแทน ยกตัวอย่างเช่นเราต้องการอ้างถึงตำแหน่งหน่วยความจำที่ 0000 1000 0001 0010 เขียนเป็นเลขฐานสองแบบนี้ยาวเกินไปและเขียนผิดได้ง่าย เราจึงเขียนเป็นเลขฐานสิบหกแทนได้ว่า 0x0812 ซึ่งมีความหมายดังนี้

    • 0x คือหมายเหตุในภาษา C# บอกให้รู้ว่าจำนวนต่อไปนี้เป็นเลขฐานสิบหก
    • 0000 ในเลขฐานสองเท่ากับ 0 ในเลขฐานสิบหก
    • 1000 ในเลขฐานสองเท่ากับ 8 ในเลขฐานสิบหก
    • 0001 ในเลขฐานสองเท่ากับ 1 ในเลขฐานสิบหก
    • 0010 ในเลขฐานสองเท่ากับ 2 ในเลขฐานสิบหก

 

ชนิดข้อมูลกับการอ้างหน่วยความจำ
ในส่วนต้นๆ ของบทนี้คุณได้เรียนรู้ว่า เราสามารถจองหน่วยความจำได้โดยการระบุชนิดข้อมูล ชนิดข้อมูลบางประเภทจะจองเนื้อที่ในหน่วยความจำมากกว่าหนึ่งไบต์ ยกตัวอย่างเช่นข้อมูลชนิด short ในภาษา C# ที่จะจองเนื้อที่สองไบต์ในหน่วยความจำ (คือ 16 บิต)

เนื่องจากพื้นที่ในหน่วยความจำแต่ละไบต์ มีหมายเลขระบุตำแหน่งของตนเอง คุณจึงอาจจะคิดว่า ถ้าเช่นนั้นแบบข้อมูลชนิด short ก็คงจะมีหมายเลขระบุตำแหน่งสองชุด เพราะมันใช้เนื้อที่สองไบต์ ผิดครับ แม้จะเป็นข้อมูลที่มีหลายไบต์ คอมพิวเตอร์คงใช้หมายเลขเดียว คือจะระบุตำแหน่งเพียงไบต์แรกเท่านั้น

ยกตัวอย่าเช่นคุณจองเนื้อที่ในหน่วยความจำเพื่อเก็บข้อมูลชนิด short และคอมพิวเตอร์ได้สงวนพื้นที่ไว้สองตำแหน่งคือ 400 และ 401 คอมพิวเตอร์จะอ้างถึงตำแหน่ง 400 เพียงตำแหน่งเดียวเท่านั้น แต่คอมพิวเตอร์จะรู้ว่าทั้งตำแหน่ง 400 และตำแหน่ง 401 เป็นส่วนหนึ่งของข้อมูลเดียวกัน เพราะมันได้จองเนื้อที่ไว้ให้สองไบต์แล้วตั้งแต่แรก ดังนั้นถ้าคุณสั่งให้คัดลอกข้อมูลนี้ มันจะคัดลอกข้อมูลทั้งในตำแหน่ง 400 และในตำแหน่ง 401 มาให้โดยอัตโนมัติ

 

คำถามท้ายบท
โปรดตอบคำถามต่อไปนี้ ถ้าข้อไหนตอบไม่ได้ให้อ่านทบทวนเนื้อหาในบทความชุดนี้อีกที ตอบได้ครบทุกข้อเมื่อไหร่จึงจะถึอว่าผ่าน
1.    อะไรคือชนิดข้อมูล
2.    ชนิดข้อมูลแบบใดเหมาะสำหรับเก็บจำนวนเต็ม
3.    จงอธิบายวิธีอ้างตำแหน่งข้อมูล เมื่ออ้างถึงชนิดข้อมูลที่โตกว่าหนึ่งไบต์
4.    ข้อมูลชนิด float ต่างจาก double อย่างไร
5.    ความเที่ยงตรง (ความละเอียดแม่นยำ) คืออะไร
6.    จงอธิบายวิธีการการจัดเรียงหน่วยความจำในคอมพิวเตอร์
7.    อะไรคือระบบเลขฐาน
8.    เพราะเหตุใดคอมพิวเตอร์จึงใช้ระบบเลขฐานสอง
9.    เพราะเหตุใดเมื่อเราจองเนื้อที่ในหน่วยความจำ เราจึงไม่จำเป็นต้องกำหนดจำนวนไบต์
10.    จงอธิบายว่าตัวเลขแบบแสดงเครื่องหมาย และแบบไม่แสดงเครื่องหมาย ถูกเก็บในหน่วยความจำแตกต่างกันอย่างไร

 

เกี่ยวกับผู้เขียน
ลาภลอย วานิชอังกูร
ทำงานด้านคอมพิวเตอร์มานานกว่ายี่สิบปี สามารถเขียนโปรแกรมได้คล่องหลายภาษา เคยทำงานด้านคอมพิวเตอร์ที่ประเทศสหรัฐอเมริกา ประเทศเยอรมัน และประเทศสวิส เคยเป็นครูสอนวิชาคอมพิวเตอร์ เคยเป็นบรรณาธิการนิตยสารคอมพิวเตอร์ มีผลงานบทความ และตำราคอมพิวเตอร์จำนวนมาก ปัจจุบันทำหน้าที่เป็นผู้ให้คำปรึกษาด้านฮาร์ดแวร์และซอฟท์แวร์แก่บริษัทขนาดใหญ่หลายแห่ง ท่านสามารถติดต่อกับผู้เขียนได้ที่ laploy.com

Advertisements

Rich Internet Application (แบบไทยๆ)

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

 

Rich Internet Application (แบบไทยๆ)

ที่ผมกำลังพูดถึงอยู่นี้คือการพัฒนาหน้าเว็บที่ไม่ธรรมดา มันคือการสร้างโปรแกรมที่ทำงานในเว็บเบราวเซอร์ ที่ให้ความรู้สึกใกล้เคียงกับโปรแกรมในเดกส์ทอป ที่ฝรั่งเรียกว่า RIA เป็นโปรแกรมประยุกต์ใช้งานในอินเตอร์เน็ต ที่มีส่วนติดต่อกับผู้ใช้แบบหรูหรา อลังการงานสร้าง (Rich Internet Application)

 

รายนามแพทย์ศิริราช กดที่นี่เพื่อทดลองใช้งานแบบออนไลน์

 

ถ้าเป็นโปรแกรมที่เลียนแบบการทำงานของระบบปฏิบัติการก็เรียกว่า Web OS ทั้งๆ ที่ความจริงมันเพียงแต่เลียนแบบส่วน shell หรือส่วน GUI (Graphical User Interface ส่วนปฏิสัมพันธ์กับผู้ใช้แบบภาพ) เท่านั้น ในเมืองฝรั่งมีการทำกันเป็นล่ำเป็นสัน แต่ในเมืองไทยยังไม่ค่อยเห็นมีใครทำกัน

เนื่องจากขณะนี้ผมกำลังทำงานชิ้นหนึ่งให้แก่ รพ. ศิริราช เป็นงานด้านฐานข้อมูล เป็นโปรแกรมที่จะต้องทำงานได้ทั้งจากแผ่นซีดี และในเว็บไซต์ ผมจึงตัดสินใจว่าไหนๆ จะต้องทำเว็บแอพลิเกชันกันแล้วก็ควรทำให้มีลักษณะเป็น RIA และกึ่งๆ Web OS ไปเสียเลย ดีกว่ามาทำเป็น text mode ที่ดูล้าสมัย เพื่อเป็นแบบอย่างให้อนุชนนักพัฒนาเว็บแอพลิเกชันรุ่นน้อง (และหลาน) ได้เห็นว่าทำแบบนี้บ้างก็ดีเหมือนกัน ไม่ถึงกับยากเย็นอะไรมากนัก

ข้อมูลจำเพาะ

  • ชื่องาน : รายนามแพทย์ศิริราช
  • ขอบเขตของงาน : แสดงรายนาม (และพระนาม) ของแพทย์ นักเรียนแพทย์ พยาบาล ครู ฯลฯ ทั้งหมดตั้งแต่ก่อตั้งจนถึงปัจจุบัน ค้นหาข้อมูลได้ ทำงานได้ทั้งจากในแผ่นซีดี (ไม่ต้องติดตั้ง) และเว็บด้วย
  • เทคโนโลยีที่ใช้ : Flex 2.0 ActionScript 3.0 และ Flash 9
  • Database : flat text file
  • ผู้พัฒนา : ลาภลอย วานิชอังกูร (laploy.com)
  • ทดลองใช้งาน : http://www.laploy.com/demo

โปรดทราบว่าเทคโนโลยีนี้ไม่ได้เหมาะกับทุกงาน (ยกตัวอย่างเช่นบางงานใช้ C#+ASP.NET+SQL+AJAX อาจจะเวิร์คกว่า) สิ่งสำคัญคือการเลือกเทคโนโลยีและเครื่องมือให้เหมาะสมกับงาน นักพัฒนาซอฟต์แวร์จึงต้องเรียนรู้เทคโนโลยีไว้หลายๆ ชนิด เหนื่อยนะครับ แต่ช่วยไม่ได้ ก็อยากเกิดมาเป็นกรรมกรซอฟต์แวร์ทำไมแหละ

ชนิดข้อมูลในภาษา C# (ตอน 2)

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

ชนิดข้อมูลในภาษา C# (ตอน 2)

ผู้เขียน : ลาภลอย วานิชอังกูร (laploy.com) 

อ่านเรื่องซับซ้อนก้าวหน้ากันมามากแล้ว วันนี้มาดูเรื่องพื้นฐานใกล้ๆ ตัวที่ต้องพบเจอกันทุกวันบ้าง ในบทความชุดนี้จะนำเสนอเรื่องของหน่วยความจำ การอ้างแอดเดรส และชนิดข้อมูลในภาษา C# กันหน่อย เพราะเป็นเรื่องสำคัญในการเขียนโปรแกรมจัดการข้อมูลและโครงสร้างข้อมูลทุกแบบ

 

กลุ่มชนิดข้อมูล

เรากำหนดขนาดของหน่วยความจำที่ต้องการจองได้โดยเลือกกลุ่มชนิดของข้อมูล จากนั้นก็ต้องเลือกชนิดของข้อมูลที่อยู่ในกลุ่มนั้น ว่าชนิดใดจึงเหมาะกับข้อมูลที่จะจัดเก็บ

กลุ่มชนิดข้อมูลมีสี่กลุ่มดังนี้

  • จำนวนเต็ม (integer) : ใช้เก็บเลขจำนวนเต็ม และเลขแบบมีเครื่องหมาย เหมาะสำหรับเก็บจำนวนที่ไม่สนใจเศษ เช่นจำนวนเงินในกระเป๋าสตางค์ของคุณ
  • เลขทศนิยม (Floating-point) : ใช้เก็บเลขจำนวนจริง (จำนวนเศษส่วน) เหมาะสำหรับเก็บเลขในบัญชีธนาคารที่มีเศษสตางค์ (คือเศษส่วนของบาท) และสามารถนำมาบวกกันให้เป็นจำนวนบาทได้อย่างรวดเร็ว
  • อักขระ (Character) : ใช้เก็บตัวอักษร เหมาะสำหรับเก็บชื่อของสิ่งต่างๆ
  • บูลีน (Boolean) : ใช้เก็บค่าจริง หรือเท็จ (true/false) เหมาะสำหรับเก็บคำตอบของคำถามว่าใช่หรือไม่ใช่ จริงหรือเท็จ

 

จำนวนเต็ม

กลุ่มข้อมูลชนิดนี้ใช้จองพื้นที่ในหน่วยความจำเพื่อเก็บเลขจำนวนเต็ม มีทั้งหมดเก้าแบบเช่น byte, short, int, long และอื่นๆ ดังแสดงในตารางนี้

 

 

ข้อมูลชนิดจำนวนเต็มสามารถใช้เก็บเลขที่แสดงเครื่องหมาย คือเลขบวกและเลขลบ เช่น +10 และ –5 ถ้าไม่ระบุเครื่องหมายตามปรกติแล้วจะถือว่าเป็นเลขบวก ดังนั้นเครื่องหมายบวกจึงสามารถละไว้ในฐานที่เข้าใจ เลขจำนวนเต็มเมื่อเก็บแบบแสดงเครื่องหมายจะเรียกว่า signed number เมื่อเก็บแบบไม่สนแสดงเครื่องหมายจะเรียกว่า unsigned number

การเก็บแบบแสดงเครื่องหมายและแสดงมีเครื่องหมายแตกต่างกันอย่างไร คำตอบคือถ้าเก็บแบบแสดงเครื่องหมาย ตัวเครื่องหมายเองจะใช้ที่เก็บข้อมูลหนึ่งบิต หากเก็บแบบไม่แสดงเครื่องหมายก็สามารถใช้บิตนั้นมาเก็บจำนวนตัวเลขได้ การเก็บแบบไม่แสดงเครื่องหมายจึงเก็บตัวเลขได้มากกว่า

ยกตัวอย่างเช่นข้อมูลแบบ byte ใช้เนื้อที่ในหน่วยความจำแปดบิต หากเก็บเลขจำนวนเต็มแบบไม่แสดงเครื่องหมาย จะก็จะเก็บเลขได้จาก 0 ถึง 255 หากเป็นเลขจำนวนเต็มแบบแสดงเครื่องหมาย หรือ sbyte ก็จะเก็บเลขได้น้อยกว่าครึ่งหนึ่ง คือเก็บจำนวนได้จาก –128 ถึง +127 (ดูในตาราง) ภาษา C# สนับสนุนเลขจำนวนเต็มทั้งแบบแสดงและไม่แสดงเครื่องหมาย เลขที่ไม่แสดงเครื่องหมายจะถูกเหมาว่าเป็นบวก เครื่องหมายลบจะไม่ถูกเก็บไว้ในหน่วยความจำ และจำนวนศูนย์จะถูกถือว่าเป็นจำนวนลบ

 

ข้อมูลชนิด byte

ชนิดข้อมูลแบบ byte เป็นชนิดที่มีขนาดเล็กที่สุดในกลุ่มข้อมูลจำนวนเต็ม การประกาศจองหน่วยความจำชนิดนี้ทำได้โดยใช้คีย์เวิร์ด byte ปรกติแล้วโปรแกรมเมอร์นิยมใช้ byte ในการรับ-ส่งข้อมูล หรือแฟ้มข้อมูลภายในเครือข่าย นอกจากนั้นยังนิยมใช้เมื่อต้องการทำงานกับข้อมูลในระดับบิต (binary operation) เพราะการกระทำลักษณะนี้ไม่สามารถทำโดยใช้แบบข้อมูลชนิดอื่นๆ ได้

 

byte x = 10, y = 20;
 

โค้ดที่เห็นข้างบนทำหน้าที่ประกาศตัวแปรสองตัวชื่อ x และ y โดยมีชนิดข้อมูลเป็น byte ทั้งคู่

 

** จงใช้ชนิดข้อมูลแบบ byte เมื่อใดก็ตามที่คุณต้องการรับ-ส่งข้อมูลในเครือข่าย หรือเมื่อต้องการทำงานกับข้อมูลในระดับบิต **

 

อักขระ (Characters)

ชนิดข้อมูลแบบอักขระเป็นการใช้ตัวเลขแทนค่าชุดตัวอักษร อันประกอบด้วยอักษรต่างๆ เครื่องหมาย และสัญลักษณ์ที่ใช้ในภาษาต่างๆ ยกตัวอย่างเช่นตัวอักษร A (เอตัวใหญ่) จะถูกเก็บไว้ในหน่วยความจำเป็นตัวเลข 65 ถ้าเราจองหน่วยความจำไว้โดยใช้คีย์เวิร์ด char คอมพิวเตอร์จะรู้ว่าจะต้องปฏิบัติกับข้อมูลนี้ว่าเป็นตัว A ไม่ใช่ตัวเลข 65

ตารางรหัสอักขระจะเป็นตัวกำหนดว่าตัวเลขอะไรใช้แทนตัวอักษรใด มีตารางรหัสอักขระที่นิยมใช้มากสองแบบคือรหัสแอสกี (ASCII) และรหัสยูนิโค้ด (Unicode) แอสกีเป็นตารางรหัสที่เป็นบรรพบุรุษของยูนิโค้ด แอสกีใช้หน่วยความจำหนึ่งไบต์ เก็บรหัสแทนอักขระต่างๆ ได้ 256 ตัว อย่างไรก็ดี เมื่อมีการใช้คอมพิวเตอร์กับภาษาที่ไม่ใช่ภาษาอังกฤษ เช่นภาษาจีน ซึ่งเป็นภาษาที่มีอักขระมากกว่า 256 ตัว จึงใช้กับรหัสแอสกีไม่ได้ รหัสยูนิโค้ดได้ถูกพัฒนามาเพื่อแก้ปัญหานี้ รหัสยูนิโค้ดจะใช้เนื้อที่ในหน่วยความจำสองไบต์

 

** จงใช้ชนิดข้อมูลแบบ char เมื่อใดก็ตามที่คุณต้องการเก็บตัวอักษรในหน่วยความจำ  **

 

ข้อมูลชนิด short

ข้อมูลชนิดนี้เหมาะสำหรับเขียนโปรแกรมไว้ทำงานในคอมพิวเตอร์แบบ 16 บิต อย่างไรก็ดีปัจจุบันนี้ไม่ค่อยมีคอมพิวเตอร์ขนาด 16 บิตแล้ว เพราะมันถูกแทนที่ด้วยคอมพิวเตอร์ขนาด 32 บิต และ 64 บิต ดังนั้นชนิดข้อมูลแบบ short จำไม่เป็นที่นิยมใช้อีกต่อไป

 

** จงใช้ชนิดข้อมูลแบบ short เมื่อคุณต้องการเขียนโปรแกรมสำหรับคอมพิวเตอร์รุ่นเก่ามากๆ  **

 

ข้อมูลชนิด int

ชนิดข้อมูลแบบ int เป็นชนิดข้อมูลที่นิยมใช้มากที่สุดในกลุ่มชนิดข้อมูลจำนวนเต็มด้วยเหตุผลหลายประการ

 

** จงใช้ชนิดข้อมูลแบบ int เมื่อ

  • ใช้เป็นตัวแปรสำหรับควบคุมการทำงานซ้ำ (loop)
  • ใช้เป็นดรรชนีของอาร์เรย์ (array index)
  • ใช้ในการกระทำทางคณิตศาสตร์ของเลขจำนวนเต็ม **

 

ข้อมูลชนิด long

ชนิดข้อมูลแบบ long เหมาะสำหรับใช้เมื่อต้องการทำงานกับตัวเลขที่มีขนาดใหญ่เกินกว่าจะใช้ชนิดข้อมูลแบบ int

 

** จงใช้ชนิดข้อมูลแบบ long เมื่อต้องการเก็บตัวเลขจำนวนหลายๆ หลัก เช่นมูลค่าทรัพย์สินของบิล เกสต์ ของนายกฯ ทักษิณ หรือของตัวคุณเอง **

 

จำนวนทศนิยม (Floating-Point)

ชนิดข้อมูลในนี้ใช้เพื่อเก็บเลขจำนวนจริง (real number) จำนวนจริงคือจำนวนที่มีทศนิยม ชนิดข้อมูลนี้มีสองแบบคือ float และ doubleโดย float ใช้สำหรับเก็บจำนวนที่มีความเที่ยงตรงตามปรกติ ส่วน double ใช้สำหรับจำนวนที่ต้องการความเที่ยงตรงเป็นสองเท่า ความเที่ยงตรง (precision) ในที่นี้หมายถึงจำนวนหลักของตัวเลขหลังจุดทศนิยม ถ้ายิ่งมีหลายหลัก ตัวเลขก็จะยิ่งถูกต้องเที่ยงตรงมากขึ้นตามที่เห็นในตารางข้างล่าง

 

 

สาเหตุที่ใช้คำว่า floating-point (จุดลอย) เกิดจากวิธีที่มันเก็บตัวเลขทศนิยมในหน่วยความจำ ซึ่งใช้วิธีเก็บตัวเลขทั้งหมด (จำนวนทั้งหน้าและหลังจุดทศนิยม) เป็นจำนวนเต็ม แล้วตำแหน่งของจุดทศนิยมไว้ต่างหาก วิธีเก็บเช่นนี้ทำให้ดูเหมือนว่าจุดทศนิยมลอยตัว (float) อยู่เหนือตัวเลข ยกตัวอย่างเช่นเลข 43.23 จะถูกเก็บเป็น 4323 (เก็บเป็นจำนวนเต็มไม่มีทศนิยม) การกำหนดจุดทศนิยมทำได้โดยการอ้างถึงหลักของตัวเลขที่จะประจุดทศนิยม ซึ่งในกรณีนี้คือหน้าหลักที่สอง

 

โครงสร้างของข้อมูลแบบ floating-point มีสามส่วนคือ sing bit, exponent และ mantissa

 

ข้อมูลชนิด float

ชนิดข้อมูลแบบ float เหมาะสำหรับเก็บเลขจำนวนจริงที่ต้องการความเที่ยงตรงแบบปรกติ อย่างเช่นจำนวนเงิน ความเที่ยงตรงแบบปรกติคือมีจำนวนเลขหลังจุดทศนิยมเจ็ดหลัก ยกตัวอย่างเช่นแบ่งเงินจำนวน 53.50 บาทให้คน 17 คนจะได้คนละ 3.147058823529 บาท ถ้าเก็บเป็นแบบ float ก็จะเหลือแค่ 3.1470588 ซึ่งไม่ได้เที่ยงตรงอย่างถึงที่สุด แต่ก็เพียงพอสำหรับจำนวนเงิน

 

** จงใช้ float เมื่อคุณต้องการตัวเลขแบบมีทศนิยมที่ต้องการความละเอียดขนาดจำนวนหลักหลังจุดทศนิยม 7 หลัก  **

 

ข้อมูลชนิด double

ชนิดข้อมูลแบบ double ใช้เก็บจำนวนมีทศนิยมซึ่งมีค่าสูงมากๆ หรือต่ำมากๆ ใช้พื้นในหน่วยความจำมากเป็นสองเท่าของ float

 

** จงใช้ double เมื่อต้องการเก็บตัวเลขที่มีจำนวนหลักหลังจุดทศนิยมมากกว่า 7 หลัก  **

 

ข้อมูลชนิด บูลีน

ชนิดข้อมูลแบบบูลีนใช้เก็บค่าจริง หรือเท็จ (true/false) เหมาะสำหรับเก็บคำตอบของคำถามว่าใช่หรือไม่ใช่ จริงหรือเท็จ จงใช้ชนิดข้อมูลแบบบูลีนเมื่อต้องการเก็บค่าที่เป็นไปได้เพียงแค่หนึ่งในสองอย่างเท่านั้น ชนิดข้อมูลแบบบูลีนในภาษา C# ใช้หน่วยความจำบิตเดียว

 

** ข้อควรระวังในการใช้ข้อมูลชนิดบูลีนคือในภาษา C++ เราสามารถแปลงข้อมูลชนิดบูลีนไปเป็นแบบจำนวนเต็มได้เลย คือ true ไปเป็น 1 และ false ไปเป็น 0 แต่ในภาษา C# ทำเช่นนั้นไม่ได้ เพราะภาษา C# เราจะแปลงข้อมูลชนิดบูลีนไปเป็นชนิดอื่นๆ ไม่ได้  **

 

int x = 123;
if (x)  
{
    printf_s("The value of x is nonzero.");
}
 

โค้ดข้างบนเป็นภาษา C++ ใน C# ต้องเขียนแบบข้างล่างแทน

 

int x = 123;
if (x != 0)   
{
    Console.Write("The value of x is nonzero.");
}

 

นอกจากชนิดข้อมูลที่ว่ามาทั้งหมดแล้ว C# ยังมีข้อมุลแบบ String และ Array ซึ่งมีรายละเอียดมาก สมควรนำเสนอแยกต่างหากออกไป นอกจากนั้น C# ยังมีชนิดข้อมูลแบบพิเศษอื่นๆ อีกหลายแบบเช่น struc, nullable และ delegate ที่จะนำเสนอในต่อต่อๆ ไปเช่นกัน

 

จบตอน 2 โปรดติดตามตอน 3

 

เกี่ยวกับผู้เขียน

 

ลาภลอย วานิชอังกูร ทำงานด้านคอมพิวเตอร์มานานกว่ายี่สิบปี สามารถเขียนโปรแกรมได้คล่องหลายภาษา เคยทำงานด้านคอมพิวเตอร์ที่ประเทศสหรัฐอเมริกา ประเทศเยอรมัน และประเทศสวิส เคยเป็นครูสอนวิชาคอมพิวเตอร์ เคยเป็นบรรณาธิการนิตยสารคอมพิวเตอร์ มีผลงานบทความ และตำราคอมพิวเตอร์จำนวนมาก ปัจจุบันทำหน้าที่เป็นผู้ให้คำปรึกษาด้านฮาร์ดแวร์และซอฟท์แวร์แก่บริษัทขนาดใหญ่หลายแห่ง ท่านสามารถติดต่อกับผู้เขียนได้ที่ laploy.com

ชนิดข้อมูลในภาษา C# (ตอน 1)

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

ชนิดข้อมูลในภาษา C# (ตอน 1)

ผู้เขียน : ลาภลอย วานิชอังกูร (laploy.com) 

อ่านเรื่องซับซ้อนก้าวหน้ากันมามากแล้ว วันนี้มาดูเรื่องพื้นฐานใกล้ๆ ตัวที่ต้องพบเจอกันทุกวันบ้าง ในบทความชุดนี้จะนำเสนอเรื่องของหน่วยความจำ การอ้างแอดเดรส และชนิดข้อมูลในภาษา C# กันหน่อย เพราะเป็นเรื่องสำคัญในการเขียนโปรแกรมจัดการข้อมูลและโครงสร้างข้อมูลทุกแบบ

 

หากเราพยายามค้นหาชื่อในรายชื่อหนึ่งล้านชื่อ เราต้องพยายามมากสุดกี่ครั้ง ถ้าตอบว่าหนึ่งล้านครั้งละก็ผิด ไม่ใกล้เคียงเลยด้วยซ้ำ อันที่จริงแล้วทำแค่ยี่สิบครั้งก็พอ แต่เราจะต้องจัดรายชื่อให้เป็นโครงสร้างที่ค้นหาได้ง่ายและต้องค้นโครงสร้างนี้ด้วยเทคนิคที่มีประสิทธิภาพ การค้นหาชื่อเป็นเพียงตัวอย่างหนึ่งที่การจัดโครงสร้างข้อมูลช่วยให้เราจัดการกับข้อมูลที่เก็บอยู่ในหน่วยความจำคอมพิวเตอร์ได้อย่างมีประสิทธิภาพ อย่างไรก็ดี การจะเข้าใจวิธีใช้งานโครงสร้างข้อมูลได้ คุณจำเป็นจะต้องเข้าใจการทำงานของหน่วยความจำคอมพิวเตอร์เสียก่อน ในบทความชุดนี้ผมจะพาคุณไปสำรวจหน่วยความจำ และดูว่าทำไมหน่วยความจำจึงเก็บไว้แต่เลขศูนย์และเลขหนึ่ง คุณจะได้เรียนเรื่องชนิดข้อมูลในภาษา C# และการเลือกใช้ชนิดข้อมูลที่ถูกต้องเหมาะสมเพื่อเขียนโปรแกรม

 

สำรวจหน่วยความจำ

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

หน่วยความจำแคชในซีพียู ใช้เก็บข้อมูลและคำสั่งที่ใช้บ่อยๆ หรือเพิ่งถูกใช้ไป หรือคาดว่าจะถูกเรียกใช้ในอนาคตอันใกล้ แคชจะถูกแบ่งเป็นส่วนๆ เรียกว่ารีจิสเตอร์ (Register) รีจิสเตอร์คือหน่วยความจำขนาดเล็กที่อยู่ภายใน ซีพียู (CPU Central Processing Unit หน่วยประมวลผลกลาง) ทำหน้าที่เก็บข้อมูลหรือคำสั่งเป็นการชั่วคราว

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

 

หน่วยความจำถาวรหมายถึงหน่วยความภายนอกอย่างเช่นฮาร์ดดิสก์ มันทำหน้าที่เก็บข้อมูลและคำสั่งเช่นกัน หน่วยความจำชนิดนี้เมื่อปิดคอมพิวเตอร์ข้อมูลจะไม่หายไปไหน

เป็นเรื่องปรกติที่ซอฟต์แวร์ระบบปฏิบัติการ (Operating System เช่น Windows และ Linux) จะนำหน่วยความจำถาวรบางส่วน มาทำเป็นหน่วยความจำเสมือน (Virtual memory) อันเป็นเทคนิคที่ระบบปฏิบัติการใช้ เพื่อเพิ่มความจุของหน่วยความจำหลัก ให้มากกว่าปริมาณของแรมที่มีอยู่ในเครื่อง การทำงานของมันเป็นดังนี้ เมื่อหน่วยความจำหลักถูกใช้ไปจนเกินความจุของแรม ระบบปฏิบัติการจะนำข้อมูลที่เกินนี้ไปเก็บไว้ที่ในฮาร์ดดิสก์ ครั้นเมื่อคอมพิวเตอร์ต้องการใช้ข้อมูลนั้น ระบบปฏิบัติการจะนำข้อมูลในฮาร์ดดิสก์ มาสลับที่กับข้อมูลในแรมส่วนที่ยังไม่จำเป็นต้องใช้ในตอนนั้น

 

<< บัสคือสายไฟเชื่อมต่อระหว่างซีพียู หน่วยความจำ และอุปกรณ์ I/O

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

 

 เรื่องของข้อมูลและหน่วยความจำ

ข้อมูลที่โปรแกรมของเราใช้จะถูกเก็บไว้ในหน่วยความจำ มันจะถูกยักย้ายถ่ายเทโดยเทคนิคโครงสร้างข้อมูลสารพัดชนิด ขึ้นอยู่กับลักษณะของโปรแกรมที่เราเขียน ต่อไปนี้เราจะมาดูเรื่องหน่วยความจำหลักหรือแรม ให้ละเอียดยิ่งขึ้น หลักจากนั้นจะดูกันว่าจะยักย้ายถ่ายเทข้อมูลโดยการใช้โครงสร้างข้อมูลได้อย่างไร

หน่วยความจำคือชุดของสวิตช์อิเลคทรอนิคที่เรียกว่า ทรานซิสเตอร์ (Transistor) ซึ่งอาจทำให้อยู่ในสภาวะเปิดหรือปิด สถานะของสวิตช์เหล่านี้จะไม่มีความหมายอะไร จนกว่าคุณจะกำหนดค่าให้มัน การกำหนดค่านี้ทำได้โดยใช้ระบบเลขฐานสอง

 

ระบบเลขฐานสองประกอบด้วยตัวเลขเพียงสองตัว คือศูนย์และหนึ่ง ตัวเลขหนึ่งหลักเรียกว่า บิต (Bit) หากสวิตช์อยู่ในสภาพปิดถือเป็นการแสดงเลขศูนย์ หากสวิตช์อยู่ในสภาพเปิดถือเป็นการแสดงเลขหนึ่ง ดังนั้นทรานซิสเตอร์หนึ่งตัวจะสามารถแสดงตัวเลขได้หนึ่งบิต

อย่างไรก็ดี จำนวนหนึ่งบิตไม่สามารถเก็บอะไรได้มากนัก จึงต้องใช้สวิตช์หลายตัวๆ มารวมกัน เช่นสวิตช์สองตัว จะได้สองบิต ซึ่งทำให้เก็บค่าที่แตกต่างกันได้สี่ค่า ดังแสดงในตาราง 1-1 คือใช้แทนเลขได้จาก 0 ถึง 3 ข้อให้สังเกตว่า ตัวเลขต่ำสุดในระบบเลขฐานสอง คือเลขศูนย์ ไม่ใช่เลขหนึ่ง หาเราใช้หน่วยความจำขนาดแปดบิต หรือที่เรียกว่าหนึ่งไบต์ (Byte) จะเก็บค่าที่แตกต่างกันได้ 256 ค่า ซึ่งนำมาใช้แทนตัวเลขจาก 0 ถึง 255 ได้

 

เราใช้ทรานซิสเตอร์หนึ่งตัวทำสวิตช์ ได้หนึ่งตัว แทนค่าได้หนึ่งบิต ในชิพซีพียูและแรมจะมีทรานซิสเตอร์บรรจุอยู่ภายในหลายร้อยล้านตัว >>

  

การนับเลขฐานสอง

ระบบจำนวน (Numbering system) คือวิธีนับ และวิธีกระทำทางคณิตศาสตร์ มนุษย์ใช้เลขฐานสิบในการนับ ส่วนคอมพิวเตอร์ใช้เลขฐานสองในการนับ ทั้งสองระบบทำงานเหมือนกันทุกประการ หากคุณบวกลบคุณหารโดยใช้เลขฐานสอง คุณจะได้คำตอบเช่นเดียวกันหากใช้เลขฐานสิบ

อย่างไรก็ดี ข้อแตกต่างอันควรสังเกตระหว่างเลขฐานสอง และเลขฐานสิบคือ เลขฐานสิบประกอบด้วยตัวเลขที่แตกต่างกันสิบตัว (0 ถึง 9) ส่วนเลขฐานสองประกอบด้วยตัวเลขเพียงสองตัวเท่านั้น (0 และ 1)

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

 

กฎในการบวกเลขฐานสอง

 

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

 

นี่คือกฎของการบวกเลขฐานสองเมื่อแสดงในลักษณะตารางความจริง (truth table) จะเห็นว่าเมื่อ 1 บวกกับ 1 จะเกิดตัวทดหรือ carry ขึ้น

 

การจองหน่วยความจำ

หน่วยความจำหนึ่งหน่วยเก็บข้อมูลได้หนึ่งไบต์ แต่ข้อมูลในโปรแกรมอาจโต 2, 4 หรือ 8 ไบต์ก็ได้ ดังนั้นคุณจึงต้องจองเนื้อที่ในหน่วยความจำโดยการกำหนดชนิดข้อมูลหรือ Abstract data type เสียก่อนจึงจะเก็บข้อมูลได้

ชนิดข้อมูลเป็นคีย์เวิร์ด (keyword คือคำที่สงวนไว้เพราะมีความหมายพิเศษในภาษาคอมพิวเตอร์) ที่ใช้ในการเขียนโปรแกรม มันทำหน้าที่กำหนดขนาดของหน่วยความจำและชนิดของข้อมูลที่จะเก็บ แต่อย่างไรก็ดี ชนิดของข้อมูลไม่ได้บอกคอมพิวเตอร์ว่าเราต้องการจองเนื้อที่จำนวนกี่ไบต์ เพราะจำนวนไบต์ที่ชนิดข้อมูลแต่ละแบบต้องการไม่ตายตัว ขึ้นอยู่กับภาษาที่ใช้เขียนโปรแกรม และชนิดของคอมพิวเตอร์ที่ใช้ คอมไพล์ (compile การแปลภาษารับดับสูงให้เป็นภาษาเครื่อง)

ชนิดข้อมูลในภาษา C# มีขนาดตายตัว เพราะโปรแกรมที่เขียนด้วยภาษา C# จะรันบนสภาพแวดล้อมเหมือนเดิมตลอด (เรียกว่า CLR หรือ Common Language Runtime) ส่วนภาษา C และ C++ ชนิดข้อมูลจะมีขนาดไม่แน่นอน ขึ้นอยู่กับขนาดของรีจิสเตอร์ของคอมพิวเตอร์ที่จะใช้ ชนิดข้อมูล int และ float จะมีขนาดเท่ารีจิสเตอร์ ส่วน short จะมีขนาดครึ่งหนึ่งของ int ส่วนชนิดข้อมูล long จะมีขนาดเป็นสองเท่าของ int

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

 

ชนิดข้อมูลพื้นฐานในภาษา C# แบ่งออกเป็นหลายแบบดังแสดงในตารางข้างบน คอลัมน์แรกแสดงคีย์เวิร์ด คอลัมน์ถัดมาเป็นชื่อคลาสที่นิยามชนิดข้อมูล คอลัมน์ถัดมาอีกเป็นขอบเขตของจำนวนที่เก็บได้

 

เวลาเขียนโปรแกรมคุณจะต้องกำหนดชนิดของข้อมูลให้เหมาะสม แล้วจึงประกาศการจองพื้นที่ในหน่วยความจำ เมื่อประกาศแล้วคุณจะได้ ตัวแปร (Variable) ไว้สำหรับอ้างถึงหน่วยความจำที่อยู่ในตำแหน่งนั้น ที่สำคัญคือคุณต้องกำหนดชนิดของข้อมูลให้พอดี เพราะหากข้อมูลโตล้นพื้นที่ๆ จองไว้คุณอาจเสียข้อมูลไป อุปมาเช่นคุณจองที่ว่างในโกดังไว้สำหรับเก็บผลไม้ห้าลัง แต่คุณส่งผลไม้ไปสิบลัง ผู้จัดการโกดังก็จะเอาผลไม้ห้าลังไปเก็บในที่ๆ จองไว้ ส่วนอีกห้าลังที่เกินมาก็จะโยนทิ้งไป

 

เกี่ยวกับผู้เขียน

 

ลาภลอย วานิชอังกูร ทำงานด้านคอมพิวเตอร์มานานกว่ายี่สิบปี สามารถเขียนโปรแกรมได้คล่องหลายภาษา เคยทำงานด้านคอมพิวเตอร์ที่ประเทศสหรัฐอเมริกา ประเทศเยอรมัน และประเทศสวิส เคยเป็นครูสอนวิชาคอมพิวเตอร์ เคยเป็นบรรณาธิการนิตยสารคอมพิวเตอร์ มีผลงานบทความ และตำราคอมพิวเตอร์จำนวนมาก ปัจจุบันทำหน้าที่เป็นผู้ให้คำปรึกษาด้านฮาร์ดแวร์และซอฟท์แวร์แก่บริษัทขนาดใหญ่หลายแห่ง ท่านสามารถติดต่อกับผู้เขียนได้ที่ laploy.com

กรอกแบบฟอร์มแล้วรับรางวัล

กรอกแบบฟอร์มแล้วรับรางวัล

 

 

บก. ของนิตยสาร Windows ITPro ฝากบอกมาว่า

เพื่อที่จะปรับปรุงการให้บริการด้านต่างๆ ให้มีนิตยสาร Windows ITPro มีประสิทธิภาพมากยิ่งขึ้น จึงขอเชิญทุกท่านร่วมตอบแบบสอบถาม และร่วมลุ้นรับของรางวัลต่างๆ มากมาย อาทิ

โชคชั้นที่ 1 รับฟรีทันที
        –  Microsoft Visual Studio 2008 Express
โชคชั้นที่ 2 ลุ้นรับฟรี !! ****
        – USB Phone 8 รางวัล
        – SKYGATE Box จำนวน 4 รางวัล
        – BitDefender Internet Security 5 รางวัล

หมดเขตรับแบบสอบถามภายในวันที่  30 เม.ย. 2551
ประกาศรายชื่อผู้โชคดีในนิตยสาร Windows ITPro ฉบับ เม.ย. 2551
สามารถดาวน์โหลดแบบสอบถามได้ที่เว็บไซต์ http://www.windowsitpro.net/Download
หรือส่งแฟกซ์มาได้ที่ 0-2246-4251 ถึง กองบรรณาธิการ นิตยสาร Windows ITPro

**** สงวนสิทธิ์สำหรับผู้กรอกแบบสอบถามครบถ้วนเท่านั้น

บก. ของนิตยสาร Windows ITPro ฝากบอกมาว่า
ถ้าไม่มีเครื่องแฟกซ์จะส่งกลับไปทางอีเมลก็ได้ที่ suwaschai@windowsitpro.net
ส่วนที่้ต้องกาในแบบฟอร์มใช้ป้ายสีแทนได้

สร้าง IrDA ด้วยตนเอง

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

สร้าง IrDA ด้วยตนเอง
สร้างตัวรับส่งอินฟราเรดโดยใช้อุปกรณ์หาง่ายราคาถูก เพื่อเชื่อมต่อคอมพิวเตอร์ของคุณกับอุปกรณ์ไฮเทคแบบไร้สาย

เขียนโดย : ลาภลอย วานิชอังกูร    [บทความจาก นิตยสารไมโครคอมพิวเตอร์ ]

อุปกรณ์ไฮเทคเช่น Pocket PC, คอมพิวเตอร์พกพา, กล้องถ่ายภาพแบบดิจิตอล และโทรศัพท์มือถือ ล้วนมี “วงจรสำหรับการเชื่อมต่อด้วยแสงอินฟราเรด” (ต่อไปจะเรียกย่อๆ ว่า IrDA) เพื่อให้เราสามารถเชื่อมต่ออุปกรณ์เหล่านี้กับคอมพิวเตอร์และรับส่งแลกเปลี่ยนข้อมูลได้โดยไม่ต้องใช้สาย

ยกตัวอย่างเช่นเมื่อเราถ่ายภาพโดยใช้กล้องดิจิตอล (หรือโทรศัพท์มือถือ) เสร็จแล้ว เพียงนำอุปกรณ์นั้นมาไว้ใกล้ๆ คอมพิวเตอร์ ไม่ต้องต่อหรือเสียบสายอะไร เราก็สามารถโอนย้ายภาพจากอุปกรณ์เข้าไปยังคอมพิวเตอร์ เพื่อส่งอีเมล หรือพิมพ์ที่เครื่องพิมพ์ หรือจะใช้เพื่อการปรับข้อมูลให้ตรงกัน ระหว่างคอมพิวเตอร์พกพากับเครื่องพีซีก็ได้

อุปกรณ์ไฮเทคที่สนับสนุน IrDA มีจำนวนมาก ยกตัวอย่างเช่น
•    มือถือโนเกียรุ่น 5000 series, 6000 series, 7000 series, 8000 series
•    มือถือโมโตโลรารุ่น 7689, 7389, L2000, A6288, 388, time port
•    มือถืออิริคสันรุ่น T39, T68, T68i, R320, R380
•    มือถือซีเมน 2588, 3568i, 3618, 6618, 6686, 6688
•    เครื่องพิมพ์ยี่ห้อฮิวเลตเพคการ์ด รุ่น 5MP Laser Printer, HP 6P Laser Printer และ HP DeskJet 990C series Printer
•    กล้องโซนี่ DSC-F1 3COM
•    คอมพิวเตอร์พกพาแบบ ปามล์ รุ่น Palm III, Palm V, Palm M100, Palm Vx
•    Pocket PC, Smart Phone และ PDA ทุกรุ่น
•    คอมพิวเตอร์แบบ note book ส่วนใหญ่

วินโดวส์ทุกเวอร์ชันสนับสนุนการเชื่อมต่อ IrDA โดยใช้โปรโตคอลแบบจุดต่อจุด ความเร็วในการรับ-ส่งข้อมูลประมาณ 4MBps (MBps คือล้านบิตต่อวินาที) ตามทฤษฏีแล้ว IrDA สามารถทำงานได้ที่ความเร็วสูงสุดถึง 16MBps และทำงานได้ภายในระยะทางประมาณหนึ่งถึงสองเมตร

โชคดีที่เมนบอร์ดส่วนใหญ่มี  IrDA มาให้ด้วย แต่วงจรนี้จะไร้ประโยชน์โดยสิ้นเชิงหากเราไม่มี “หัวรับ-ส่งสัญญาณอินฟราเรด” (ต่อไปจะเรียกย่อว่า IrTxRx)  แย่หน่อยที่ IrTxRx ไม่มีมาในกล่องเมนบอร์ด เราต้องหาซื้อแยกต่างหาก  ผู้ที่อยู่ไกลศูนย์ไอทีอาจพบว่า IrTxRx เป็นสิ่งที่หาซื้อยากและมีราคาแพง  

 

 

<< หัวรับ-ส่งสัญญาณอินฟราเรด หรือ IrTxRx 

บทความนี้จะสอนวิธีสร้าง IrTxRx ขึ้นใช้เอง โดยใช้วัสดุเหลือใช้รอบๆ ตัว หรือซื้อจากร้ายขายอะไหล่อิเล็กทรอนิกส์ วงจรไม่ซับซ้อน (ออกแบบโดย Alain Gailland) ใช้อุปกรณ์ไม่กี่ชิ้น ใครก็ตามที่บัดกรีเป็นก็สามารถทำได้เอง และจะแสดงตัวอย่างการประยุกต์ใช้งาน โดยการสาทิตวิธีเชื่อมต่อ Pocket PC กับเครื่องพีซีเพื่อทำ ActiveSync แบบไร้สาย และสุดท้ายจะแสดงวิธีเชื่อมต่อกับโทรศัพท์มือถือเพื่อเข้าอินเตอร์เน็ตผ่านระบบ GPRS

หัวรับ-ส่งสัญญาณอินฟราเรด หรือ IrTxRx เมื่อประกอบเสร็จแล้ว  >>

 

ช่องต่อ IrDA บนเมนบอร์ด

เมนบอร์ดส่วนใหญ่มีจุดต่อวงจรอินฟราเรด (ต่อไปจะเรียกย่อว่า IRC) เตรียมมาให้แล้ว เปิดฝาเคสดูที่เมนบอร์ด มองหาหัวต่อ (jumper pin) ที่เขียนว่า IR, IRDA, IRCON, SIR, SIRCON หรืออะไรทำนองนี้ ถ้าหาไม่เจอให้ดูในคู่มือเมนบอร์ด (ถ้าหาคู่มือไม่เจอให้ดาว์นโหลดจากเว็บไซต์ของผู้ผลิต)  บทความนี้จะยกตัวอย่างเมนบอร์ดยี่ห้อ Asus รุ่น A7N8X ซึ่งมี IRC ที่มุมขวาด้านล่าง มีตัวอักษรเขียนว่า IR_CON1
 

IRC ปรกติจะมีสี่ถึงหกขาขึ้นอยู่กับเมนบอร์ดแต่ละรุ่น ในเมนบอร์ดยี่ห้อ Asus รุ่น A7N8X หากดูในคู่มือจะเห็นว่าขา IRC มีสิบขา แต่เป็นขาที่ไม่ได้ใช้งานไปเสียสามขา ขาของ IRC ที่เราต้องการใช้งานมีเพียงสี่ขาคือ ขาส่งสัญญาณ (IRTX) ขารับสัญญาณ (IRRX) ขากราวด์ (GND) และขาจ่ายไฟเลี้ยง (+5v) ตำแหน่งของขาเหล่านี้จะแตกต่างกันในเมนบอร์ดแต่ละรุ่น โปรดตรวจดูในคู่มือให้แน่ใจ เพราะหากต่อผิดอาจทำให้เมนบอร์ดหรือเหล่งจ่ายไฟชำรุดได้

 

จุดต่อวงจรอินฟราเรดในเมนบอร์ดยี่ห้อ Asus รุ่น A7N8X

การจัดวางขา IR_CON1 ในเมนบอร์ดยี่ห้อ Asus รุ่น A7N8X

 

อุปกรณ์ที่ต้องใช้

อุปกรณ์ที่เราจะใช้สร้าง IrTxRx เป็นอุปกรณ์อิเล็กทรอนิกส์ธรรมดาที่หาซื้อได้ตามร้านอะไหล่ใกล้บ้าน (ถ้าอยู่ใกล้บ้านหม้อก็สบายหน่อย) ถ้าคุณมีซากอุปกรณ์อิเล็กทรอนิกส์เก่าๆ ที่ชำรุดแล้วอาจแกะอะไหล่มาใช้ได้ ยกตัวอย่างเช่นหลอด LED แบบอินฟราเรด (IED) และตัวรับอินฟราเรด หากคุณมีเมาส์แสง (optical mouse) เก่าที่เสียแล้ว ก็สามารถแกะตัวรับส่งอินฟราเรดมาใช้ได้ (ปรกติในเมาส์แสงจะมีตัวรับส่งอินฟราเรดอยู่สี่ชุด)  หรือทรานซิสเตอร์จะใช้เบอร์อะไรก็ได้ เพียงแต่ให้เป็นชนิด NPN และมีขนาดยิ่งเล็กยิ่งดี


รายการอุปกรณ์
ตัวต้านทาน ¼ w    22โอห์ม, 4.7K, 47K, 15k และ 1K     อย่างละตัว
ตัวเก็บประจุ    10nf    หนึ่งตัว
ทรานซิสเตอร์    2N4041 หรือ BC548 (หรือเบอร์อื่นๆ ที่เป็น NPN)    สองตัว
ตัวรับส่งอินฟราเรด    เบอร์อะไรก็ได้    หนึ่งชุด
แผ่นวงจรอเนกประสงค์    แผ่นเล็ก    หนึ่งแผ่น
สายแพ    แบบสี่เส้น     2เมตร

 

ประกอบวงจร

เมื่อหาอุปกรณ์ได้ครบแล้วก็ถึงเวลาเสียบปลั๊กหัวแร้ง ให้ใช้หัวแร้งวัตต์ต่ำปลายเล็ก ใช้ตะกั่วบัดกรีแบบมียางสนเส้นเล็กที่ใช้ในงานประกอบวงจรอีเล็กทรอนิกส์ ยึดอุปกรณ์ทุกตัวกับแผ่นปรินท์อเนกประสงค์ที่นำมาตัดให้มีขนาดประมาณ 3×3 นิ้วแล้ว ประกอบวงจร IrTxRx ตามที่เห็นในภาพ การประกอบวงจรไม่มีอะไรซับซ้อน มีสิ่งที่พึงระวังเพียงประการเดียวคือดูให้แน่ใจว่าตัวรับและตัวส่งถูกวางคู่กันและขนาดกันตรงดี (ดูในภาพที่ประกอบเสร็จแล้ว) 

เมื่อประกอบเสร็จให้ตรวจสอบโดยการไล่วงจร จนแน่ใจว่าไม่มีข้อผิดพลาด (เช่นทรานซิสเตอร์ หรือ LED สลับขา) จากนั้นนำวงจร IrTxRx เชื่อมต่อเข้ากับ IRC ของเมนบอร์ด (เมนบอร์ดยี่ห้อ Asus รุ่น A7N8X คือ IR_CON1)  ให้ต่อจุดที่เขียนว่า IRTX, IRRX, GND และ +5v ใน IrTxRx เข้ากับ IRC ในเมนบอร์ดในตำแหน่งที่มีชื่อตรงกัน ระวังอย่าต่อสลับขากันเพราะอาจทำให้วงจรในเมนบอร์ดชำรุดได้

วงจรหัวรับ-ส่งอินฟราเรด >>

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

<< สายแพแบบแปดเส้น หากใช้แบบนี้ต้องฉีกออกครึ่งหนึ่งให้เหลือสี่เส้น

 

การติดตั้งในวินโดวส์

เมื่อติดตั้ง IrTxRx เรียบร้อยแล้วให้เปิดคอมพิวเตอร์แล้วเข้าโปรแกรมไบออส (กดปุ่ม Del ขณะเครื่องกำลังตรวจสอบตัวเองก่อนเข้าวินโดวส์) เพื่อกำหนดค่าในไบออสให้ IrDA ทำงาน เมื่อตั้งค่าแล้วให้บูตใหม่ เมื่อเข้าวินโดวส์แล้ววินโดวส์จะตรวจพบ IrDA โดยอัตโนมัติและจะแสดงกรอบข้อความ Found New Hardware Wizard

 


กรอบข้อความ Found New Hardware Wizard

 

 
วิธีตรวจสอบว่า IrDA ถูกวินโดวส์ติดตั้งเรียบร้อยหรือไม่ทำได้โดย 1) กดปุ่ม Start 2) เลือกหัวข้อ Setting 3) เลือกหัวข้อ Control Panel จะเห็นไอคอน Infrared

 

ทำ ActiveSync กับ Pocket PC

ตอนนี้ IrDA พร้อมใช้งานแล้ว ต่อไปเป็นวิธีเชื่อม Pocket PC กับพีซีเพื่อทำ ActiveSync แบบไร้สาย

 
เปิดโปรแกรม ActiveSync แล้วเลือกเมนู File คลิกที่หัวข้อ Connection Setting…

 

 
กดให้มีเครื่องหมายถูกหน้าข้อความ Allow serial cable or infrared connection to this COM port แล้วเลือก Infrared (IR) จาก drop down list box

 


เปิดโปรแกรม ActiveSync ใน Pocket PC


นำ Pocket PC มาวางให้ตรงกับ IrTxDx แล้วคลิกคำสั่ง Tool และ Connect via IR


Pocket PC จะรับสัญญาณได้และทำการเชื่อมต่อ
เมื่อเชื่อมต่อได้แล้วก็สามารถโยกย้ายไฟล์ระหว่าง Pocket PC และพีซีได้ตามปรกติ

 

ใช้โมเด็มในมือถือ


เจ้าของมือถือที่มีโมเด็มแบบ GPRS สามารถนำมือถือมาเชื่อมกับพีซีเพื่อให้พีซีใช้โมเด็มต่อเข้าอินเตอร์เน็ตได้ มือถือแต่ละรุ่นจะมีเมนูและไอคอนแตกต่างกัน ในตัวอย่างนี้สาทิตขั้นตอนการทำในมือถือยี่ห้อ โนเกีย รุ่น 6600 ซึ่งใช้โอเอสแบบ Symbian ก่อนทำตามขั้นตอนเหล่านี้จะต้องเปิดบริการอินเตอร์เน็ต GPRS กับผู้ให้บริการก่อน


นำมือถือมาเปิดเมนู เลือก Tools เลือก Setting แล้วเลือก Connection

เลือกหัวข้อ Access points แล้วใส่ค่าต่างๆ ตามที่ผู้ให้บริการระบุ เช่น ชื่อ รหัสผ่าน ดูรายละเอียดในคู่มือการใช้งานของมือถือแต่ละยี่ห้อแต่ละรุ่น และคู่มือวิธีกำหนดค่าของผู้ให้บริการ หรือใช้ระบบ OTA (การตั้งค่าผ่าน SMS) ต่อไปนี้เป็นแนวทางในการตั้งค่าโดยทั่วไป

1.    หัวข้อ Connection Name ให้กำหนดดังนี้

•    เครือข่าย AIS ใช้ AIS GPRS INTERNET
•    เครือข่าย DTAC ใช้ DTAC GPRS INTERNET
•    เครือข่าย Orange ใช้ Orange GPRS Internet
•    หรือจะใช้ชื่ออะไรก็ได้ที่เข้าใจง่าย


2.    หัวข้อ Data Bearer เลือกเป็น GPRS


3.    หัวข้อ Access Point name ให้กำหนดดังนี้

•    เครือข่าย AIS ให้กำหนดเป็น internet
•    เครือข่าย DTAC ให้กำหนดเป็น http://www.dtac.co.th
•    เครือข่าย Orange ให้กำหนดเป็น internet


4.    หัวข้อ User Name ให้กำหนดดังนี้

•    เครือข่าย AIS ปล่อยว่าง
•    เครือข่าย DTAC ปล่อยว่าง
•    เครือข่าย Orange ให้กำหนดเป็น orange

5.    หัวข้อ Prompt Password ปล่อยว่าง


6.    ห้อข้อ Password ให้กำหนดดังนี้

•    เครือข่าย AIS ปล่อยว่าง
•    เครือข่าย DTAC ปล่อยว่าง
•    เครือข่าย Orange ให้กำหนดเป็น orange

7.    หัวข้อ Authentication เป็น Normal

8.    หัวข้อ Homepage ให้กำหนดดังนี้

•    เครือข่าย AIS ใส่

http://wap.mobilelife.co.th
•    เครือข่าย DTAC ปล่อยว่าง
•    เครือข่าย Orange ให้กำหนดเป็น
http://www.orange.co.th

9.    หัวข้อ Connection security ให้กำหนดเป็น off

10.    หัวข้อ Session mode ให้กำหนดเป็น Temporary

 

ต่อไปเป็นการตั้งค่า Advance Setting ใน Option / Advance Setting

1.    หัวข้อ Phone IP Address ให้กำหนดเป็น automatic
2.    Primary name server ให้กำหนดเป็น 0.0.0.0
3.    Second name server ให้กำหนดเป็น 0.0.0.0
4.    Proxy serv. Address ให้กำหนดเป็น
•    เครือข่าย AIS ให้กำหนดเป็น 203.170.299.34
•    เครือข่าย DTAC ให้กำหนดเป็น 203.155.200.133
•    เครือข่าย Orange ให้กำหนดเป็น orange 010.004.007.039
5.    Proxy port number ให้กำหนดเป็น 8080

เปิดการใช้งาน IrDA ในมือถือโดยเลือก Connect, Modem และ Connect Via Infrared

 


นำมือถือไปวางให้ตรงกับ IrTxRx วินโดวส์จะตรวจพบโมเด็มในมือถือและแสดงกรอบข้อความนี้

 

 
มือถือจะแสดงข้อความว่ากำลังเชื่อมต่อกับพีซีผ่านอินฟราเรด

 

 
วิธีตรวจสอบว่าวินโดวส์ติดตั้งไดร์ฟเวอร์ของโมเด็มเรียบร้อยหรือไม่ทำได้โดยคลิกขวาที่ My Computer, Properties กดที่ tab Hardware กดปุ่ม Device Manager จะเห็นกรอบข้อความนี้ ดูในหัวข้อโมเด็มจะมีข้อความว่า Standard Modem over IR link (หรืออื่นๆ ที่คล้ายกัน)


 

ต่อไปเป็นการกำหนดการเชื่อมต่ออินเตอร์เน็ตผ่านโมเด็มของมือถือซึ่งทำได้โดยเรียก Wizard ของวินโดวส์ กดปุ่ม Start, Setting, Network Connection ในกรอบ Network Connections เลือกหัวข้อ New Connection Wizard


 

New connection Wizard จะทำงาน ให้ทำตามขั้นตอนไปเรื่อยๆ เมื่อมีหัวข้อให้เลือกการเชื่อมต่อ ให้เลือกโมเด็มของมือถือ

 

อิสระกับอินฟราเรด

ลงทุนไม่มากนักลงแรงประกอบวงจรและเซตค่าในซอฟท์แวร์อีกนิดหน่อย เราก็เป็นอิสระจากสายไฟเชื่อมต่อที่น่ารำคาญ ทำให้ใช้อุปกรณ์ไฮเทคร่วมกับพีซีได้สะดวกขึ้น เมื่อเทียบกับการเชื่อมต่อไร้สายอื่นๆ อย่าง BlueTooth การใช้ IrDA ถือเป็นทางเลือกที่ประหยัดคุ้มค่า และหากท่านมีคอมพิวเตอร์สองเครื่องอยู่ใกล้กัน ต้องการเชื่อมต่อกันเพื่อแลกเปลี่ยนข้อมูล แต่ไม่มีการ์ดแลน การใช้ IrDA สองชุดเชื่อมต่อกันจะประหยัดกว่าแถมยังปราศจากสายไฟรกรุงรังด้วย

 

 

เกี่ยวกับผู้เขียน

 

 ลาภลอย วานิชอังกูร ทำงานด้านคอมพิวเตอร์มานานกว่ายี่สิบปี สามารถเขียนโปรแกรมได้คล่องหลายภาษา เคยทำงานด้านคอมพิวเตอร์ที่ประเทศสหรัฐอเมริกา ประเทศเยอรมัน และประเทศสวิส เคยเป็นครูสอนวิชาคอมพิวเตอร์ เคยเป็นบรรณาธิการนิตยสารคอมพิวเตอร์ มีผลงานบทความ และตำราคอมพิวเตอร์จำนวนมาก ปัจจุบันทำหน้าที่เป็นผู้ให้คำปรึกษาด้านฮาร์ดแวร์และซอฟท์แวร์แก่บริษัทขนาดใหญ่หลายแห่ง ท่านสามารถติดต่อกับผู้เขียนได้ที่ laploy.com