mdpai

About this author:

System Engineer (Texas Instruments France), Masters in Electronics , Embedded System Engineering,

Contact:

wanmohdfairuz@mckk9903.com

My Articles:

March 1st, 2012

Boot LiveCD ISO berlainan dari USB pendrive dengan Grub2

Anda pasti berminat untuk mengikuti artikel ini jika anda:
1) Mahu mempunyai lebih daripada satu ISO dalam satu USB pendrive.
2) Anda malas untuk konfigurasi USB pendrive untuk menjadikannya bootable dengan LiveUSB creator.
3) Anda mahu boleh copy ISO dari PC anda terus ke dalam USB pendrive.

Langkah 1:
Tukar USBlabel kepada folder USB anda. Tukar /dev/sdx kepada device name USB anda. Langkah ini akan melakukan instalasi grub2 ke dalam MBR USB pendrive anda.

sudo grub-install --root-directory=/media/USBLabel /dev/sdx

Langkah 2:
- Buat fail konfigurasi grub.cfg di dalam /media/USBLabel/boot/grub/

Langkah 3:
- Letak file ISO anda di dalam /media/USBLabel/boot/isos/

menuentry "Ubuntu 11.10 Oneiric" {
    set isofile="/boot/isos/ubuntu-11.10-desktop-i386.iso"
 
    loopback loop $isofile 
    linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash noprompt --
    initrd (loop)/casper/initrd.lz
}

- Ulang langkah 3 bergantung kepada berapa banyak ISO yang anda mahu diletakkan di dalam USB pendrive.

Langkah 4:
- Dah takde langkah dah, tinggal boot je :)

Share
read more
February 29th, 2012

Bina repositori tempatan (LAN) dengan apt-cacher

Artikel ini bersempena dengan Ubuntu Global Jam yang berlangsung dari 2-4 Mac 2012. Pihak loco Malaysia telah memilih beberapa tema yang difikirkan sesuai untuk peserta-peserta dari loco Malaysia seperti upgrade, dokumentasi, packaging, dan juga terjemahan. Untuk tema upgrade, setiap peserta akan melakukan upgrade Ubuntu masing-masing ke versi terbaru Ubuntu iaitu Ubuntu 12.04 Precise Pangolin.

Untuk tema ini, satu masalah yang difirkan akan timbul adalah berkenaan dengan kelajuan muat-turun pakej naik-taraf dan juga saiz pakej-pakej yang akan dimuat-turun. Jadi, salah satu idea yang dibincangkan adalah menggunakan DebMirror. Dengan menggunakan debmirror kita akan memuat-turun keseluruhan repo Ubuntu yang mungkin saiznya mencecah ratusan GB. Jadi idea ini telah diabaikan dan kami telah mengambil keputusan untuk menggunakan apt-cacher.

Idea di sebalik apt-cacher adalah satu mesin akan menjadi cacher dan mesin-mesin lain akan melalui mesin cacher ini untuk melakukan naik-taraf. Sebagai contoh jika di dalam LAN anda mempunyai 4 mesin, PC1, PC2, PC3 dan PC4 dan anda menjadikan PC1 sebagai cacher. Jika PC2, PC3 dan PC4 melakukan naik-taraf, ia akan meminta pakej-pakej yang diperlukan dari PC1. Untuk PC1, jika pakej yang diminta tidak berada dalam cache, ia akan memuat-turun pakej tersebut dan memasukkannya ke dalam ruang cache. Jadi jika ada mesin lain yang meminta pakej yang sama, PC1 tidak perlu lagi memuat-turun pakej tersebut dan boleh terus membekalkan pakej tersebut dari ruang cache.

KONFIGURASI CACHER
1) Instalasi apt-cacher

sudo apt-get install apt-cacher

2) Konfigurasi apt-cacher (tidak wajib)

sudo gedit /etc/apt-cacher/apt-cacher.conf &

3) Menjalankan apt-cacher setiap boot sistem.

sudo gedit /etc/default/apt-cacher &

Tukar AUTOSTART kepada 1.

4) Menjalankan apt-cacher

sudo /etc/init.d/apt-cacher restart

SIAP!

