Tampilkan postingan dengan label Programming. Tampilkan semua postingan
Tampilkan postingan dengan label Programming. Tampilkan semua postingan

Rabu, 25 November 2009

Contoh penggunaan Void* untuk menyimpan berbagai representasi data

Masih tentang Tips/Trik di C Programming Language

Sebenarnya, penggunaan Void * yang akan saya jelaskan dibawah ini kegunaannya sama / mirip dengan penggunakan UNION yang sudah dijelaskan sebelumnya. Intinya adalah bagaimana caranya agar kita dapat menyimpan berbagai macam tipe dalam satu struktur data, dimana setiap saat hanya ada satu tipe dan tidak boros memori atau alokasi semua kemungkinan tipe dan yang diisi hanya satu tipe.

cara lain yang menarik adalah dengan Void *. Biar gampang, saya berikan contoh kasus yaitu untuk stuktur data Matriks, dimana elemen/entry matriks dapat berupa integer atau string setiap saat. Mudah-mudahan dari kasus ini pembaca dapat memahami dan mendapatkan 'feel' sisi lain penggunaan Void*.

pertama-tama, kita buat dahulu spesifikasi struktur data dan prototipe operasi (ADT) => kita beri nama filenya adalah matriks.h


#ifndef _MATRIKS_
#define _MATRIKS_

#define        BARIS    10
#define        KOLOM    10

//Definisi struktur CELL MATRIKS
typedef struct tcell {
    // Jenis tipe : misal 0:kosong, 1:integer, 2:char*
    int flag_type;
   
    // Isi datanya => menggunakan void*
    void* data;
} cell;

//Struktur Matriks
typedef struct tmatriks {
    cell MA[BARIS][KOLOM];
} matriks;


//contoh operasi
void initM(matriks* M);

void isiCell(int jenis_tipe, matriks* M, int baris, int kolom, void* data);

#endif


Berikutnya kita buat Realisasi dari header diatas, yaitu file matriks.c

#include "matriks.h"

//contoh operasi

void initM(matriks* M)
{
    int i,j;
   
    for (i = 0; i < BARIS; i++)
    {
        for(j = 0; j < KOLOM; j++)
        {
            M->MA[i][j].flag_type = 0;
        }
    }
}

void isiCell(int jenis_tipe, matriks* M, int baris, int kolom, void* data)
{
    cell c;
    c.flag_type = jenis_tipe;
    c.data = data;
   
    M->MA[baris][kolom] = c;
}



Sekarang, kita buat program Utama yang memakai ADT Matriks diatas. dari program utama ini silakan Anda pelajari penggunaan Void* itu seperti apa. karena saya rasa, program utama di bawah ini sudah cukup menjelaskan penggunaan Void* untuk menampung berbagai tipe data.

Bagian yang berwarna biru merupakan hal penting yang harus teman-teman perhatikan, karena disitulah penggunaan Void* terjadi.

//file : test.c


#include
#include
#include
#include "matriks.h"

int main ()
{
    matriks M;
    int i,j;
   
    //init M
    initM(&M);
   
    //isi 0,0 dengan integer 5
    int* data_int = (int*)malloc(sizeof(int));
    *data_int = 5;
    isiCell(1, &M, 0, 0, (void*)data_int);
   
    //isi 1,1 dengan string "testdata"
    char* data_str = (char*)malloc(10 * sizeof(char));
    strcpy(data_str, "testdata");
    isiCell(2, &M, 1, 1, (void*)data_str);
   
    //tampilkan isi matriks jika tidak kosong
    for (i = 0; i < BARIS; i++)
    {
        for(j = 0; j < KOLOM; j++)
        {
            if (M.MA[i][j].flag_type != 0) //berisi
            {
                if (M.MA[i][j].flag_type == 1)
                {
                    int* ii = (int*)M.MA[i][j].data;
                    printf("%d ", *ii);
                }
                else
                {
                    printf("%s ", (char*)(M.MA[i][j].data));
                }
            }
        }
    }
   
    return 0;
}



--
Semoga bermanfaat :)
Need Feedback, Suggestion, and Question please....

Minggu, 22 November 2009

Kegunaan UNION pada C Programming Language

Bagi Anda yang pernah merasakan syntax bahasa pemrograman C, pernahkah Anda mendengar dengan istilah yang namanya Union??

Jika Anda sudah pernah dengar dan memahami maksudnya, maka silakan komentari tulisan saya ini jika tulisan saya ini mengandung kesalahan. Tetapi, jika Anda belum mendengar atau memahami maksud dari Union ini, saya ingin berbagi sedikit pengalaman saya dalam menggunakan Union di dalam bahasa C ini.

Biar lebih mudah dipahami, saya akan memberikan studi kasus. Misalkan, saya ingin membuat tipe struktur atau bentukan Matriks statis yang elemennya dapat berupa Integer, String, atau Float (setiap saat hanya salah satu). Perhatikan struktur dibawah ini,

#define BARIS 20
#define KOLOM 20


//cell / entri / elemen matrix
typedef struct tcell {
    ...
} cell;


//matrix
typedef struct tmatrix {
     cell mcell[BARIS][KOLOM];
}  matrix;

Sekarang, kita akan buat 2 jenis realisasi struktur cell diatas, yang menggunakan Union dan Tanpa Union.

// yang tanpa union
typedef struct tcell {
     // penanda tipe
     int flag_type;
     
     // isi cell 
     char* sval;
     int ival;
     float fval;
} cell;





// yang dengan Union
typedef struct tcell {
     // penanda tipe
     int flag_type;
     
     // isi cell 
     union {
         char* sval;
         int ival;
         float fval;
     } u;
} cell;

Lalu apa Bedanya antara kedua kode diatas ???

yang pertama(tanpa union), ketika struktur cell dialokasi di memori, ia akan mengalokasikan sebanyak jumlah elemen struktur yang ada.
misal,
untuk flag_type => int => 4 byte
untuk ival => int => 4 byte
untuk fval => float => X byte
untuk sval => char* => Y byte

total yang dialokasikan untuk jenis yang pertama = (8 + X + Y) Byte. Oleh karena yang digunakan / diisi hanya flag_type dan salah satu dari ival, fval, dan sval, maka cara diatas sangat tidak efisien, ini sama saja dengan boros memori, kita mengalokasikan tetapi tidak dipakai.

Solusinya adalah UNION (cara yang kedua).

Union akan mengalokasikan memori mulai dari Offset NOL, jadi misalkan sebelumnya diisi integer(ival), lalu diisi string(sval), pengisian sval tidak dilakukan di posisi yang disediakan khusus untuk sval, tetapi dari NOL lagi atau dari posisi awal, jadi nilai integer sebelumnya akan ditimpa. Dengan adanya Union, masalah boros alokasi / alokasi tapi tak terpakai selesai sudah...

Semoga tulisan ini bermanfaat, Jika ada yang salah saya mohon kritik dan masukan dari teman-teman semua....^_^