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