KONFIGURASI CLIENT

1) Backup sources.list

sudo cp /etc/apt/sources.list /etc/apt/sources.list.orig

2) Modifikasi sources.list untuk mengambil pakej dari cacher.

sudo gedit /etc/apt/sources.list &

Masukkan nombor IP cacher ke dalam link repo. Seperti contoh di bawah.

deb http://archive.ubuntu.com/ubuntu oneiric main restricted
deb-src http://archive.ubuntu.com/ubuntu oneiric main restricted

Ditukar menjadi

deb http://192.168.1.13:3142/archive.ubuntu.com/ubuntu oneiric main restricted
deb-src http://192.168.1.13:3142/archive.ubuntu.com/ubuntu oneiric main restricted

Buat untuk semua repo.

3) Update

sudo apt-get update

Contoh output:

Get:1 http://192.168.1.13 precise Release.gpg [198 B]
Get:2 http://192.168.1.13 precise-updates Release.gpg [198 B]
Get:3 http://192.168.1.13 precise-backports Release.gpg [198 B]
Get:4 http://192.168.1.13 precise-security Release.gpg [198 B]
Get:5 http://192.168.1.13 precise Release.gpg [72 B]
Get:6 http://192.168.1.13 precise Release [49.6 kB]
Get:7 http://192.168.1.13 precise-updates Release [28.9 kB]                                                    
Get:8 http://192.168.1.13 precise-backports Release [28.9 kB]                                                  
...
...                                   
Get:73 http://192.168.1.13 precise-security/main Translation-en [14 B]                                         
Get:74 http://192.168.1.13 precise-security/multiverse Translation-en [14 B]                                   
Get:75 http://192.168.1.13 precise-security/restricted Translation-en [14 B]                                   
Get:76 http://192.168.1.13 precise-security/universe Translation-en [14 B]                                     
Ign http://192.168.1.13 precise/main Translation-en_US                                                         
Ign http://192.168.1.13 precise/main Translation-en                                                            
Fetched 16.7 MB in 1min 46s (158 kB/s)                                                                         
Reading package lists... Done

Selamat mencuba!

Share
read more
February 27th, 2012

[Ubuntu] Kompil kernel menggunakan git dari 3.3-rc4 ke 3.3-rc5

Untuk artikel ini, kita akan mengkompil kernel mainline 3.3-rc5 dari Linus dan saya beranggapan yang anda sudah pun mengkompil kernel 3.3-rc4 (3.3-rc4).

1) Masuk pada direktori kernel anda.

cd linux

2) Update kernel tree anda

git pull
remote: Counting objects: 1755, done.
remote: Compressing objects: 100% (462/462), done.
remote: Total 1229 (delta 941), reused 1023 (delta 759)
Receiving objects: 100% (1229/1229), 490.32 KiB | 275 KiB/s, done.
Resolving deltas: 100% (941/941), completed with 288 local objects.
From git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux
   b01543d..3c761ea  master     -> origin/master
From git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux
 * [new tag]         v3.3-rc5   -> v3.3-rc5
Updating b01543d..3c761ea
Fast-forward

3) Langkah ini untuk mengemas kini fail konfigurasi kernel.

yes '' | make oldconfig

4) [tidak wajib] Anda kemudian boleh menukar konfigurasi kernel ini dengan menggunakan arahan di bawah.

make menuconfig

5) Membersihkan direktori kernel

make-kpkg clean

6) Proses kompilasi kernel. Bergantung kepada jumlah core processor anda, ia akan mengambil masa yang berbeza.

CONCURRENCY_LEVEL=`getconf _NPROCESSORS_ONLN` fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

7)

cd ..

8 ) Instalasi kernel

