<?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>Sun, 25 Dec 2011 05:13:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>เขาทำ progress ใน terminal กันยังไงหว่า?</title>
		<link>http://nattster.siamdev.net/2011/06/c-progress-terminal/</link>
		<comments>http://nattster.siamdev.net/2011/06/c-progress-terminal/#comments</comments>
		<pubDate>Thu, 02 Jun 2011 15:43:55 +0000</pubDate>
		<dc:creator>nattster</dc:creator>
				<category><![CDATA[คอมพิวเตอร์จ๋า]]></category>
		<category><![CDATA[C]]></category>

		<guid isPermaLink="false">http://nattster.siamdev.net/?p=1244</guid>
		<description><![CDATA[เคยเรียกคำสั่งอะไรใน terminal แล้วมันก็ขึ้นเลข 0%, 10%, 20%, &#8230; 100% ใน terminal ไหม (มันอัพเดทข้อความในบรรทัดเดิมได้เรื่อยๆ&#8230; มันทำยังไงหว่า?) อ่ะนี่ ตัวอักษรสำคัญเลขคือ \r (carriage return) #include&#60;stdio.h&#62; void delay&#40;&#41; &#123; for&#40;int i=0;i&#60;1000000;i++&#41; for&#40;int j=0;j&#60;10;j++&#41;; &#125; int main&#40;&#41; &#123; for&#40;int p=0;p&#60;=100;p++&#41; &#123; delay&#40;&#41;; printf&#40;&#34;\rPercent: %d &#34;, p&#41;; fflush&#40;stdout&#41;; &#125; printf&#40;&#34;\n&#34;&#41;; return 0; &#125; งืมๆ&#8230; มาพ่นโค้ด แล้วก็ไป ฮ่าๆ]]></description>
			<content:encoded><![CDATA[<p>เคยเรียกคำสั่งอะไรใน terminal แล้วมันก็ขึ้นเลข 0%, 10%, 20%, &#8230; 100% ใน terminal ไหม (มันอัพเดทข้อความในบรรทัดเดิมได้เรื่อยๆ&#8230; มันทำยังไงหว่า?)</p>
<p>อ่ะนี่ ตัวอักษรสำคัญเลขคือ <a href="http://en.wikipedia.org/wiki/Carriage_return">\r (carriage return)</a></p>

<div class="wp_syntax"><div class="code"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include&lt;stdio.h&gt;</span>
<span style="color: #0000ff;">void</span> delay<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> i<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>i<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">1000000</span><span style="color: #008080;">;</span>i<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span> <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> j<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>j<span style="color: #000080;">&lt;</span><span style="color: #0000dd;">10</span><span style="color: #008080;">;</span>j<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
   <span style="color: #0000ff;">for</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">int</span> p<span style="color: #000080;">=</span><span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>p<span style="color: #000080;">&lt;=</span><span style="color: #0000dd;">100</span><span style="color: #008080;">;</span>p<span style="color: #000040;">++</span><span style="color: #008000;">&#41;</span>
   <span style="color: #008000;">&#123;</span>
       delay<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\r</span>Percent: %d &quot;</span>, p<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
       <span style="color: #0000dd;">fflush</span><span style="color: #008000;">&#40;</span><span style="color: #0000ff;">stdout</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #008000;">&#125;</span>
   <span style="color: #0000dd;">printf</span><span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
   <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></div></div>

<p>งืมๆ&#8230; มาพ่นโค้ด แล้วก็ไป ฮ่าๆ<br />
<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2011/06/c-progress-terminal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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" rel="lightbox[364]" title="msn_spam"><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 เราดีจริง หะๆ<!-- PHP 5.x --></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" rel="lightbox[287]" title="นอนเล่นคอมฯ"><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" rel="lightbox[287]" title="ไปแอบสอนนิ๊สนึงด้วยคับ"><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" rel="lightbox[287]" title="ไปลองเล่นเกมส์ TYPING SHOOTER ของน้อง"><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 มิ.ย. นี้ครับ)<!-- PHP 5.x --></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' /><br />
<!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2009/03/reverse-bit-order/feed/</wfw:commentRss>
		<slash:comments>2</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)<!-- PHP 5.x --></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" rel="lightbox[142]" title="IEEE754 representation of 0.15625 (Ref: wikipedia.org)"><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 ฮ่าๆ<!-- PHP 5.x --></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 ไม่เท่ากันนะครับ<!-- PHP 5.x --></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>)<!-- PHP 5.x --></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: #6666cc; font-weight: bold;">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: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">new</span> <span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">&#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: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">foreach</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> x <span style="color: #0600FF; font-weight: bold;">in</span> A<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">if</span><span style="color: #008000;">&#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: #008000;">&#41;</span>
        A<span style="color: #008000;">.</span><span style="color: #0000FF;">Remove</span><span style="color: #008000;">&#40;</span>x<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#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: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">foreach</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> x <span style="color: #0600FF; font-weight: bold;">in</span> A<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#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: #008000;">&#41;</span>
	B<span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>x<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#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; font-weight: bold;">foreach</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> x <span style="color: #0600FF; font-weight: bold;">in</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span><span style="color: #6666cc; font-weight: bold;">int</span><span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span>A<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#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: #008000;">&#41;</span>
	A<span style="color: #008000;">.</span><span style="color: #0000FF;">Remove</span><span style="color: #008000;">&#40;</span>x<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#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; font-weight: bold;">for</span><span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">int</span> i <span style="color: #008000;">=</span> A<span style="color: #008000;">.</span><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: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>A<span style="color: #008000;">&#91;</span>i<span style="color: #008000;">&#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: #008000;">&#41;</span>
	A<span style="color: #008000;">.</span><span style="color: #0000FF;">RemoveAt</span><span style="color: #008000;">&#40;</span>i<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#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# ช่วยทิ้งคอมเม็นท์ไว้ด้วยครับ<!-- PHP 5.x --></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><!-- PHP 5.x --></p>
]]></content:encoded>
			<wfw:commentRss>http://nattster.siamdev.net/2008/09/line-scanf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

