<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>nattster &#187; C</title>
	<atom:link href="http://nattster.siamdev.net/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://nattster.siamdev.net</link>
	<description>ก็ชอบเขียนโปรแกรมอ่ะ...ผิดตรงไหน!?</description>
	<lastBuildDate>Tue, 01 Jun 2010 08:57:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	
<!-- Start Of Script Generated By WP-PostViews Plus -->
<script type='text/javascript' src='http://nattster.siamdev.net/wp-includes/js/jquery/jquery.js?ver=1.4.2'></script>
<script type="text/javascript">
/* <![CDATA[ */
/* ]]> */
</script>
<!-- End Of Script Generated By WP-PostViews Plus -->
	<item>
		<title>ปลั๊กอิน &#8220;ป้องกัน SPAM&#8221; สำหรับ pidgin</title>
		<link>http://nattster.siamdev.net/2009/06/anti-msn-spam-plugin-for-pidgin/</link>
		<comments>http://nattster.siamdev.net/2009/06/anti-msn-spam-plugin-for-pidgin/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 16:26:44 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[คอมพิวเตอร์จ๋า]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[msn]]></category>
		<category><![CDATA[pidgin]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=364</guid>
		<description><![CDATA[เบื่อ SPAM ทาง msn มาก! จะบล็อกคนส่งทิ้งแบบ @rtsp ก็ใจร้ายเกินไป ผมเลยลองเขียนปลั๊กอินไว้ &#8220;กรองข้อความ&#8221; โดยใช้เงื่อนไขง่ายๆ ว่า &#8220;ใน 1 ชม. ที่ผ่านมา ถ้าเธอยังไม่เคยส่งข้อความหาฉันเลย แล้วจู่ๆ ส่ง URL มาให้ ฉันจะขอโยนข้อความนั้นทิ้งซะ (มันต้องเป็น spam แน่เลย!)&#8221; Anti MSN Spam ลองเขียนไว้ 2 version ครับ เขียนด้วย Python กับ C 1. anti-msn-spam.py ลองเขียนตัวต้นแบบด้วย Python ครับ ใช้ dbus คุยกับ pidgin เพื่อเช็คว่ามีข้อความส่งมารึเปล่า (หาอ่านเพิ่มเติมได้จาก wiki นี้) คิดว่าใช้ได้บน linux เท่านั้น เพราะมันใช้ dbus น่ะครับ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nattster.siamdev.net/wp-content/uploads/2009/06/msn_spam.png" title="msn_spam" rel="lightbox[364]"><img src="http://nattster.siamdev.net/wp-content/uploads/2009/06/msn_spam-300x274.png" alt="msn_spam" title="msn_spam" width="300" height="274" class="alignnone size-medium wp-image-365" align="left" /></a> เบื่อ SPAM ทาง msn มาก! จะบล็อกคนส่งทิ้งแบบ <a href="http://twitter.com/rtsp">@rtsp</a> ก็ใจร้ายเกินไป</p>
<p>ผมเลยลองเขียนปลั๊กอินไว้ &#8220;กรองข้อความ&#8221; โดยใช้เงื่อนไขง่ายๆ ว่า<br />
<blockquote>&#8220;ใน 1 ชม. ที่ผ่านมา ถ้าเธอยังไม่เคยส่งข้อความหาฉันเลย แล้วจู่ๆ ส่ง URL มาให้ ฉันจะขอโยนข้อความนั้นทิ้งซะ (มันต้องเป็น spam แน่เลย!)&#8221;</p></blockquote>
<p><span id="more-364"></span></p>
<h3>Anti MSN Spam</h3>
<p>ลองเขียนไว้ 2 version ครับ เขียนด้วย Python กับ C</p>
<h4>1. <a href='http://nattster.siamdev.net/wp-content/uploads/2009/06/anti-msn-spam.py'>anti-msn-spam.py</a></h4>
<p>ลองเขียนตัวต้นแบบด้วย Python ครับ ใช้ dbus คุยกับ pidgin เพื่อเช็คว่ามีข้อความส่งมารึเปล่า (<a href="http://developer.pidgin.im/wiki/DbusHowto">หาอ่านเพิ่มเติมได้จาก wiki นี้</a>)</p>
<p>คิดว่าใช้ได้บน linux เท่านั้น เพราะมันใช้ dbus น่ะครับ<br />
<strong>วิธีใช้:</strong> เปิด pidgin แล้วเรียกคำสั่งต่อไปนี้</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">python anti-msn-spam.py</pre></div></div>

<p>พอโปรแกรมจับ SPAM ได้มันก็จะบ่นออกมาทาง command line ว่า &#8220;ข้อความ&#8230;..โดน block ทิ้ง เพราะสงสัยว่าเป็น SPAM&#8221; (โค้ด version python น่าจะทำความเข้าใจได้ง่ายสุดครับ ลองแกะเล่นดูได้นะ <img src='http://nattster.siamdev.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</p>
<h4>2. <a href='http://nattster.siamdev.net/wp-content/uploads/2009/06/anti_msn_spam_c.zip'>anti_msn_spam_c.zip</a></h4>
<p>version C นี้ไปเอาโค้ด <a href="http://iamhuy.com/blog/?p=84">message_filter.c ของคุณ Huy Phan</a> มาโมดิฟาย&#8230; ของเดิมเค้าเขียนโปรแกรม &#8220;block ข้อความที่มีแต่ smiley&#8221;</p>
<p><strong>วิธีใช้</strong> ดาวน์โหลดไฟล์ zip ไปจะมี anti_msn_spam.c กับ anti_msn_spam.so<br />
<strong>- สำหรับคนใช้ x86 กับ pidgin 2.5.5 (บน linux):</strong><br />
1. สามารถเอาไฟล์ anti_msn_spam.so ไปใส่ไว้ที่ /home/USERNAME/.purple/plugins/anti_msn_spam.so ได้เลย<br />
2. เปิด pidgin ขึ้นมาใหม่ เลือกเมนู Tools->Plugins<br />
3. ติ๊กถูกหน้า &#8220;Anti MSN Spam 1.0&#8243; เป็นอันเสร็จ</p>
<p><strong>- สำหรับคนอื่นๆ (เช่น คนใช้ pidgin บน windows)</strong><br />
น่าจะต้อง compile เองครับ ทำตาม<a href="http://developer.pidgin.im/wiki/CHowTo/BasicPluginHowto">คู่มือนี้เลย</a> เหมือนจะต้องใช้ MinGW มา compile ครับ ถ้าใครพยายามแล้วติดปัญหา ก็แปะคอมเม้นท์มาได้นะครับ <img src='http://nattster.siamdev.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>โม้ไว้นิ๊สนึง&#8230; ตั้งแต่ลองใช้มา 3-4 สัปดาห์ ก็ยังไม่เจอ SPAM กวนใจอีกเลย ไม่รู้ว่าเค้าเลิกส่ง SPAM กันแล้ว หรือว่า Plugin เราดีจริง หะๆ</p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2009/06/anti-msn-spam-plugin-for-pidgin/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>ไปค่ายทะลุฟ้า (eXceed#6)</title>
		<link>http://nattster.siamdev.net/2009/06/exceed6-camp/</link>
		<comments>http://nattster.siamdev.net/2009/06/exceed6-camp/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 20:41:53 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[บล็อก]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[camp]]></category>
		<category><![CDATA[exceed]]></category>
		<category><![CDATA[ku]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=287</guid>
		<description><![CDATA[คนที่ follow @nattster ในช่วงเดือนที่ผ่านมาจะเห็นผมบ่นถึงค่าย eXceed#6 บ่อยๆ เมื่อผมกลับจากค่ายก็เห็นพี่ๆ เพื่อนๆ หลายคนบล็อกถึงค่ายนี้ (ป๊อบ, จ๊อบ, พี่ออฟ) เลยรู้สึกอยากเขียนบล็อกบ้าง&#8230; (บล็อกตามกระแส) Q: eXceed Camp หรือค่ายทะลุฟ้าคืออะไร? A: ค่าย 7 วันสำหรับนิสิตที่กำลังจะขึ้นปี 2 จากวิศวคอมฯ บางเขน+กำแพงแสน+วิศวซอฟต์แวร์ ประมาณ 120 คนมานั่งเรียน&#8230;.จัดกลุ่มประมาณ 7-8 คนแล้วให้ลองเขียนโปรแกรมด้วยกันภายในเวลา 2 คืน 1 วัน จะเห็นว่าเดือนที่แล้ว ผมไม่ได้เขียนบล็อกเลย เพราะนั่งคุย นั่งเตรียมค่ายกับเพื่อนๆ ปี 3 แล้วก็เขียน eXceed wiki ที่เป็นคลังความรู้ให้น้องๆ ในค่าย น่าดีใจที่ตอนนี้ wiki ของค่ายมีเนื้อหามากกว่า 500 หน้าแล้วครับ (เขียนกันมาเป็นปีที่ 2 แล้ว&#8230; ขอบคุณพี่ๆ CPE20&#38;SKE04 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nattster.siamdev.net/wp-content/uploads/2009/06/49_cropped.jpg" title="นอนเล่นคอมฯ" rel="lightbox[287]"><img class="alignleft size-thumbnail wp-image-304" title="นอนเล่นคอมฯ" src="http://nattster.siamdev.net/wp-content/uploads/2009/06/49_cropped-150x150.jpg" alt="นอนเล่นคอมฯ" width="150" height="150" /></a> คนที่ follow <a href="http://twitter.com/nattster">@nattster</a> ในช่วงเดือนที่ผ่านมาจะเห็นผมบ่นถึงค่าย <a href="http://exceed.cpe.ku.ac.th">eXceed#6</a> บ่อยๆ เมื่อผมกลับจากค่ายก็เห็นพี่ๆ เพื่อนๆ หลายคนบล็อกถึงค่ายนี้ (<a href="http://skyfox.byethost2.com/blog/?p=225">ป๊อบ</a>, <a href="http://www.maidguy.net/blog/view.jsp?page=75">จ๊อบ</a>, <a href="http://don-jai.com/content/%E0%B8%84%E0%B9%88%E0%B8%B2%E0%B8%A2%E0%B9%80%E0%B8%AD%E0%B8%81%E0%B8%8B%E0%B8%B5%E0%B8%94/">พี่ออฟ</a>) เลยรู้สึกอยากเขียนบล็อกบ้าง&#8230; (บล็อกตามกระแส)</p>
<p><strong>Q: eXceed Camp หรือค่ายทะลุฟ้าคืออะไร?</strong><br />
A: ค่าย 7 วันสำหรับนิสิตที่กำลังจะขึ้นปี 2 จากวิศวคอมฯ บางเขน+กำแพงแสน+วิศวซอฟต์แวร์ ประมาณ 120 คนมานั่งเรียน&#8230;.จัดกลุ่มประมาณ 7-8 คนแล้วให้ลองเขียนโปรแกรมด้วยกันภายในเวลา 2 คืน 1 วัน</p>
<p>จะเห็นว่าเดือนที่แล้ว ผมไม่ได้เขียนบล็อกเลย เพราะนั่งคุย นั่งเตรียมค่ายกับเพื่อนๆ ปี 3 แล้วก็<span id="more-287"></span>เขียน <a href="http://exceed.cpe.ku.ac.th/wiki/KB">eXceed wiki</a> ที่เป็นคลังความรู้ให้น้องๆ ในค่าย น่าดีใจที่ตอนนี้ wiki ของค่ายมีเนื้อหามากกว่า 500 หน้าแล้วครับ (เขียนกันมาเป็นปีที่ 2 แล้ว&#8230; ขอบคุณพี่ๆ CPE20&amp;SKE04 ที่เริ่มต้นเขียนเนื้อหาใน wiki ไว้เยอะมาก)</p>
<h4>กิจกรรมในค่าย</h4>
<p><a href="http://nattster.siamdev.net/wp-content/uploads/2009/06/img_1846.jpg" title="ไปแอบสอนนิ๊สนึงด้วยคับ" rel="lightbox[287]"><img class="alignright size-thumbnail wp-image-317" title="ไปแอบสอนนิ๊สนึงด้วยคับ" src="http://nattster.siamdev.net/wp-content/uploads/2009/06/img_1846-150x150.jpg" alt="ไปแอบสอนนิ๊สนึงด้วยคับ" width="150" height="150" /></a>กิจกรรมก็ไม่มีอะไรมากครับ กิน เรียน นอน ตีดอท(เฉพาะบางคน อิๆ) เนื้อหาที่พยายามยัดเยียดให้น้องๆ ในค่ายปีนี้คือ <a href="http://exceed.cpe.ku.ac.th/wiki/Windows_Form_and_SVN">Windows Form</a>, <a href="http://exceed.cpe.ku.ac.th/wiki/Windows_Form_and_SVN">SVN</a> และ <a href="http://exceed.cpe.ku.ac.th/wiki/OOP">OOP</a> สาเหตุที่ต้องสอน Windows Form เพราะตอนปี 1 น้องเรียน C# มาครับ ถ้าจะทำ App. ก็หนีไม่พ้นต้องใช้ Windows Form &#8230; แล้วแถม SVN ให้น้องๆ เพราะคาดว่าน่าจะช่วยให้น้องแลกโค้ดกันได้สะดวกขึ้น (ปีที่แล้วใช้ thumb drive เสียบเข้าเสียบออกติดไวรัสกันกระจาย) และสุดท้ายคือ OOP ที่หวังว่าน้องจะได้แบ่งโปรแกรมออกเป็นคลาสหลายๆ คลาส แล้วกระจายกันเขียนคนละคลาส (idea OOP ตกทอดมาจากรุ่นพี่ครับ)</p>
<p>นอกจากเนื้อหาที่บังคับยัดเยียดแล้ว&#8230; เรายังมีเนื้อหาที่น้องๆ <a href="http://exceed.cpe.ku.ac.th/wiki/Selected_Topics">เลือกเรียนตามความสนใจอีก 7 เรื่อง</a>&#8230; พอเรียนกันเสร็จแล้วก็ได้เวลาปล่อยน้องๆ ทำโปรเจคครับ</p>
<p style="text-align: center;">==ชะแว๊บ&#8230; เวลาผ่านไป 2 คืน 1 วัน&#8230; ไปดูผลงานน้องๆ กันเลยดีกว่า==</p>
<h4>ผลงานน้องๆ</h4>
<p><a href="http://nattster.siamdev.net/wp-content/uploads/2009/06/62.jpg" title="ไปลองเล่นเกมส์ TYPING SHOOTER ของน้อง" rel="lightbox[287]"><img class="alignleft size-thumbnail wp-image-300" title="ไปลองเล่นเกมส์ TYPING SHOOTER ของน้อง" src="http://nattster.siamdev.net/wp-content/uploads/2009/06/62-150x150.jpg" alt="ไปลองเล่นเกมส์ TYPING SHOOTER ของน้อง" width="150" height="150" /></a><br />
ภาพซ้ายมือนี้ เป็นตอนที่ผมไปลองเล่นเกมส์ที่น้องเขียนขึ้น ชื่อว่า <a href="http://exceed.cpe.ku.ac.th/wiki/Exceed_6_Group_2">TYPING SHOOTER</a> ครับ สร้างด้วย XNA Studio (พี่โบะเจ๋งมาก สอนน้องแค่ 2 ชม.ครึ่ง น้องก็เขียนเกมส์ได้แล้ว) เป็นเกมส์ฝึกพิมพ์ดีด ต้องพิมพ์คำศัพท์ให้ทันก่อนที่ซอมบี้จะเดินมาถึงตัวเรา&#8230; ปรากฏว่าเล่นไปเล่นมา น้องแก้โปรแกรมให้ผมเจอกับ level พิเศษ&#8230;ซอมบี้เดินเร็วอย่างโหดครับ พิมพ์ไม่ทัน Game Over ตามภาพ (น้องมันก็ยิ้มสะใจอยู่ด้านหลังนะนั่น)</p>
<p>จริงๆ ยังมีโปรเจคเจ๋งๆ อีกตั้ง <a href="http://exceed.cpe.ku.ac.th/wiki/Exceed_6_Projects">16 โปรเจคครับ</a> ลองคลิกเข้าไปดู+ดาวน์โหลดมาลองเล่นกันได้ (คาดว่าน้องๆ จะเขียน wiki +อัพโปรแกรมกันเสร็จภายในวันที่ 7 มิ.ย. นี้ครับ)</p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2009/06/exceed6-camp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>กลับลำดับ Bit ในตัวแปร Integer</title>
		<link>http://nattster.siamdev.net/2009/03/reverse-bit-order/</link>
		<comments>http://nattster.siamdev.net/2009/03/reverse-bit-order/#comments</comments>
		<pubDate>Tue, 10 Mar 2009 16:02:31 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[คอมพิวเตอร์จ๋า]]></category>
		<category><![CDATA[algorithm]]></category>
		<category><![CDATA[bit]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=222</guid>
		<description><![CDATA[วันนี้เขียน Micro C ลง dsPIC30 (เป็น Microcontroller ตัวนึงน่ะนะ) ต้องการเขียนโปรแกรมให้กลับลำดับ bit ในตัวแปร x x = 01001111000000001010101011110000 ให้กลายเป็น y = 00001111010101010000000011110010 (คือ เขียน bit ใน x จากหลังมาหน้านั่นแหละครับ) ตอนแรกพยายามนึกวิธีเอง ได้วิธีถึกๆ แบบต้องวนลูป 32 ครั้งค่อยๆ ดึง bit ตัวท้ายออกมาใส่อีกตัวแปรนึงไปเรื่อยๆ (32 ครั้ง = 32 bit) พอไปค้นในเน็ตเจอ Bit Twiddling Hacks ซึ่งแข็งแกร่งมาก (ทำเสร็จในไม่กี่ operation) ขอเอาโค้ดมาแปะตามนี้ unsigned int v; // 32 bit word to reverse [...]]]></description>
			<content:encoded><![CDATA[<p>วันนี้เขียน Micro C ลง dsPIC30 (เป็น Microcontroller ตัวนึงน่ะนะ) ต้องการเขียนโปรแกรมให้กลับลำดับ bit ในตัวแปร x</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">x = 01001111000000001010101011110000</pre></div></div>

<p>ให้กลายเป็น</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">y = 00001111010101010000000011110010</pre></div></div>

<p><b>(คือ เขียน bit ใน x จากหลังมาหน้านั่นแหละครับ)</b></p>
<p>ตอนแรกพยายามนึกวิธีเอง ได้วิธีถึกๆ แบบต้องวนลูป 32 ครั้งค่อยๆ ดึง bit ตัวท้ายออกมาใส่อีกตัวแปรนึงไปเรื่อยๆ (32 ครั้ง = 32 bit) พอไปค้นในเน็ตเจอ <a href="http://graphics.stanford.edu/~seander/bithacks.html#BitReverseObvious">Bit Twiddling Hacks</a> ซึ่งแข็งแกร่งมาก (ทำเสร็จในไม่กี่ operation) ขอเอาโค้ดมาแปะตามนี้<br />
<span id="more-222"></span></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> v<span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 32 bit word to reverse bit order</span>
<span style="color: #666666; font-style: italic;">// swap odd and even bits</span>
v <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>v <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x55555555</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>v <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x55555555</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// swap consecutive pairs</span>
v <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>v <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x33333333</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>v <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x33333333</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// swap nibbles ... </span>
v <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>v <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x0F0F0F0F</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>v <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x0F0F0F0F</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// swap bytes</span>
v <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>v <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x00FF00FF</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>v <span style="color: #339933;">&amp;</span> <span style="color: #208080;">0x00FF00FF</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">8</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// swap 2-byte long pairs</span>
v <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> v <span style="color: #339933;">&gt;&gt;</span> <span style="color: #0000dd;">16</span>             <span style="color: #009900;">&#41;</span> <span style="color: #339933;">|</span> <span style="color: #009900;">&#40;</span> v               <span style="color: #339933;">&lt;&lt;</span> <span style="color: #0000dd;">16</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>ตอนแรกดูโค้ดแล้วก็งงๆ มันทำงานได้ยังไงหว่า ขอยกตัวอย่างการทำงานกับเลข 8 bit โดยใช้สัญลักษณ์ ABCDEFGH แทน 0, 1 และขอรันโค้ดจากบรรทัดล่างขึ้นบนซึ่งให้ผลลัพธ์เหมือนกัน  (มันจะเข้าใจง่ายกว่าจริงๆ นะ)</p>
<pre>x = ABCD<u>EFGH</u>
x = <u>EF</u>GH<u>AB</u>CD	// สลับ nibble (4 bits) ที่ติดกัน
x = <u>G</u>H<u>E</u>F<u>C</u>D<u>A</u>B	// สลับ คู่บิต (2 bits) ที่ติดกัน
x = HGFEDCBA	// สลับ 'บิตที่อยู่ตำแหน่งคี่' กับ 'บิตที่อยู่ตำแหน่งคู่'
</pre>
<p>ถ้ายังไม่เข้าใจบ่นได้เลยครับ <img src='http://nattster.siamdev.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2009/03/reverse-bit-order/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mysweeper version 1 ชม. เสร็จ</title>
		<link>http://nattster.siamdev.net/2009/01/mysweeper-in-1-hour/</link>
		<comments>http://nattster.siamdev.net/2009/01/mysweeper-in-1-hour/#comments</comments>
		<pubDate>Mon, 26 Jan 2009 11:04:12 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[คอมพิวเตอร์จ๋า]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=162</guid>
		<description><![CDATA[วันนี้ขอนำเสนอเกมส์ Mysweeper ซึ่งมันก็เป็นเกมส์แบบเดียวกับ Minesweeper ที่เราเล่นกันมานาน (ตั้งชื่อแบบนี้จะได้ออกเสียงคล้าย Minesweeper ต้นฉบับ) แต่ถ้าแปลตรงตัวก็น่าจะแปลว่า &#8220;ไม้กวาด ของฉัน&#8221; ฮ่าๆ เกมส์ Mysweeper เป็นเกมส์ที่ปั่นอย่างบ้าระห่ำ ใน 1 ชม. (ไม่ยอมอ่านหนังสือสอบ) เพื่อที่จะเอาไปบอกน้องๆ ปีหนึ่งว่า นี่คือเกมส์เล็กๆ ที่สร้างด้วย Visual C# ได้นะครับ (ผมกำลังจะสอนน้องๆ เรื่อง Windows Form Application ครับ) แต่เขียนเสร็จเก็บไว้มันก็เท่านั้น เอาโค้ดมาแจกละกันครับ เผื่อใครจะลองเอาไปศึกษาดู อ่านรู้เรื่องไม่รู้เรื่องก็ทิ้ง comment ไว้ได้นะครับ สาเหตุที่เอาโค้ดมาแจกเพราะตอนสมัยหัดเขียน Visual Basic ครั้งแรกๆ ก็มาดาวน์โหลดโค้ดชาวบ้านไปนั่งดู (เยอะมากๆ) โค้ดอันนึงที่ประทับใจมากคือโค้ดของ Tamagotchi Simulator ของคุณ Tooh (พีรภัทร์ สว่างเพียร) แล้วเอามานั่งแกะๆ แล้วได้รับความรู้มากมาย ผมเลยหวังว่าโปรแกรมเล็กๆ ที่ผมเขียนนี้อาจจะเป็นแหล่งเรียนรู้ให้กับคนอื่นได้ไม่มากก็น้อยฮับ [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-163" title="mysweeper" src="http://nattster.siamdev.net/wp-content/uploads/2009/01/mysweeper.png" alt="mysweeper" width="216" height="274" />วันนี้ขอนำเสนอเกมส์ Mysweeper ซึ่งมันก็เป็นเกมส์แบบเดียวกับ Minesweeper ที่เราเล่นกันมานาน (ตั้งชื่อแบบนี้จะได้ออกเสียงคล้าย Minesweeper ต้นฉบับ) แต่ถ้าแปลตรงตัวก็น่าจะแปลว่า &#8220;ไม้กวาด ของฉัน&#8221; ฮ่าๆ</p>
<p>เกมส์ Mysweeper เป็นเกมส์ที่ปั่นอย่างบ้าระห่ำ ใน 1 ชม. (ไม่ยอมอ่านหนังสือสอบ) เพื่อที่จะเอาไปบอกน้องๆ ปีหนึ่งว่า นี่คือเกมส์เล็กๆ ที่สร้างด้วย Visual C# ได้นะครับ (ผมกำลังจะสอนน้องๆ เรื่อง Windows Form Application ครับ)</p>
<p>แต่เขียนเสร็จเก็บไว้มันก็เท่านั้น เอาโค้ดมาแจกละกันครับ เผื่อใครจะลองเอาไปศึกษาดู อ่านรู้เรื่องไม่รู้เรื่องก็ทิ้ง comment ไว้ได้นะครับ สาเหตุที่เอาโค้ดมาแจกเพราะตอนสมัยหัดเขียน Visual Basic ครั้งแรกๆ ก็มาดาวน์โหลดโค้ดชาวบ้านไปนั่งดู (เยอะมากๆ) โค้ดอันนึงที่ประทับใจมากคือโค้ดของ <a href="http://www.thaiware.com/main/info.php?id=945">Tamagotchi Simulator</a> ของคุณ Tooh (พีรภัทร์ สว่างเพียร) แล้วเอามานั่งแกะๆ แล้วได้รับความรู้มากมาย</p>
<p>ผมเลยหวังว่าโปรแกรมเล็กๆ ที่ผมเขียนนี้อาจจะเป็นแหล่งเรียนรู้ให้กับคนอื่นได้ไม่มากก็น้อยฮับ</p>
<p><a href="http://nattster.siamdev.net/wp-content/uploads/2009/01/mysweeper.zip">ดาวน์โหลดโค้ดเกมส์ mysweeper</a> (ขนาด 46KB สร้างด้วย Visual Studio 2008)</p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2009/01/mysweeper-in-1-hour/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>ฟังก์ชัน printbin</title>
		<link>http://nattster.siamdev.net/2008/12/printbin-binary-representation-of-varaible/</link>
		<comments>http://nattster.siamdev.net/2008/12/printbin-binary-representation-of-varaible/#comments</comments>
		<pubDate>Mon, 22 Dec 2008 15:54:13 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[คอมพิวเตอร์จ๋า]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=142</guid>
		<description><![CDATA[วันนี้ก็อ่านหนังสือสอบวิชา Abstract Data Type แล้วก็เปิดเว็บบอร์ดรุ่นไปพลางๆ ก็เจอ @b4lmung สงสัยว่าผลลัพธ์ที่ได้จากโค้ด printf ต่อไปนี้มันเอาส่วนไหนของ float มา print #include &#60;stdio.h&#62; int main&#40;&#41;&#123; float a = 10.1F; printf&#40;&#34;%d&#34;, a&#41;; return 0; &#125; Result: 1073741824 เราก็เกิดอาการสงสัย และเดาว่า มันคงอ่านค่า binary ทั้งดุ้นของ float เป็นแบบ int และพิมพ์ออกมา เราก็เลยลองฟังก์ชัน printbin เพื่อพิมพ์ binary representation ของตัวแปรใดๆ (ดูว่าใน ram มันเก็บเป็นเลขฐานสองยังไง) ได้โค้ดอย่างนี้&#8230; #include &#60;stdio.h&#62; void printbin&#40;char *c, int bytes&#41; &#123; [...]]]></description>
			<content:encoded><![CDATA[<p>วันนี้ก็อ่านหนังสือสอบวิชา Abstract Data Type แล้วก็เปิดเว็บบอร์ดรุ่นไปพลางๆ ก็เจอ <a href="http://www.mahoro-san.net/">@b4lmung</a> สงสัยว่าผลลัพธ์ที่ได้จากโค้ด printf ต่อไปนี้มันเอาส่วนไหนของ float มา print</p>
<table border="0" width="100%">
<tbody>
<tr>
<td width="50%">

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #993333;">float</span> a <span style="color: #339933;">=</span> <span style="color:#800080;">10.1F</span><span style="color: #339933;">;</span>
      <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

</td>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Result<span style="color: #339933;">:</span>
<span style="color: #0000dd;">1073741824</span></pre></div></div>

</td>
</tr>
</tbody>
</table>
<p>เราก็เกิดอาการสงสัย และเดาว่า มันคงอ่านค่า binary ทั้งดุ้นของ float เป็นแบบ int และพิมพ์ออกมา เราก็เลยลองฟังก์ชัน printbin เพื่อพิมพ์ binary representation ของตัวแปรใดๆ (ดูว่าใน ram มันเก็บเป็นเลขฐานสองยังไง) ได้โค้ดอย่างนี้&#8230;</p>
<table width="100%">
<tr>
<td width="70%">

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #993333;">void</span> printbin<span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span>c<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> bytes<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>  <span style="color: #666666; font-style: italic;">// author: nattster.siamdev.net</span>
  <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">;</span>
  <span style="color: #993333;">char</span> a<span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>j<span style="color: #339933;">=</span>bytes<span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> j<span style="color: #339933;">&gt;=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    a <span style="color: #339933;">=</span> c<span style="color: #009900;">&#91;</span>j<span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #0000dd;">8</span><span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">;</span> i<span style="color: #339933;">&gt;=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i<span style="color: #339933;">--</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>a <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">&lt;&lt;</span>i<span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #0000dd;">1</span> <span style="color: #339933;">:</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  <span style="color: #993333;">float</span> a <span style="color: #339933;">=</span> <span style="color:#800080;">10.1F</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  printbin<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>a<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">float</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

</td>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">Result<span style="color: #339933;">:</span>
<span style="color: #0000dd;">1073741824</span>
<span style="color: #208080;">01000001001000011001100110011010</span></pre></div></div>

</td>
</tr>
</table>
<p>เลขฐานสองยาวๆ อันล่างเป็น binary representation ของ 10.1F ตามมาตรฐาน <a href="http://en.wikipedia.org/wiki/IEEE_754-1985">IEEE754-1985</a> พอลองแปลงเลขฐานสองก้อนนี้กลับไปเป็นฐานสิบมันได้ = 1092721050 ซึ่งคลาดเคลื่อนจากผลที่ได้จาก printf(&#8220;%d&#8221;, a); นิดหน่อย สรุปว่าเราก็ยังไม่รู้อยู่ดีว่า printf มันเอาอะไรออกมาพิมพ์</p>
<p>แต่! ได้ฟังก์ชัน printbin เอาไว้ใช้เป็นของเล่นในอนาคต เผื่ออยากดูว่าตัวแปรอื่นๆ มันเก็บข้อมูลใน memory ยังไง<br />
ปล. คิดว่าฟังก์ชันทำงานถูกต้องแล้วนะ เพราะลองใส่เลข 0.15625 แล้วมันได้เลขฐานสองถูกต้องตามรูปนี้อ่ะ<br />
<div id="attachment_143" class="wp-caption aligncenter" style="width: 510px"><a href="http://nattster.siamdev.net/wp-content/uploads/2008/12/618px-ieee_754_single_floating_point_formatsvg.png" title="IEEE754 representation of 0.15625 (Ref: wikipedia.org)" rel="lightbox[142]"><img src="http://nattster.siamdev.net/wp-content/uploads/2008/12/618px-ieee_754_single_floating_point_formatsvg.png" alt="IEEE754 representation of 0.15625 (Ref: wikipedia.org)" title="IEEE754 representation of 0.15625 (Ref: wikipedia.org)" width="500" height="101" class="size-full wp-image-143" /></a><p class="wp-caption-text">IEEE754 representation of 0.15625 (Ref: wikipedia.org)</p></div><br />
ปล2. ลองใช้ฟังก์ชัน printbin เช็คดูว่าจำนวนเต็มติดลบ มันจะเก็บเป็น <a href="http://en.wikipedia.org/wiki/Two's_complement">2&#8242;complements</a> อย่างที่เราเรียนๆ มากันรึเปล่า<br />
ปล3. ช่วงนี้มีแต่ภาษา C และเลขฐานสอง เพราะกำลังจะสอบวิชา Abstract Data Types และ Digital ฮ่าๆ</p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2008/12/printbin-binary-representation-of-varaible/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>calloc VS. malloc</title>
		<link>http://nattster.siamdev.net/2008/12/calloc-vs-malloc/</link>
		<comments>http://nattster.siamdev.net/2008/12/calloc-vs-malloc/#comments</comments>
		<pubDate>Sun, 21 Dec 2008 08:46:09 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[คอมพิวเตอร์จ๋า]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=137</guid>
		<description><![CDATA[นั่งเรียนเขียนโปรแกรมภาษาซี มาก็หลายอาจารย์ หลายรอบ แต่วันนี้เพิ่งจะรู้ว่าฟังก์ชัน calloc กับ malloc ต่างกันยังไง ตอนเรียน อ.ก็บอกว่า ทั้งสองฟังก์ชันทำหน้าที่จองหน่วยความจำให้ตามที่เรากำหนด แต่วิธีเรียกใช้ต่างกันนิดหน่อย malloc&#40;ขนาดหน่วยความจำเป็นไบต์&#41;; calloc&#40;หน่วยความจำกี่ช่อง, ช่องละกี่ไบต์&#41; เกิดอาการสงสัยอย่างแรง ว่าไหนๆ มันก็ทำงานได้เหมือนๆ กันแล้ว ทำไมต้องมีตั้งสองฟังก์ชัน พอไปเปิด man ดูก็เจอข้อแตกต่างว่า malloc จะจองพื้นที่ให้ แล้วก็จบแค่นั้น แต่ calloc จะจองพื้นที่ให้และกำหนดค่าเริ่มต้นเป็น 0 ด้วย ลองดูโค้ดและผลลัพธ์ของโปรแกรม น่าจะช่วยให้เข้าใจง่ายขึ้นครับ #include&#60;stdio.h&#62; #include&#60;stdlib.h&#62; int main&#40;&#41; &#123; int *a = &#40;int*&#41; malloc&#40;sizeof&#40;int&#41;*10&#41;; int *b = &#40;int*&#41; calloc&#40;10, sizeof&#40;int&#41;&#41;; int i; for&#40;i=0;i&#60;10;i++&#41; &#123; printf&#40;&#34;a = [...]]]></description>
			<content:encoded><![CDATA[<p>นั่งเรียนเขียนโปรแกรมภาษาซี มาก็หลายอาจารย์ หลายรอบ แต่วันนี้เพิ่งจะรู้ว่าฟังก์ชัน calloc กับ malloc ต่างกันยังไง ตอนเรียน อ.ก็บอกว่า ทั้งสองฟังก์ชันทำหน้าที่จองหน่วยความจำให้ตามที่เรากำหนด แต่วิธีเรียกใช้ต่างกันนิดหน่อย</p>
<table>
<tr>
<td width="50%">

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">malloc<span style="color: #009900;">&#40;</span>ขนาดหน่วยความจำเป็นไบต์<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

</td>
<td>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">calloc<span style="color: #009900;">&#40;</span>หน่วยความจำกี่ช่อง<span style="color: #339933;">,</span> ช่องละกี่ไบต์<span style="color: #009900;">&#41;</span></pre></div></div>

</td>
</tr>
</table>
<p>เกิดอาการสงสัยอย่างแรง ว่าไหนๆ มันก็ทำงานได้เหมือนๆ กันแล้ว ทำไมต้องมีตั้งสองฟังก์ชัน พอไปเปิด man ดูก็เจอข้อแตกต่างว่า malloc จะจองพื้นที่ให้ แล้วก็จบแค่นั้น แต่ <strong>calloc จะจองพื้นที่ให้และกำหนดค่าเริ่มต้นเป็น 0</strong> ด้วย</p>
<p>ลองดูโค้ดและผลลัพธ์ของโปรแกรม น่าจะช่วยให้เข้าใจง่ายขึ้นครับ</p>
<table>
<tr>
<td width="80%">

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include&lt;stdio.h&gt;</span>
<span style="color: #339933;">#include&lt;stdlib.h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">int</span> <span style="color: #339933;">*</span>a <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> <span style="color: #339933;">*</span>b <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> calloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #993333;">int</span> i<span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>
		<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;a = %d, b = %d<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> b<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

</td>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">ผลลัพธ์<span style="color: #339933;">:</span>
a <span style="color: #339933;">=</span> <span style="color: #0000dd;">3221200</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span>
a <span style="color: #339933;">=</span> <span style="color: #0000dd;">3215048</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span>
a <span style="color: #339933;">=</span> <span style="color: #0000dd;">1095651909</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span>
a <span style="color: #339933;">=</span> <span style="color: #0000dd;">1346192717</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span>
a <span style="color: #339933;">=</span> <span style="color: #0000dd;">1095910725</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span>
a <span style="color: #339933;">=</span> <span style="color: #0000dd;">1196314448</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span>
a <span style="color: #339933;">=</span> <span style="color: #0000dd;">1866661971</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span>
a <span style="color: #339933;">=</span> <span style="color: #0000dd;">1701860205</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span>
a <span style="color: #339933;">=</span> <span style="color: #0000dd;">977485155</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span>
a <span style="color: #339933;">=</span> <span style="color: #0000dd;">1852397404</span><span style="color: #339933;">,</span> b <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span></pre></div></div>

</td>
</tr>
</table>
<p>ดังนั้นควรเลือกฟังก์ชันให้เหมาะสมกับการใช้งาน เพราะมี overhead ไม่เท่ากันนะครับ</p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2008/12/calloc-vs-malloc/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>ใช้ man ดู Function Reference ภาษาซีใน ubuntu</title>
		<link>http://nattster.siamdev.net/2008/11/c-man-function-reference/</link>
		<comments>http://nattster.siamdev.net/2008/11/c-man-function-reference/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 07:08:54 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[คอมพิวเตอร์จ๋า]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=119</guid>
		<description><![CDATA[คนใช้ linux (หรือ cygwin ก็ด่ะ) น่าจะรู้จักคำสั่ง man ที่เอาไว้ใช้ดู manual ของคำสั่งต่างๆ ใน linux ท่านผู้อ่าน รู้หรือไม่ว่า? เราสามารถใช้คำสั่ง $ man qsort เพื่อดูรายละเอียดของฟังก์ชัน qsort ได้ผลลัพธ์ตามนี้ (ทีนี้จะได้รู้และว่าต้อง include file ไหนและฟังก์ชันรับอาร์กิวเมนท์อะไรบ้าง) QSORT&#40;3&#41; Linux Programmer`s Manual QSORT&#40;3&#41; &#160; NAME qsort - sorts an array &#160; SYNOPSIS #include &#60;stdlib.h&#62; &#160; void qsort&#40;void *base, size_t nmemb, size_t size, int&#40;*compar&#41;&#40;const void *, const void *&#41;&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>คนใช้ linux (หรือ cygwin ก็ด่ะ) น่าจะรู้จักคำสั่ง man ที่เอาไว้ใช้ดู manual ของคำสั่งต่างๆ ใน linux<br />
ท่านผู้อ่าน รู้หรือไม่ว่า? เราสามารถใช้คำสั่ง</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">$ man qsort</pre></div></div>

<p>เพื่อดูรายละเอียดของฟังก์ชัน qsort ได้ผลลัพธ์ตามนี้ (ทีนี้จะได้รู้และว่าต้อง include file ไหนและฟังก์ชันรับอาร์กิวเมนท์อะไรบ้าง)</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">QSORT<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span>                   Linux Programmer`s Manual                  QSORT<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">3</span><span style="color: #009900;">&#41;</span>
&nbsp;
NAME
       qsort <span style="color: #339933;">-</span> sorts an array
&nbsp;
SYNOPSIS
       <span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
&nbsp;
       <span style="color: #993333;">void</span> qsort<span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span>base<span style="color: #339933;">,</span> size_t nmemb<span style="color: #339933;">,</span> size_t size<span style="color: #339933;">,</span>
                  <span style="color: #993333;">int</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>compar<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*,</span> <span style="color: #993333;">const</span> <span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
DESCRIPTION
       The  qsort<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>  <span style="color: #000000; font-weight: bold;">function</span> sorts an array with nmemb elements of size size.
       <span style="color: #202020;">The</span> base argument points to the start of the array.</pre></div></div>

<p><strong>แต่!</strong> ก่อนที่จะทำแบบนี้ได้ต้องติดตั้งแพคเกจ <strong>manpages-dev</strong> ก่อนครับ สำหรับผู้ใช้ ubuntu/debian (ใช้ Synaptic ติดตั้ง หรือ sudo apt-get install manpages-dev ก็ได้ครับ) สำหรับคนใช้ดิสโทรอื่นต้องลองค้น google ดูครับ</p>
<p>ถ้าลอง man printf ดูจะเจอ manual ของคำสั่ง printf ของ linux แทนที่จะเป็น reference ของฟังก์ชัน printf ของภาษา C แทน</p>
<p>วิธีเปิด manual ของ printf (ฟังก์ชันภาษา C) ให้เรียกคำสั่ง</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">$ man <span style="color: #0000dd;">3</span> <span style="color: #000066;">printf</span></pre></div></div>

<p> แทน ซึ่งหมายความว่า เปิดดูคำสั่ง printf ใน section ที่ 3 ของ manual ครับ (manual มีทั้งหมด 7-8 section&#8230; เขาแบ่ง section ตามหัวข้อครับ <a href="http://en.wikipedia.org/wiki/Man_page">ดูรายละเอียดเพิ่มเติมที่นี่</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2008/11/c-man-function-reference/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>วนลูป แล้วลบ &#8220;ของ&#8221; ออกจาก list</title>
		<link>http://nattster.siamdev.net/2008/10/iterate-and-remove-item-from-list/</link>
		<comments>http://nattster.siamdev.net/2008/10/iterate-and-remove-item-from-list/#comments</comments>
		<pubDate>Thu, 09 Oct 2008 17:42:12 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[คอมพิวเตอร์จ๋า]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[iteration]]></category>
		<category><![CDATA[list]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=107</guid>
		<description><![CDATA[คุณเคยต้องเขียนโปรแกรมที่วนลูปบน list แล้วลบ &#8220;ของ (object)&#8221; ออกจาก list นั้นหรือไม่? ลองยกตัวอย่างโปรแกรมง่ายๆ สมมติให้ list A เก็บเลขจำนวนเต็ม แล้วคุณต้องการลบเลขที่หารสามลงตัว ออกจาก list A โค้ดของคุณก็อาจจะเป็น Python C# A = &#91;1, 2, 3, 6, 7, 9, 12&#93; for x in A: if x % 3 == 0: A.remove&#40;x&#41; List&#60;int&#62; A = new List&#60;int&#62;&#40;new int&#91;&#93;&#123;1, 2, 3, 6, 7, 9, 12&#125;&#41;; foreach&#40;int x in [...]]]></description>
			<content:encoded><![CDATA[<p>คุณเคยต้องเขียนโปรแกรมที่วนลูปบน list แล้วลบ &#8220;ของ (object)&#8221; ออกจาก list นั้นหรือไม่? ลองยกตัวอย่างโปรแกรมง่ายๆ สมมติให้ list A เก็บเลขจำนวนเต็ม แล้วคุณต้องการลบเลขที่<strong>หารสามลงตัว</strong> ออกจาก list A โค้ดของคุณก็อาจจะเป็น</p>
<table border="0" width="100%">
<tbody>
<tr>
<th>Python</th>
<th>C#</th>
</tr>
<tr>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">A = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">3</span>, <span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">9</span>, <span style="color: #ff4500;">12</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> A:
    <span style="color: #ff7700;font-weight:bold;">if</span> x <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">3</span> == <span style="color: #ff4500;">0</span>:
        A.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span></pre></div></div>

</td>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">List<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span> A <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> <span style="color: #FF0000;">int</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#123;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">2</span>, <span style="color: #FF0000;">3</span>, <span style="color: #FF0000;">6</span>, <span style="color: #FF0000;">7</span>, <span style="color: #FF0000;">9</span>, <span style="color: #FF0000;">12</span><span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">foreach</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> x <span style="color: #0600FF;">in</span> A<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">%</span> <span style="color: #FF0000;">3</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
        A.<span style="color: #0000FF;">Remove</span><span style="color: #000000;">&#40;</span>x<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

</td>
</tr>
</tbody>
</table>
<p>ในบล็อกนี้ขออนุญาตยกตัวอย่างแค่ 2 ภาษา คือ Python และ C# นะครับ สำหรับฝั่ง C# จะเจอกับ &#8220;Unhandled Exception: System.InvalidOperationException: Collection was modified;&#8221; (เขาบอกว่า เกิดการกระทำที่ไม่ถูกต้อง เนื่องจาก list ถูกแก้ไขระหว่างวนลูป) ส่วนคนใช้ Python จะไม่เจอปัญหาอะไรเวลารันครับ แต่พอลองพิมพ์ A ออกมาดูจะพบว่า</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">A = <span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">6</span>, <span style="color: #ff4500;">7</span>, <span style="color: #ff4500;">12</span><span style="color: black;">&#93;</span></pre></div></div>

<p>แงว&#8230; ทำไม 6 กับ 12 ยังโผล่ออกมา? ในเมื่อมันน่าจะ mod 3 ลงตัว&#8230; ในบล็อกนี้เราจะมาดูวิธีแก้ปัญหาที่มักจะเจอบ่อยๆ ปัญหานี้กันครับ</p>
<p><span id="more-107"></span>ปัญหาที่เจอใน Python คือ เลขจำนวนเต็มที่หารสามลงตัว ไม่โดนลบออกไปทุกตัว สาเหตุคือ ในการวนลูปบน list python จะมีตัวชี้ index ของ list สร้างขึ้นมา และในการวนลูปแต่ละรอบ index จะต้องโดนขยับไป 1 เสมอ ดังนั้นเมื่อตัวเลขโดนลบไป ตัวเลขอื่นๆ ที่อยู่ต่อท้ายจะเลื่อนมาแทนที่ตัวที่หายไป แล้วตัวที่เลื่อนมาแทนที่เนี่ยแหละครับ จะโดนข้ามไป (ไม่โดนตรวจสอบ)&#8230;. ถ้างง ลองดูตัวอย่างต่อไปนี้ครับ</p>
<table border="0" cellpadding="2">
<tbody>
<tr>
<td width="40%">

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">A = <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">2</span> <span style="color: #ff4500;">3</span> <span style="color: #ff4500;">6</span> <span style="color: #ff4500;">7</span> <span style="color: #ff4500;">9</span> <span style="color: #ff4500;">12</span></pre></div></div>

</td>
<td>พิจารณา A[0] คือ 1 หารสาม ไม่ลงตัว</td>
</tr>
<tr>
<td>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">A = <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">2</span> <span style="color: #ff4500;">3</span> <span style="color: #ff4500;">6</span> <span style="color: #ff4500;">7</span> <span style="color: #ff4500;">9</span> <span style="color: #ff4500;">12</span></pre></div></div>

</td>
<td>พิจารณา A[1] คือ 2 หารสาม ไม่ลงตัว</td>
</tr>
<tr>
<td>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">A = <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">2</span> <span style="color: #ff4500;">3</span> <span style="color: #ff4500;">6</span> <span style="color: #ff4500;">7</span> <span style="color: #ff4500;">9</span> <span style="color: #ff4500;">12</span></pre></div></div>

</td>
<td>พิจารณา A[2] คือ 3 หารสามลงตัว ลบทิ้ง!</td>
</tr>
<tr>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">A = <span style="color: #ff4500;">1</span> <span style="color: #ff4500;">2</span> <span style="color: #ff4500;">6</span> <span style="color: #ff4500;">7</span> <span style="color: #ff4500;">9</span> <span style="color: #ff4500;">12</span></pre></div></div>

</td>
<td>list A กลายเป็นแบบนี้ จะเห็นว่า 6 เลื่อนมาอยู่ที่ A[2] แต่ python ก็ยังเลื่อน index ไปหนึ่งช่อง ไปพิจารณา A[3] เลย ทำให้เลข 6 โดนข้ามไป<br />
&#8230;</td>
</tr>
</tbody>
</table>
<p>จะเห็นว่ามีกรณีแบบนี้เกิดขึ้นได้ใน python และคนเขียนโปรแกรมก็ไม่รู้ว่าเกิดปัญหาขึ้นเลย (นอกจากมาดูผลลัพธ์) ดังนั้นใน C# เขาจึงห้ามวนลูปแบบ foreach แล้วแก้ไขข้อมูลใน list (เกิด InvalidOperationException นั่นเอง) ในเมื่อ foreach ใช้ไม่ได้ ขอลักไก่ใช้ for ธรรมดาแทนได้มั้ย? คำตอบคือ ไม่ได้ครับ ถ้าลองเขียนแล้วจะเจอปัญหาเหมือนกับที่เจอใน Python ครับ</p>
<h2>แล้วเราจะแก้ปัญหานี้ยังไงดีหละ?</h2>
<p>แบ่งได้เป็น 3 วิธีที่เจอบ่อยๆ ครับ</p>
<h3>1. สร้าง List อีกอันมาเก็บเฉพาะผลลัพธ์ที่ต้องการ</h3>
<p>วิธีนี้ง่ายๆ ตรงๆ เลยครับ ในเมื่อมี list A แล้วเราต้องการเฉพาะเลขที่หารสามไม่ลงตัว แล้วใช้ list ใหม่เป็นคำตอบ เราก็เขียนโปรแกรมประมาณนี้ได้เลยครับ</p>
<table border="0" width="100%" cellpadding="2">
<tbody>
<tr>
<th width="50%">Python</th>
<th>C#</th>
</tr>
<tr>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">B = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> A:
    <span style="color: #ff7700;font-weight:bold;">if</span> x <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">3</span> <span style="color: #66cc66;">&lt;&gt;</span> <span style="color: #ff4500;">0</span>:
        B.<span style="color: black;">append</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span></pre></div></div>

</td>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">List B <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">foreach</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> x <span style="color: #0600FF;">in</span> A<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>x <span style="color: #008000;">%</span> <span style="color: #FF0000;">3</span> <span style="color: #008000;">!=</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
	B.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>x<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

</td>
</tr>
</tbody>
</table>
<p>อ่าวๆๆแบบนี้ โปรแกรมก็ต้อง copy ตัวเลขทุกตัว ไปใส่ list B แทน ซึ่งมันต้องทำงานช้าแน่ๆ เลย สมมติว่าเราต้องการลบเลขแค่ตัวเดียวใน list A แต่ดันต้อง copy ตัวที่ต้องการเก็บไว้ไปใส่ใน list B ซึ่งเสียเวลาทำงานตั้งนาน (แต่! จะเร็วกว่าวิธีอื่นๆ ถ้ามีตัวเลขที่ต้องโดนลบเยอะๆ ครับ)</p>
<p>งั้นไปดูวิธีที่สองดีกว่า</p>
<h3>2. วนลูปในตัวก๊อบปี้ของ List</h3>
<p>วิธีนี้คือ สร้างตัวก๊อบปี้ของ List (เอาตัวเลขทุกตัว) มาเลยครับ เอามาใช้วนลูป แล้วเวลาลบข้อมูลก็ลบใน list ของจริง ผลลัพธ์ก็จะเก็บอยู่ใน list A ตามปกติ</p>
<table border="0" width="100%" cellpadding="2">
<tbody>
<tr>
<th width="50%">Python</th>
<th>C#</th>
</tr>
<tr>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> A<span style="color: black;">&#91;</span>:<span style="color: black;">&#93;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> x <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">3</span> == <span style="color: #ff4500;">0</span>:
        A.<span style="color: black;">remove</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span></pre></div></div>

</td>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">foreach</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> x <span style="color: #0600FF;">in</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>A<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>x <span style="color: #008000;">%</span> <span style="color: #FF0000;">3</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
	A.<span style="color: #0000FF;">Remove</span><span style="color: #000000;">&#40;</span>x<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

</td>
</tr>
<tr>
<td><strong>อธิบายเพิ่มเติม:</strong>A[:] คือการสร้างตัวก๊อบปี้ของ list A ครับ</td>
<td><strong>อธิบายเพิ่มเติม:</strong>new List(A) คือการสร้างตัวก๊อบปี้ของ list A ครับ</td>
</tr>
</tbody>
</table>
<p>หลายๆ คนคงจะเห็นว่า มันก็คล้ายๆ กับวิธีที่ 1 แหละน๊า&#8230; แค่สร้างตัวก๊อบปี้ไว้วนลูป ต้องเสียเวลาสร้างตัวก๊อบปี้เหมือนกันไม่ใช่เรอะ?&#8230; ฮึ่ม! งั้นลองไปดูวิธีที่ 3 กันครับ</p>
<h3><strong>3. วนลูปถอยหลัง</strong></h3>
<p>ในเมื่อวนลูปจากหน้าไปหลัง (0 ไปจนถึงขนาดของ list) จะมีปัญหาเพราะว่า ตัวเลขใน list จะเลื่อนมาแทนที่ตัวที่ถูกลบ ดังนั้นเราแก้ปัญหาโดย<strong>วนลูปถอยหลัง</strong> แทนครับ นั่นก็คือ วนลูปจากขนาดของ list มาจนถึง 0 นั่นเอง</p>
<table border="0" width="100%" cellpadding="2">
<tbody>
<tr>
<th width="50%">Python</th>
<th>C#</th>
</tr>
<tr>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">reversed</span><span style="color: black;">&#40;</span><span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>A<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> x <span style="color: #66cc66;">%</span> <span style="color: #ff4500;">3</span> == <span style="color: #ff4500;">0</span>:
        <span style="color: #ff7700;font-weight:bold;">del</span> A<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span></pre></div></div>

</td>
<td valign="top">

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF;">for</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> A.<span style="color: #0000FF;">Count</span> <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&gt;=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i<span style="color: #008000;">--</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>A<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span> <span style="color: #008000;">%</span> <span style="color: #FF0000;">3</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span>
	A.<span style="color: #0000FF;">RemoveAt</span><span style="color: #000000;">&#40;</span>i<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

</td>
</tr>
</tbody>
</table>
<p>จากตัวอย่างโค้ดจะเห็นว่าเราใช้ del A[i] และ A.RemoveAt(i) เพื่อลบตัวเลข <strong>ที่ตำแหน่งใดๆ</strong> แทนที่จะใช้ Remove ที่ใช้ลบ<strong>ค่าใดๆ</strong> จะเห็นว่าวิธีที่สามนั้นน่าจะทำงานได้เร็วกว่าวิธีที่ 1 และ 2 เพราะไม่ต้องสร้างตัวก๊อบปี้ของ list นั่นเอง</p>
<h2>สรุป</h2>
<p>จากบล็อกนี้เราได้เรียนรู้วิธีแก้ปัญหาที่เกิดขึ้นจากการวนลูป แล้วลบ &#8220;ของ&#8221; ออกจาก list โดยแบ่งออกเป็น 3 วิธีที่เจอบ่อยๆ ซึ่งแต่ละวิธีก็มีประสิทธิภาพแตกต่างกันไปขึ้นกับการนำไปใช้ และความแตกต่างของแต่ละภาษา ใครชอบใครถนัดวิธีไหนก็เลือกไปใช้ตามสะดวก <img src='http://nattster.siamdev.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2>ส่วนตั๊วส่วนตัวจากคนเขียน</h2>
<p>ปล. สาเหตุที่มานั่งเขียน blog นี้เพราะผมเขียนโปรแกรมไปแล้วก็เจอ bug&#8230; คือ &#8220;ของ&#8221; ใน list มันโดนลบออกไปไม่หมด (แต่ python ไม่ยอมเตือนเหมือน C# หง่ะ!!) ก็เลยนั่งหา bug จนมาเจอ&#8230; เอาเป็นว่า เพื่อนๆ คนอื่นที่อ่านมาเจอบล็อกนี้แล้ว คงไม่พลาดแบบผมละกันครับ</p>
<p>ปล2. เพิ่งรู้ว่าใช้ reversed() แล้วโค้ดสวยกว่าเดิมเยอะเลย ปกติเวลาต้องการวนลูปจากมากไปน้อย (9 ถึง 0) ก็เขียนโค้ดน่าเกลียดๆ แบบนี้</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">9</span>, -<span style="color: #ff4500;">1</span>, -<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> i</pre></div></div>

<p>พอเขียนบล็อกนี้แล้วเพิ่งรู้ว่าเขียนเป็น</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">reversed</span><span style="color: black;">&#40;</span><span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">print</span> i</pre></div></div>

<p>สวยกว่าเยอะเลย <img src='http://nattster.siamdev.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>ปล3. ใครอยากให้เขียนบล็อก แล้วยกตัวอย่างภาษาอื่นๆ นอกจาก Python และ C# ช่วยทิ้งคอมเม็นท์ไว้ด้วยครับ</p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2008/10/iterate-and-remove-item-from-list/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>scanf ทั้งบรรทัด</title>
		<link>http://nattster.siamdev.net/2008/09/line-scanf/</link>
		<comments>http://nattster.siamdev.net/2008/09/line-scanf/#comments</comments>
		<pubDate>Thu, 18 Sep 2008 13:34:10 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[คอมพิวเตอร์จ๋า]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=75</guid>
		<description><![CDATA[เคยอยากอ่านข้อมูลใส่ string ทีเดียวทั้งบรรทัดมั้ยครับ? ใช้ scanf(&#8220;%s&#8221;, &#8230;); ก็อ่านได้เฉพาะบรรทัดที่ไม่มีเว้นวรรคเท่านั้น จะใช้ gets() ก็พอช่วยได้ แต่ติดปัญหาที่ว่า พอใช้งานร่วมกับ scanf อื่นๆ แล้วเจอปัญหามากมาย นายนิน PJ ก็ชี้ทางสว่างว่า scanf ก็สามารถอ่านข้อความได้ทั้งบรรทัดเหมือนกัน โดยใช้ modifier นิดหน่อยกับ scanf ตามตัวอย่างนี้ scanf&#40;&#34;%[^\n]&#34;, myString&#41;; โอ้โห..สุดยอด ทำไมมันง่ายจัง&#8230; ก่อนหน้านี้เคยเสียเวลาเขียน function อ่านค่าทีละตัวอักษร ใส่ string เอง ขอบคุณท่าน นิน PJ ครับ&#8230; อ้อ ใครอยากรู้เรื่องเกี่ยวกับ scanf เพิ่มเติมก็เรียกคำสั่งนี้เลยครับ $ man scanf Reference ฉบับอ่านง่าย: บล็อกพี่อิ๊กเรื่อง scanf 102]]></description>
			<content:encoded><![CDATA[<p>เคยอยากอ่านข้อมูลใส่ string ทีเดียวทั้งบรรทัดมั้ยครับ?</p>
<p>ใช้ scanf(&#8220;%s&#8221;, &#8230;); ก็อ่านได้เฉพาะบรรทัดที่ไม่มีเว้นวรรคเท่านั้น<br />
จะใช้ gets() ก็พอช่วยได้ แต่ติดปัญหาที่ว่า พอใช้งานร่วมกับ scanf อื่นๆ แล้วเจอปัญหามากมาย</p>
<p>นายนิน PJ ก็ชี้ทางสว่างว่า scanf ก็สามารถอ่านข้อความได้ทั้งบรรทัดเหมือนกัน โดยใช้ modifier นิดหน่อยกับ scanf ตามตัวอย่างนี้</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">scanf<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%[^<span style="color: #000099; font-weight: bold;">\n</span>]&quot;</span><span style="color: #339933;">,</span> myString<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>โอ้โห..สุดยอด ทำไมมันง่ายจัง&#8230; ก่อนหน้านี้เคยเสียเวลาเขียน function อ่านค่าทีละตัวอักษร ใส่ string เอง ขอบคุณท่าน นิน PJ <img src='http://nattster.siamdev.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  ครับ&#8230; อ้อ ใครอยากรู้เรื่องเกี่ยวกับ scanf เพิ่มเติมก็เรียกคำสั่งนี้เลยครับ</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">man</span> scanf</pre></div></div>

<p>Reference ฉบับอ่านง่าย: <a href="http://eigx.wordpress.com/2009/09/29/scanf-102">บล็อกพี่อิ๊กเรื่อง scanf 102</a></p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2008/09/line-scanf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ทำหน้าต่าง Now Loading (กำลังโหลด) ใน C# แบบง่ายๆ</title>
		<link>http://nattster.siamdev.net/2008/08/simple-now-loading-windows-in-csharp/</link>
		<comments>http://nattster.siamdev.net/2008/08/simple-now-loading-windows-in-csharp/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 20:10:48 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[คอมพิวเตอร์จ๋า]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[threading]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=32</guid>
		<description><![CDATA[เวลาเขียน Windows Forms Application ใน C# แล้วโปรแกรมต้องทำงานนานๆ หน้าต่างโปรแกรมก็จะค้างไปเลย (บางทีก็ขึ้น Not responding) เรามาลองสร้างหน้าต่าง Now Loading ให้โผล่ขึ้นมาบอกว่า &#8220;โปรแกรมกำลังทำงานอยู่นะ&#8221; โปรแกรมของเราจะได้เป็นมิตรกับผู้ใช้มากขึ้น (user-friendly) ดีกว่า&#8230; ต่อไปนี้เป็นวิธีสร้างหน้าต่าง Now loading แบบง่ายๆ โดยใช้ Threading เข้ามาช่วยนิดหน่อย ลองทำตามดูเลยก็ได้นะครับ 1. อันดับแรก ก็สร้างโปรเจคใหม่ขึ้น เป็นแบบ Windows Forms Application 2. ผมก็ออกแบบหน้าต่างหลัก ดังนี้ (เป็นโปรแกรมคำนวณลำดับเลข fibonacci ครับ) มี button1 กับ listBox1 ครับ 3. สร้างหน้าต่างใหม่ ผมตั้งชื่อว่า ProgressForm (เป็นหน้าต่าง Now loading นั่นเองครับ) ในหน้าต่างนี้ประกอบด้วย label [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://nattster.siamdev.net/wp-content/uploads/2008/08/loading_screen.png" title="หน้าต่าง Now Loading" rel="lightbox[32]"><img class="alignnone size-medium wp-image-36" title="หน้าต่าง Now Loading" src="http://nattster.siamdev.net/wp-content/uploads/2008/08/loading_screen-280x300.png" alt="" width="280" height="300" align="left" /></a>เวลาเขียน Windows Forms Application ใน C# แล้วโปรแกรมต้องทำงานนานๆ หน้าต่างโปรแกรมก็จะค้างไปเลย (บางทีก็ขึ้น Not responding) เรามาลองสร้างหน้าต่าง Now Loading ให้โผล่ขึ้นมาบอกว่า &#8220;โปรแกรมกำลังทำงานอยู่นะ&#8221; โปรแกรมของเราจะได้เป็นมิตรกับผู้ใช้มากขึ้น (user-friendly) ดีกว่า&#8230;</p>
<p><span id="more-32"></span></p>
<p>ต่อไปนี้เป็นวิธีสร้างหน้าต่าง Now loading แบบง่ายๆ โดยใช้ Threading เข้ามาช่วยนิดหน่อย ลองทำตามดูเลยก็ได้นะครับ</p>
<p>1. อันดับแรก ก็สร้างโปรเจคใหม่ขึ้น เป็นแบบ Windows Forms Application</p>
<p>2. ผมก็ออกแบบหน้าต่างหลัก ดังนี้ (เป็นโปรแกรมคำนวณลำดับเลข fibonacci ครับ)</p>
<p><a href="http://nattster.siamdev.net/wp-content/uploads/2008/08/loading_main.png" title="หน้าต่างโปรแกรมคำนวณลำดับ Fibonacci" rel="lightbox[32]"><img class="alignnone size-medium wp-image-34" title="หน้าต่างโปรแกรมคำนวณลำดับ Fibonacci" src="http://nattster.siamdev.net/wp-content/uploads/2008/08/loading_main-280x300.png" alt="" width="280" height="300" /></a></p>
<p>มี button1 กับ listBox1 ครับ</p>
<p>3. สร้างหน้าต่างใหม่ ผมตั้งชื่อว่า ProgressForm (เป็นหน้าต่าง Now loading นั่นเองครับ)</p>
<p><a href="http://nattster.siamdev.net/wp-content/uploads/2008/08/loading_progress.png" title="หน้าต่าง ProgressForm" rel="lightbox[32]"><img class="alignnone size-medium wp-image-35" title="หน้าต่าง ProgressForm" src="http://nattster.siamdev.net/wp-content/uploads/2008/08/loading_progress-300x132.png" alt="" width="300" height="132" /></a></p>
<p>ในหน้าต่างนี้ประกอบด้วย label 1 อันแสดงข้อความ Now Loading&#8230; และ progressBar โดยกำหนด คุณสมบัติของ progressBar ให้ Style เป็น Marquee และ MarqueeAnimationSpeed เป็น 50 (เพื่อให้ progressBar มันวิ่งไปเรื่อยๆ แบบตอนเราเปิดเครื่องคอมพิวเตอร์น่ะครับ)</p>
<p>4. กลับไปเขียนคำสั่งที่ฟอร์มแรกครับ</p>
<p>ผมเพิ่ม 1 function เอาไว้ใช้คำนวณค่าลำดับ Fibonacci ดังนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #FF0000;">long</span> fib<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> n<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>n <span style="color: #008000;">&lt;=</span> <span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
    <span style="color: #0600FF;">return</span> fib<span style="color: #000000;">&#40;</span>n <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">+</span> fib<span style="color: #000000;">&#40;</span>n <span style="color: #008000;">-</span> <span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p>และเพิ่มคำสั่งในปุ่ม button1 ตามนี้ครับ</p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">// เพิ่มโค้ดส่วนนี้ (อย่าลืม using System.Threading; ด้วยนะครับ)</span>
Thread progressThread <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">delegate</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    ProgressForm progress <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ProgressForm<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    progress.<span style="color: #0000FF;">ShowDialog</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
progressThread.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// โค้ดที่ทำงานนานๆ</span>
listBox1.<span style="color: #0000FF;">Items</span>.<span style="color: #0000FF;">Clear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">40</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    listBox1.<span style="color: #0000FF;">Items</span>.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">String</span>.<span style="color: #0000FF;">Format</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;fib({0}) = {1}&quot;</span>, i, fib<span style="color: #000000;">&#40;</span>i<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
    listBox1.<span style="color: #0000FF;">SelectedIndex</span> <span style="color: #008000;">=</span> listBox1.<span style="color: #0000FF;">Items</span>.<span style="color: #0000FF;">Count</span> <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// เมื่อทำงานเสร็จแล้ว อย่าลืมเรียกคำสั่งนี้ (ปิดหน้าต่าง loading)</span>
progressThread.<span style="color: #0000FF;">Abort</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span></pre></div></div>

<p>อ้ออย่าลืม ใส่ using System.Threading; ด้านบนของโปรแกรมด้วยนะครับ</p>
<p>หลักการทำงานก็คือ เมื่อเรากดปุ่ม button1 แล้ว เราจะสร้าง Thread ใหม่ขึ้นมา (progressThread) โดย Thread นี้ทำหน้าที่ แสดงหน้าต่าง ProgressForm ขึ้นมา หลังจากนั้น เราก็เขียนโค้ดตรงส่วนที่ต้องทำงานนานๆ (ในที่นี้คือโค้ดคำนวณลำดับ Fibonacci ซึ่งเขียนแบบ recursive จะได้ใช้เวลามากๆ) หลังจากที่ทำงานเสร็จแล้วเรา Abort Thread เพื่อปิดหน้าต่าง Now Loading ไป ครับ</p>
<p>เท่านี้เราก็สามารถสร้างหน้าต่าง Now loading แบบง่ายๆ ได้แล้วครับ จริงๆ แล้วถ้าเราจะทำหน้าต่าง Now loading ให้สมบูรณ์แบบ (เช่นแสดงสถานะเป็น percent หรือ มีปุ่ม cancel ในหน้าต่าง now loading) เราจำเป็นต้องเขียนโปรแกรมที่ซับซ้อนขึ้นกว่านี้อีกนิดหน่อยครับ (เอาเป็นว่าถ้าสนใจ ก็ทิ้ง comment ไว้นะครับ จะได้มาเขียนเพิ่มเติมครับ <img src='http://nattster.siamdev.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>อ้อ เกือบลืมไปครับ สำหรับใครที่&#8230;งงๆ ลองโหลดโค้ดโปรแกรมที่ใช้งานได้ไปดูก็ได้ครับ เขียนใน <a href="http://msdn.microsoft.com/th-th/express/default(en-us).aspx">Microsoft Visual C# 2008 Express Edition</a> ครับ</p>
<p><a href="http://nattster.siamdev.net/wp-content/uploads/2008/08/nowloading.zip">โค้ดโปรแกรม Now Loading (42kb)<br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2008/08/simple-now-loading-windows-in-csharp/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