sudo dpkg -i linux-image-3.3.0-rc5-custom-fairuz_3.3.0-rc5-custom-fairuz-10.00.Custom_i386.deb
sudo dpkg -i linux-headers-3.3.0-rc5-custom-fairuz_3.3.0-rc5-custom-fairuz-10.00.Custom_i386.deb
fairuz@themachine:~/build$ sudo dpkg -i linux-image-3.3.0-rc5-custom-fairuz_3.3.0-rc5-custom-fairuz-10.00.Custom_i386.deb
[sudo] password for fairuz: 
Selecting previously deselected package linux-image-3.3.0-rc5-custom-fairuz.
(Reading database ... 352714 files and directories currently installed.)
Unpacking linux-image-3.3.0-rc5-custom-fairuz (from linux-image-3.3.0-rc5-custom-fairuz_3.3.0-rc5-custom-fairuz-10.00.Custom_i386.deb) ...
Examining /etc/kernel/preinst.d/
Done.
Setting up linux-image-3.3.0-rc5-custom-fairuz (3.3.0-rc5-custom-fairuz-10.00.Custom) ...
Running depmod.
Examining /etc/kernel/postinst.d.
run-parts: executing /etc/kernel/postinst.d/dkms 3.3.0-rc5-custom-fairuz /boot/vmlinuz-3.3.0-rc5-custom-fairuz
run-parts: executing /etc/kernel/postinst.d/initramfs-tools 3.3.0-rc5-custom-fairuz /boot/vmlinuz-3.3.0-rc5-custom-fairuz
update-initramfs: Generating /boot/initrd.img-3.3.0-rc5-custom-fairuz
run-parts: executing /etc/kernel/postinst.d/pm-utils 3.3.0-rc5-custom-fairuz /boot/vmlinuz-3.3.0-rc5-custom-fairuz
run-parts: executing /etc/kernel/postinst.d/update-notifier 3.3.0-rc5-custom-fairuz /boot/vmlinuz-3.3.0-rc5-custom-fairuz
run-parts: executing /etc/kernel/postinst.d/zz-update-grub 3.3.0-rc5-custom-fairuz /boot/vmlinuz-3.3.0-rc5-custom-fairuz
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.3.0-rc5-custom-fairuz
Found initrd image: /boot/initrd.img-3.3.0-rc5-custom-fairuz
Found linux image: /boot/vmlinuz-3.3.0-rc4-custom-fairuz+
Found initrd image: /boot/initrd.img-3.3.0-rc4-custom-fairuz+
Found linux image: /boot/vmlinuz-3.3.0-rc3-custom+
Found initrd image: /boot/initrd.img-3.3.0-rc3-custom+
Found linux image: /boot/vmlinuz-3.3.0-rc2-custom
Found initrd image: /boot/initrd.img-3.3.0-rc2-custom
Found linux image: /boot/vmlinuz-3.0.0-16-generic-pae
Found initrd image: /boot/initrd.img-3.0.0-16-generic-pae
Found linux image: /boot/vmlinuz-3.0.0-16-generic
Found initrd image: /boot/initrd.img-3.0.0-16-generic
Found memtest86+ image: /boot/memtest86+.bin
Found Windows 7 (loader) on /dev/sda1
Found Windows 7 (loader) on /dev/sdc1
done
fairuz@themachine:~/build$ sudo dpkg -i linux-headers-3.3.0-rc5-custom-fairuz_3.3.0-rc5-custom-fairuz-10.00.Custom_i386.deb
Selecting previously deselected package linux-headers-3.3.0-rc5-custom-fairuz.
(Reading database ... 356928 files and directories currently installed.)
Unpacking linux-headers-3.3.0-rc5-custom-fairuz (from linux-headers-3.3.0-rc5-custom-fairuz_3.3.0-rc5-custom-fairuz-10.00.Custom_i386.deb) ...
Setting up linux-headers-3.3.0-rc5-custom-fairuz (3.3.0-rc5-custom-fairuz-10.00.Custom) ...
Examining /etc/kernel/header_postinst.d.
run-parts: executing /etc/kernel/header_postinst.d/dkms 3.3.0-rc5-custom-fairuz /boot/vmlinuz-3.3.0-rc5-custom-fairuz

9) Reboot.

sudo reboot

Hasilnya:

fairuz@themachine:~/build$ uname -a
Linux themachine 3.3.0-rc5-custom-fairuz #2 SMP Sun Feb 26 21:48:18 CET 2012 i686 i686 i386 GNU/Linux
Share
read more
February 20th, 2012

[Ubuntu] Kompil kernel menggunakan git dari 3.3-rc3 ke 3.3-rc4

