Archive for ตุลาคม, 2007

list_entry กับ container_of

ในไฟล์ include/linux/list.h

/**
* list_entry – get the struct for this entry
* @ptr:        the &struct list_head pointer.
* @type:       the type of the struct this is embedded in.
* @member:     the name of the list_struct within the struct.
*/
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)

ในไฟล์ include/linux/kernel.h

/**
* container_of – cast a member of a structure out to the containing structure
* @ptr:        the pointer to the member.
* @type:       the type of the container struct this is embedded in.
* @member:     the name of the member within the struct.
*
*/
#define container_of(ptr, type, member) ({                      \
const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
(type *)( (char *)__mptr – offsetof(type,member) );})

list_entry ทำหน้าที่ในการส่งค่าตำแหน่งของ struct ของ entry ที่เก็บตำแหน่งของ list นี้อยู่ (ที่ ptr ชี้อยู่)

1 comment ตุลาคม 16, 2007

การอ้างอิง ประเภทข้อมูลในภาษาซีด้วย typeof

typeof สามารถใช้อ้างอิงประเภทข้อมูลในภาษาซีได้ typeof ไม่ใช่ syntax ที่เป็น ANSI C แต่ว่าเป็น syntax ที่เพิ่มเข้ามากับ gcc ดังนั้นจะใช้ได้ก็ต้องใช้ gcc ในการคอมไพล์

ตัวอย่างนี่เป็นตัวอย่างการนำเอา typeof มาใช้เขียน macro ในการหาค่ามากกว่า น้อยกว่า

test.h

#define max(x,y) \
({ typeof (x) _x = (x); \
typeof (y) _y = (y); \
_x > _y ? _x : _y; })


#define min(x,y) \
({ typeof(x) _x = (x); \
typeof(y) _y = (y); \
_x < _y ? _x : _y;})

ตัวอย่างการเรียกใช้งาน

test.c

#include <stdio.h>
#include "test.h"
int main() {
printf("The maximum value of 5 and 4 is %d\\n", max(5,4));
printf("The minimum value of 5 and 4 is %d\\n", min(5,4));
return 0;
}

เข้าไปอ่านคู่มือการใช้งานได้ที่นี่
http://gcc.gnu.org/onlinedocs/gcc/Typeof.html

1 comment ตุลาคม 12, 2007

การแปลงข้อมูลที่อยู่ในรูปแบบ BCD ให้เป็นแบบ Binary

ข้อมูลแบบ BCD จะเข้ารหัสโดยการแทนเลข 0-9 ด้วยบิท 4 บิท เช่น

0000  -  0
0001  -  1
0010  -  2
0011  -  3
0100  -  4
0101  -  5
0110  -  6
0111  -  7
1000  -  8
1001  -  9

ส่วนเลขที่มีหลายหลัก BCD จะเข้ารหัสโดยการ ดูเลขโดดในแต่ละหลัก แล้วนำรหัส 0-9 ลงไปแทน เช่น
23 (ร้อยยี่สิบสาม)  เข้ารหัสแบบ BCD ได้เป็น  0010 0011

ส่วนวิธีการแปลงจาก BCD มาเป็นแบบปกติ คือนับเพิ่มขึ้นไปเรื่อยๆนั้น ทำได้โดย
นำbitแบบ BCD มา and กับ 1111( 15 ฐาน 10 )  ซึ่งจะทำให้ได้เลข 4 บิทขวาสุดออกมา ก็คือหลักหน่วย
ส่วนหลักสิบเราหาได้จากการ shift bit   >> 4  ไปทางขวา 4 บิท แล้วนำมาคูณกับ 10

เขียนเป็น expression ในภาษาซีได้เป็น  bin  =  (bcd&15)+((bcd>>4)*10)

2 comments ตุลาคม 10, 2007

สลับชื่อไฟล์

ไม่มีไรมากก็ใช้ลีนุกซ์ ปกติทุกวัน ปกติจะเปลี่ยนชื่อไฟล์ใน terminal ก็ใช้ mv oldname newname แล้วก็มีเรื่องให้ต้องทำการเปลี่ยนชื่อไฟล์สลับกันไปมา เช่น จาก source.list.bak ไปเป็น source.list แล้วก็ให้ source.list ไปเป็น source.list.bak พูดง่ายๆก็คือสลับชื่อมันระหว่างไฟล์สองไฟล์นั่นเอง ถ้าจะสั่งด้วย mv มันก็จะได้สาม step

