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;
}
//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;
}
#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....