Untuk artikel ini, kita akan mengkompil kernel mainline 3.3-rc4 dari Linus dan saya beranggapan yang anda sudah pun mengkompil kernel 3.3-rc3.

1) Masuk pada direktori kernel anda.

cd linux

2) Update kernel tree anda

git pull

3) Langkah ini untuk mengemas kini fail konfigurasi kernel.

yes '' | make oldconfig

4) [tidak wajib] Anda kemudian boleh menukar konfigurasi kernel ini dengan menggunakan arahan di bawah.

make menuconfig

5) Membersihkan direktori kernel

make-kpkg clean

6) Proses kompil kernel. Bergantung kepada jumlah core processor anda, ia akan mengambil masa yang berlainan.

CONCURRENCY_LEVEL=`getconf _NPROCESSORS_ONLN` fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

7)

cd ..

8 ) Instalasi kernel

sudo dpkg -i linux-image-3.3.0-rc4-custom-fairuz+_3.3.0-rc4-custom-fairuz+-10.00.Custom_i386.deb
sudo dpkg -i linux-headers-3.3.0-rc4-custom-fairuz+_3.3.0-rc4-custom-fairuz+-10.00.Custom_i386.deb

9) Reboot.

sudo reboot

Hasilnya:

fairuz@themachine:~/build$ uname -a
Linux themachine 3.3.0-rc4-custom-fairuz+ #1 SMP Sun Feb 19 19:35:27 CET 2012 i686 i686 i386 GNU/Linux
Share
read more
February 20th, 2012

[Ubuntu] Kompil mainline kernel

Untuk artikel ini, kita akan mengkompil kernel mainline dari Linus untuk digunakan di dalam Ubuntu 11.10. Kita akan cuba untuk mengkompil kernel 3.3-rc3 untuk digunakan di dalam Ubuntu 11.10.

Keperluan:

sudo apt-get install git-core kernel-package fakeroot build-essential ncurses-dev

Kita memerlukan beberapa package untuk memastikan proses kompil berjalan dengan lancar.

1) Masuk direktori yang mana anda kita akan melakukan proses kompil. Saya membuat satu direktori yang saya namakan “build”.

mkdir -p build
cd build

2) Klon kernel mainline git tree. Bergantung kepada kelajuan internet anda, langkah ini mungkin mengambil sedikit masa memandangkan hampir 600MB perlu dimuat turun.

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git

3) Masuk direktori linux.

cd linux

4) Untuk memastikan tiada masalah yang mungkin timbul, kita akan menggunakan konfigurasi kernel Ubuntu (yang sedang anda gunakan) untuk kernel baru ini.

cp /boot/config-`uname -r` .config

5) Langkah ini untuk mengemas kini fail konfigurasi kernel.

yes '' | make oldconfig

6) [tidak wajib] Anda kemudian boleh menukar konfigurasi kernel ini dengan menggunakan arahan di bawah.

make menuconfig

7) Langkah ini untuk mengelak error pada make-dpkg

sed -rie 's/echo "\+"/#echo "\+"/' scripts/setlocalversion

8 ) Membersihkan direktori kernel

make-kpkg clean

9) Proses kompil kernel. Bergantung kepada jumlah core processor anda, ia akan mengambil masa yang berlainan.

CONCURRENCY_LEVEL=`getconf _NPROCESSORS_ONLN` fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers

10)

cd ..

11) Instalasi kernel

sudo dpkg -i linux-image-3.3.0-rc3-custom-fairuz+_3.3.0-rc3-custom-fairuz+-10.00.Custom_i386.deb
sudo dpkg -i linux-headers-3.3.0-rc3-custom-fairuz+_3.3.0-rc3-custom-fairuz+-10.00.Custom_i386.deb

12) Reboot.

sudo reboot

Hasilnya:

fairuz@themachine:~/build$ uname -a
Linux themachine 3.3.0-rc3-custom-fairuz+ #1 SMP Sun Feb 19 19:35:27 CET 2012 i686 i686 i386 GNU/Linux
Share
read more
November 6th, 2011

ZTE MF627 USB modem driver untuk Win 7