mv source.list source.tmp
mv source.list.bak source.list
mv source.tmp source.list.bak

อืม..กรณีนี้อาจได้ใช้บ่อยๆ ก็เลยกะเอาไปเขียนเป็นโปรแกรมซะเลย ??? ใช้อะไรดีละ C ดีมั้ย python หรือ perl เฮ่อๆๆ ไม่จำเป็นต้องขนาดนี้ก็ได้ ใช้ shell script นั่นแหละ ก็เลยเขียน shell script ขึ้นมาตัวนึง ไม่ได้ซับซ้อนอะไร เพราะก็เพิ่งหัดเขียนเหมือนกัน ตั้งชื่อว่า swn.sh swn ย่อมาจาก swap file name เฮ่อๆๆ ไม่รู้มันจะตรงความหมายไหม ช่างมันเถอะ ดูโค้ดละกัน

#!/bin/sh
#รับค่า command line argument ตัวแรก เก็บในตัวแปร file1
file1=$1
#รับค่า command line argument ตัวที่สอง เก็บในตัวแปร file2
file2=$2
#สร้างตัวแปร เก็บชื่อไฟล์ที่ใช้ช่วยในการสลับชื่อ
temp=”tmp”

# เปลี่ยนชื่อ $file1 เป็น $temp
mv $file1 $temp

# เปลี่ยนชื่อ $file2 เป็น $file1
mv $file2 $file1

# เปลี่ยนชื่อ $temp เป็น $file2
mv $temp $file2

เสร็จแล้วก็อย่าลืมเปลี่ยนโหมดให้ execute ได้ โดยสั่ง chmod +x swn.sh แล้วก็ย้ายไปอยู่ใน /usr/bin โดยสั่ง sudo cp swn.sh /usr/bin/swn.sh

เวลาเรียกใช้งานก็ swn.sh file1 file2 จะทำให้ ไฟล์สองไฟล์นี้สลับชื่อกันนั่นเอง

1 comment ตุลาคม 9, 2007

Ubuntu

ใช้ลีนุกซ์มาได้แบบจริงๆจังๆ มาได้ประมาณปีนึงเต็มๆเล้ว รู้สึกว่าชอบถึงชอบมากๆ โดยเฉพาะ distro ที่ชื่อว่าubuntu นี่แหละ เนื่องจากความง่ายในการติดตั้ง และความสามารถในการ ติดตั้งโปรแกรมเพิ่มเติมผ่านทาง apt-get หรือ synaptic มีโปรแกรมมากมายเหลือเกิน ที่สามารถโหลดมาใช้ได้ฟรีๆ และยังมีการอัพเดทตัวโปรแกรมเรื่อยๆอีกต่างหาก ที่ทำได้แบบนี้ก็ต้องยอมรับด้วยว่าเรามี internet ความเร็วสูงให้เล่นไม่ว่าจากของมหาฯลัยแล้วก็ของ TOT ในช่วงที่อยู่สุรสวัสดิ์ Linux มีอะไรให้เล่นอีกเยอะเลยโดยเฉพาะสำหรับคนที่ชอบการเขียนโปรแกรมเช่นผม สภาพแวดล้อมของ Linux เหมาะกับการเขียนโปรแกรมและพัฒนามาก มีเครื่องมือต่างๆพร้อมเพียงทั้ง

editor,compiler,interpreter

อย่างเช่นตอนนี้ที่เราใช้

vi ,gcc,php,python,ruby,ghc

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

fret on fire
stepmania

พอแค่นี้ก่อนครับ เอาไว้จะมาเล่าเรื่องลีนุกซ์อีกแล้วกันครับ

3 comments ตุลาคม 6, 2007


 

ตุลาคม 2007
พฤ อา
    พ.ย. »
1234567
891011121314
15161718192021
22232425262728
293031  

ความเห็นล่าสุด

etcpe9 on Validate Form ด้วย LiveVa…
BraiN on ประสบการณ์ จับใบดำใบแดง
pphetra on Tree In Haskell
phondanai on Tree In Haskell
ืneogravity on About

Meta

Blogroll

cpe9

Linux

programming