Firmware yang dibekalkan dengan modem ZTE MF627 (anda boleh rujuk nombor ini di badan modem anda) untuk Celcom broadband hanya boleh diinstall di Windows XP atau Vista. Jika anda menggunakan Win 7, masalah yang mungkin timbul adalah firmware tersebut tidak akan mengenalpasti simcard anda.

Untuk mengatasi masalah ini, anda perlu menggunakan driver yang lebih terkini (anda masih boleh menggunakan firmware yang sama).

http://mymobile.three.co.uk:8080/downloads/MF627_Windows_7DriverSetup.exe

Jika anda mendapat error 123 ketika proses sambungan (connect), pastikan dalam Setting bahawa anda mempunyai sekurang-kurangnya satu fail konfigurasi. Hanya isi ruangan nombor panggilan. Anda boleh gunakan *99***2# .

Share
read more
November 5th, 2011

kredit RM100 Percuma untuk akaun Adwords

Untuk mendapatkan kredit percuma bernilai RM100 untuk pemasaran produk anda menggunakan Google Adwords, sila daftar dengan menggunakan link berikut.

https://services.google.com/fb/forms/admye100/?utm_source=RMKT

Ianya hanya sah untuk akaun yang berumur kurang dari 14 hari.

P/s : Jika sesiapa yang ada link untuk $100 Adwords, sila tinggalkan link di ruangan komen. terima kasih.

Share
read more
October 25th, 2011

Linked list dalam C

Salah satu jenis struktur data adalah linked list. Dalam bahasa melayunya, linked list adalah data yang bersambungan antara satu sama lain. Setiap elemen linked list dipanggil node. Manakala setiap node terbahagi kepada dua bahagian iaitu bahagian data yang akan menyimpan data dan bahagian sambungan (link) yang berfungsi sebagai penyambung elemen-elemen di dalam linked list ini.

Di dalam bahagian sambungan, biasanya ia terdiri dari hanya satu pembolehubah pointer yang akan merujuk kepada address (lokasi) node seterusnya. Linked list ini dipanggil single-linked linked list. Untuk double-linked linked list, terdapat dua pointer, di mana satu merujuk kepada address node seterusnya dan satu lagi merujuk kepada address node sebelumnya. Rujuk artikel ini untuk pemahaman berkenaan pointer.

Node biasanya adalah struktur C untuk menyimpan lebih daripada satu jenis pemboleh ubah (rujuk artikel ini). Salah satu contoh mudah sebuah node adalah:

struct tnode { 
  int data; 
  struct tnode *next; 
};

Di mana data merujuk kepada bahagian data dan next merujuk kepada bahagian link. Jadi dengan ini kita boleh bayangkan yang kita membuat satu linked list dengan 3 node seperti contoh di bawah.

#include <stdio.h>
#include <stdlib.h>

struct tnode { 
  int data; 
  struct tnode *next; 
};
 
int main(int argc, char *argv[])
{
  struct tnode *node = (struct tnode *)malloc(sizeof(struct tnode));
 
  // menyambung node
  node->data = 100;
  node->next = (struct tnode *)malloc(sizeof(struct tnode));
 
  printf("Data node1 %d \n", node->data);
  printf("Link node1 %p \n", node->next);
  printf("Lokasi node1 %p \n\n", node);
 
  node->next->data = 200;
  node->next->next = (struct tnode *)malloc(sizeof(struct tnode));
 
  printf("Data node2 %d \n", node->next->data);
  printf("Link node2 %p \n", node->next->next);
  printf("Lokasi node2 %p \n\n", node->next);
 
  node->next->next->data = 300;
  node->next->next->next = NULL;
 
  printf("Data node3 %d \n", node->next->next->data);
  printf("Link node3 %p \n", node->next->next->next);
  printf("Lokasi node3 %p \n\n", node->next->next);
 
  system("PAUSE");	
  return 0;
}

Seperti yang boleh digambarkan seperti di bawah.

Berikut adalah hasil output kod di atas setelah dijalankan menggunakan Dev-C++.

Jadi setelah melihat bagaimana linked list berfungsi, mari kita lihat bagaimana membina satu program linked list yang lengkap. Dalam program linked list, saya membayangkan beberapa fungsi yang boleh membantu kita memanipulasi linked list yang dihasilkan.

Membina node baru
Fungsi ini bertujuan untuk memperuntukkan (allocate) ruang memori untuk node baru dan memasukkan data ke dalamnya.

struct tnode * createnode(int data){
    struct tnode * node;
    node = (struct tnode *)malloc(sizeof(struct tnode));
    node->next = NULL;
    node->data = data;
    return node;       
}

Menambah node
Fungsi ini akan menggunakan fungsi createnode di atas dan kemudiannya memasukkan node tersebut ke dalam linked list yang sedia ada di posisi yang diberi.

void tambahnode(int data, int pos)
{
    int i;
    struct tnode *temp, *prev, *current;
 
    current = head;
 
    if(pos > (length()+1) || pos <= 0){
           printf("Posisi tidak sah.\n ");
    }
    else {
         if (pos == 1){
            temp = createnode(data);
            temp->next = head;
            head = temp;
         }
         else{
            for(i=1;i<pos;i++){
                prev = current;
                current = current->next;
            }
 
            temp = createnode(data);
            prev->next = temp;
            temp->next = current;
        }
    }
}

Memaparkan data node
Fungsi ini digunakan untuk memaparkan kesemua data yang terkandung di dalam node-node yang ada.

void paparnode(void){
     struct tnode * current = head;
 
     while(current != NULL) {
          printf("Data node %d \n", current->data);
          printf("Link node %p \n", current->next);
          printf("Lokasi node %p \n\n", current);
          current = current->next;
     }     
}

Mengira jumlah node
Fungsi ini bertujuan untuk memberikan jumlah node yang berada di dalam linked list.

int length(void) {
    struct tnode* current = head;
    int count = 0;
 
    while (current != NULL) {
          count++;
          current = current->next;
    }
    return count;
}

Membuang node
Fungsi ini bertujuan untuk membuang node di posisi yang ditetapkan.

void deletenode(int pos){
     struct tnode * current = head;
     struct tnode * prev;
     int i;
 
     if(pos > (length()) || pos <= 0){
            printf("Posisi tidak sah.\n");
     } 
     else {
          if(pos == 1){
              head = current->next;
              free(current);     
          } 
          else{
               for(i=1; i<pos; i++) {
                   prev = current;
                   current = current->next;
               }      
               prev->next = current->next;
               free(current);
          }
     }    
}

Jika kita gabungkan kesemua fungsi-fungsi di atas, kita sudahpun mempunyai satu program linked list yang lengkap.

#include <stdio.h>
#include <stdlib.h>

struct tnode { 
    int data; 
    struct tnode *next; 
} *head;
 
struct tnode * createnode(int data){
    struct tnode * node;
    node = (struct tnode *)malloc(sizeof(struct tnode));
    node->next = NULL;
    node->data = data;
    return node;       
}
 
void tambahnode(int data, int pos)
{
    int i;
    struct tnode *temp, *prev, *current;
 
    current = head;
 
    if(pos > (length()+1) || pos <= 0){
           printf("Posisi tidak sah.\n ");
    }
    else {
         if (pos == 1){
            temp = createnode(data);
            temp->next = head;
            head = temp;
         }
         else{
            for(i=1;i<pos;i++){
                prev = current;
                current = current->next;
            }
 
            temp = createnode(data);
            prev->next = temp;
            temp->next = current;
        }
    }
 }
 
void paparnode(void){
     struct tnode * current = head;
     printf("*****************************\n");
     while(current != NULL) {
          printf("Data node %d \n", current->data);
          printf("Link node %p \n", current->next);
          printf("Lokasi node %p \n\n", current);
          current = current->next;
     }     
}
 
int length(void) {
    struct tnode* current = head;
    int count = 0;
    while (current != NULL) {
          count++;
          current = current->next;
    }
    return count;
}
 
void deletenode(int pos){
     struct tnode * current = head;
     struct tnode * prev;
     int i;
 
     if(pos > (length()) || pos <= 0){
            printf("Posisi tidak sah.\n");
     } 
     else {
          if(pos == 1){
              head = current->next;
              free(current);     
          } 
          else{
               for(i=1; i<pos; i++) {
                   prev = current;
                   current = current->next;
               }      
               prev->next = current->next;
               free(current);
          }
     }    
}
 
int main(int argc, char *argv[])
{
    head = NULL;   
 
    tambahnode(100, 1);
    tambahnode(200, 1);
    tambahnode(300, 1);
    tambahnode(400, length() + 1);
 
    paparnode();
    deletenode(3);
    paparnode();
 
    system("PAUSE");	
    return 0;
}
Share
read more
October 18th, 2011

Struktur Data (data structure)

Dalam dunia sains komputer, struktur data adalah satu cara untuk menyimpan dan mengurus data supaya ianya boleh digunakan dengan efisien. Terdapat pelbagai struktur data yang biasa digunakan seperti linked-list, hash tables, tree dan queue.

Untuk sesebuah struktur data, kita memerlukan beberapa fungsi seperti fungsi masuk, fungsi padam yang akan membenarkan kita untuk membina dan memanipulasi struktur data tersebut.

Share
read more
October 18th, 2011

Pointer dalam C

Terdapat satu pembolehubah khas yang dinamakan pointer yang digunakan secara meluas dalam C. Pelajar yang mempelajari C biasanya mempunyai masalah dengan pointer kerana dikatakan susah difahami. Saya akan cuba mengatasi masalah ini dengan menggunakan pendekatan yang berlainan dengan menggunakan gambarajah.

Jika kita lihat analogi pembolehubah di artikel ini, ia juga boleh diaplikasikan di sini tapi bezanya, pointer hanya boleh menyimpan lokasi pembolehubah lain.

Untuk lebih memahami pointer, kita boleh lihat contoh di bawah di mana kita mempunyai satu pembolehubah dan satu pointer. Kita akan menganggap lokasi memori untuk pembolehubah harga adalah 0×3333 manakala lokasi pointer ptr adalah 0×1234.

int harga = 500;
int * ptr = &harga;

int harga = 500 akan menghasilkan kotak bernama harga yang mengandungi angka 500. Manakala int * ptr akan menghasilkan pointer yang mengandungi lokasi pembolehubah harga (&harga merujuk kepada lokasi harga). Jika lokasi harga adalah 0×3333, jadi 0×3333 lah yang akan terkandung di dalam kotak ptr seperti gambarajah di atas.

Memandangkan kotak ptr mengandungi lokasi kotak harga, bagaimana jika kita mahu menukar nilai harga dengan menggunakan pembolehubah pointer ptr? Jawapannya adalah dengan menggunakan *ptr. *ptr merujuk kepada nilai di dalam kotak yang dirujuk oleh kotak ptr. Jadi dalam kes di atas, *ptr merujuk kepada nilai 500 di dalam kotak harga.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int harga = 500;
  int * ptr = &harga;
 
  printf("Harga %d \n", harga);
  printf("Harga %d \n", *ptr);
 
  harga = 600;
 
  printf("Harga %d \n", harga);
  printf("Harga %d \n", *ptr);
 
  *ptr = 700;
 
  printf("Harga %d \n", harga);
  printf("Harga %d \n", *ptr);
 
  system("PAUSE");	
  return 0;
}
Harga 500
Harga 500
Harga 600
Harga 600
Harga 700
Harga 700

Kita boleh membayangkan situasi yang sedikit kompleks seperti di bawah:

int a = 100;
int b = 200;
int *c = &a;
int **d = &c;

Yang boleh digambarkan seperti berikut:

di mana nilai a adalah 100, nilai b adalah 200, nilai c adalah lokasi a iaitu 0×0000 dan nilai d adalah lokasi c iaitu 0×0008. Seperti yang diterangkan di atas, *c bermaksud nilai di dalam kotak a iaitu 100 dan *d bermaksud nilai di dalam kotak c iaitu 0×0000. Jadi bolehkah kita akses nilai di dalam kotak a dengan menggunakan pointer d? Jawapannya boleh dengan bantuan **d.

Share
read more
Tutorial php,mysql,javascript,css,html bahasa melayu