Selasa, Juli 14, 2020

fungsi exec family dan perannya dalam bahasa c

fungsi exec family dan perannya dalam bahasa c

Fungsi-fungsi exec family berperan dalam menggantikan proses yang sedang berjalan saat ini dengan proses baru. fungsi tersebut dapat digunakan untuk menjalankan program bahasa c dengan menggunakan program bahasa c lainnya. fungsi ini digunakan menggunakan file header unistd.h. Terdapat banyak anggota dari exec family yang diperlihatkan sebagai berikut.

satu, execvp: dengan menggunakan perintah ini, menciptakan child proses yang tidak perlu menjalankan program yang sama sebagai parent process. Pemanggilan sistem tipe exec memungkinkan sebuah proses untuk menjalankan program file apapun, termasuk sebuah binary executable atau sebuah skrip shell.

Sintak:
int execvp (const char *file, char *const argv[]);

file: titik dari nama file yang berasosiasi dengan file yang akan dieksekusi.
argv: adalah sebuah null yang mematikan array dari pointer karakter.

Perhatikan contoh kecil untuk menampilkan bagaimana fungsi execvp() digunakan pada bahasa c. Terdapat dua file .c, EXEC.c dan execDemo.c, dimana execDemo.c akan mengganti EXEC.c dengan memanggil fungsi execvp() pada execDemo.c.


Selanjutnya dapatkan file executable dari EXEC.c menggunakan perintah
gcc EXEC.c -o EXEC

Selanjutnya, ciptakan file executable dari execDemo.c menggunakan perintah

gcc execDemo.c -o execDemo

Setelah menjalankan file executable dari execDemo.cby dengan menggunakan perinah ./excDemo, maka didapatkan output sebagai berikut:

I AM EXEC.c called by execvp()

Ketika file execDemo.c dikompilasi, selama statement execvp(args[0],args) dieksekusi, maka program akan digantikan dengan program EXEC.c. "Ending--" tidak akan ditampilkan dilayar selama fungsi execvp() tetap dipanggil, program tersebut akan digantikan oleh program EXEC.c.

dua, execv: hal ini hampir sama dengan fungsi execvp() dalam hal sintak. Sintak dari execv() diperlihatkan sebagai berikut:

int execv(const char *path, char *const argv[]);

path: menunjuk ke jalur dari file yang akan dieksekusi.
argv[]: adalah null yang mematikan array dari pointer karakter.

Perhatikan contoh kecil bagaimana fungsi execv() digunakan pada bahasa c. Contoh ini sama dengan contoh yang diperlihatkan sebelumnya untuk execvp(). Akan disediakan dua file EXEC.c dan execDemo.c dan execDemo.c akan digunakan untuk mengganti EXEC.c dengan memanggil fungsi execv() pada execDemo.c.

Sekarang ciptakan file executable dari EXEC.c menggunakan perintah
gcc EXEC.c -o EXEC

Selanjutnya ciptakan file executable dari execDemo.c menggunakan perintah

gcc execDemo.c -o execDemo

Setelah file executable execDemo.c dijalankan menggunakan perintah ./excDemo, maka nilai output-nya adalah:

I AM EXEC.c called by execv()

tiga, execlp dan execl: dua fungsi tersebut digunakan untuk tujuan yang sama tetapi sintak dari keduanya sedikit berbeda seperti diperlihatkan sebagai berikut:

Sintak:
int execlp(const char *file, const char *arg,.../* (char  *) NULL */);
int execl(const char *path, const char *arg,.../* (char  *) NULL */);

file: nama file berasosiasi dengan file yang akan dieksekusi.
const char *arg dan ellipses: mendeskripsikan sebuah daftar dari satu atau lebih pointer ke null-terminated string yang merepresentasikan daftar argumen yang tersedia untuk mengeksekusi program.

Program bahasa C yang sama diperlihatkan sebelumnya juga akan dieksekusi dengan fungsi execlp() atau execl() dan akan mengampilkan tugas yang sama yaitu mengganti proses saat ini dengan proses yang baru.

empat, execvpe dan execle: dua fungsi ini juga memiliki tujuan yang sama tetapi sintak dari keduanya sedikit berbeda dari semua anggota exec family sebelumnya. Sintak dari kedua fungsi tersebut diperlihatkan sebagai berikut:

Sintak:
int execvpe(const char *file, char *const argv[],char *const envp[]);

Sintak:
int execle(const char *path, const char *arg, .../*, (char *) NULL, 
char * const envp[] */);

Sintak tersebut memperlihatkan satu perbedaan argumen dari semua anggota exex.
char * const envp[]: memungkinkan untuk melakukan pemanggilan secara khusus dari lingkungan pengembangan program melalui argumen envp.

envp: Argumen ini adalah array dari pointer ke null-terminated string dan akan dihentikan oleh pointer null. Fungsi lainnya mengambil lingkungan untuk gambar proses baru dari variabel ekternal dalam proses pemanggilan.





typedef vs #define pada bahasa C

typedef vs #define pada bahasa C

typedef: digunakan untuk memberikan sebuah nama baru pada tipe data. Contoh,

Output:
c

#define pada bahasa c adalah sebuah direktif yang digunakan untuk memberikan nama alias.

Output:
Hyderabad

Perbedaan antara typedef dan #define:

satu, typedef dibatasi untuk memberikan nama simbolis untuk tipe data saja, dimana #define digunakan untuk mendefinisikan alias dari nilai, define dapat digunakan untuk mendefinisikan 1 sebagai ONE, atau 3,14 sebagai PI, dan lain sebagainya.

dua, interpretasi typedef ditunjukkan oleh kompilator dan statement #define ditampilkan oleh preprosesor.

tiga, #tidak bisa diakhiri dengan semocolon, tetapi typedef harus diakhiri dengan semicolon.

empat, #define hanya melakukan copy-paste nilai definisi pada titik yang digunakan, sementara typedef merupakan definisi aktual itu sendiri dari sebuah tipe yang baru.

lima, typedef mengikuti aturan scope yang artinya jika tipe baru didefinisikan dalam sebuah scope (dalam fungsi), maka tipe data baru hanya akan terlihat sampai batas scope itu sendiri. Pada #define, ketika preprosesor menemukan #define, maka semua tindakannya akan digantikan setelahnya (tidak mengikuti aturan scope).

Output:
sizeof a:8
sizeof b:8
sizeof c:8
sizeof x:8
sizeof y:1
sizeof z:1

Dari output tersebut "a" merupakan pointer 8. 

typedef char* ptr;
ptr a, b, c;

Statement secara efektif menjadi

char *a, *b, *c;

a, b, c, dideklarasikan sebagai char*.

Kenyatannya, #define beroperasi sebagai berikut:

#define PTR char*
PTR x, y, z;

statement secara efektif menjadi

char *x, y, z;

Hal ini membuat x, y, dan z menjadi berbeda, dimana x adalah pointer ke char, sementara y dan z adalah variabel char. Ketika dideklarasikan makro dengan pointer jika yang dideklarasikan lebih dari satu identifier maka definisi aktual yang diberikan untuk identifier pertama. dan sisanya dalah definisi non pointer yang diberikan. Pada kasus sebelumnya x akan dideklarasikan sebagai char*, sehingga ukurannya adalah seukuran pointer, dimana y dan z akan dideklarasikan sebagai char, maka ukurannya pun akan seukuran 1 byte data.





Senin, Juni 29, 2020

fungsi strftime() pada bahasa c dan c++

fungsi strftime() pada bahasa c dan c++

strftime() adalah fungsi pada bahasa C yang digunakan untuk format tanggal dan waktu. Fungsi ini dipanggil pada header file time.h, yang juga mengandung struktur nama tm yang digunakan untuk menyimpan tinggal dan waktu. Sintak dari strftime() seperti diperlihatkan berikut ini:

size_t strftime(char *s, size_t max, const char *format, const struct tm *tm); 

Format fungsi strftime() menampilkan waktu tm sesuai dengan aturan format yang ditentukan dan menyimpannya dalam karakter array s.

Beberapa specifier untuk strftime() diperlihatkan sebagai berikut:
%x = menampilkan waktu spesial.
%l = menampilkan jam dalam angka desimal (12 jam).
%M = menampilkan menit dalam rentang 00 sampai 59.
%p = AM dan PM diberikan sesuai dengan waktu yang ditampilan.
%a = singkatan nama hari dalam satu minggu.
%A = nama penuh hari dalam satu minggu.
%b = singkatan nama bulan.
%B = nama penuh bulan dalam satu tahun.
%c = menampilkan tanggal dan waktu.
%d = menampilkan hari dalam satu bulan.
%H = menampilkan jam dalam format 24 jam.
%I = menampilkan jam dalam format 12 jam.
%m = menampilkan bulan sebagai angkat desimal.
%M = menit mulai dari 00 hingga 59.

Struktur struct tm didefinisikan pada time.h sebagai berikut:

struct tm 
{
   int tm_sec;         // detik
   int tm_min;         // menit
   int tm_hour;        // jam
   int tm_mday;        // hari dalam bulan
   int tm_mon;         // bulan
   int tm_year;        // angka dari tahun yang dimulai sejak 1900
   int tm_wday;        // hari dalam minggu
   int tm_yday;        // hari dalam tahun
   int tm_isdst;       // waktu siang hari    
};

Formatted date & time : 03/20/17 - 02:55PM

Kapan dan bagaimana penggunaan dari strftime()?
Digunakan ketika membuat perangkat lunak atau aplikasi yang menampilkann waktu saat ini dan yang paling penting sesuai dengan format permintaan pengguna. 





Minggu, Juni 28, 2020

Keyword _Generic pada bahasa C

Keyword _Generic pada bahasa C

Kekurangan umum dari makro pada bahasa c dan c++ adalah argumen diperiksa sangat ketat. Namun, berbeda dengan yang makro dapat beroperasi pada tipe dari berbagai variabel berbeda tanpa harus diperiksa.

Output:
eeks 11

Meskipun penggunaan makro perlu dihidari. Tetapi setelah implementasi dari standard C11 pada bahasa c, maka makro dapat digunakan dengan bantuan dari keyword new "_Generic". Dapat dilakukan pendefinsian makro untuk tipe-tipe data berbeda. Contoh, makro INC(X) diterjemahkan ke INCI(X), INC(X) atau INCf(X) tergantung pada tipe data dari x:

#define INC(x) _Generic((x), long double: INCl, \
                              default: INC, \
                              float: INCf)(x)

Contoh:
Output:
Catatan: jika menjalankan kompilator C11 maka nilai keluaran adalah sebagai berikut.
3
0
3

Output:
2
0





Fungsi tmpnam() pada bahasa C

Fungsi tmpnam() pada bahasa C

Fungsi tmpnam() adalah fungsi khusus yang dideklarasikan dalam file header "stdio.h". Yang generate sebuah nama file sementara yang berbeda setiap kali dipanggil hingga TMP_MAX. TMP_MAX merepresentasikan angka maksimum dari nama file berbeda yang akan dihasilkan oleh fungsi tmpnam(). Jika fungsi ini dipanggil lebih dari TMP_MAX, maka perilaku dari fungsi akan tergantung pada implementasinya. Berikut, L_tmpnam mendefinisikan ukuran yang dibutuhkan untuk array dari char untuk menyimpan hasil dari tmpnam.

Sintak:
char *tmpnam(char *str)
s : The character array to copy the file name.
It generates and returns a valid temporary 
filename which does not exist. 
If str is null then it simply returns the tmp file name.

Output:
The file names are dependent on running machine, which can be anything.
Example: /tmp/fileRTOA0m
         \s260.
         \s3ok.
         \s5gg. etc





Fungsi librari difftime() pada bahasa C

Fungsi librari difftime() pada bahasa C

Fungsi pustaka pada bahasa c difftime() mengembalikan nilai berbeda, dalam hitungan waktu antara waktu mulai dan waktu akhir. (ending time-starting time)

// It is present in time.h header file
#include 

Sintak : 
double difftime(time_t time2, time_t time1);

Parameter:
time1 : Lower bound of the time interval
        whose length is calculated.
time2 : Higher bound of the time interval
        whose length is calculated.

Return value : 
Returns the difference between time1 and 
time2 (as measured in seconds).

Output:
Difference is 6.00 seconds





Bagaimana cara membuat file header pada bahasa C

Bagaimana cara membuat file header pada bahasa C

Seperti yang diketahui file dengan ekstensi .h disebut sebagai file header pada bahasa C. File header pada umumnya mengandung fungsi deklarasi yang dapat digunakan pada program utama bahasa C, seperti untuk memasukkan stdio.h pada program bahasa C untuk digunakan pada fungsi printf(). Mungkinkah untuk membuat file header sesuai dengan keinginan sendiri?
Jawabannya adalah iya. Header file adalah file sederhana yang bisa dideklarasikan untuk fungsi yang dibuat sendiri yang dapat digunakan pada program utama atau juga dapat digunakan ketika membuat program bahasa C skala besar. 

Catatan: Header file umumnya mengandung definisi dari tipe data, fungsi prototipe dan perintah preprosesor bahasa C.

Berikut adalah contoh sederhana dari pembuatan file header beserta penggunaannya.

satu, membuat myhead.h: buat kode program berikut ini dan simpan dengan nama file myhead.h atau dengan menggunakan kreasi nama apapun diakhiri dengan ekstensi .h yang mengindikasikan file tersebut adalah file header.


dua, Memasukkan file .h ke dalam program lainnya pada bahasa c: Seperti hal nya memasukkan file tipe .h pada program bahasa c, maka file myhead.h juga perlu dilakukan include pada program.

#include "myhead.h". Penggunaan tanda "" adalah untuk menginstruksikan preprosesor untuk melihat pada folder saat ini dan jika tidak ditemukan maka menuju ke folder standar. Jadi, jika ingin menggunakan angular bracket <> ketimbang "" untuk include file header, juga dapat dilakukan penyimpanan di dalam folder standar file header. Namun jika menggunakan "" untuk melakukan include maka terlebih dahulu harus dipastikan bahwa file berada dalam folder yang sama dimana file c disimpan.

tiga, Menggunakan create header file:

Output:
Added value:10
Multiplied value:25
BYE!See you Soon

Catatan: Kode program sebelumnya dapat berjalan dengan sukses dan akan mencetak nilai output jika telah diciptakan file header dan disimpan pada folder yang sama dengan file c.

Poin penting
Pembuatan file header umumnya dibutuhkan ketika membuat program bahasa c skala besar sehingga modul dapat berbagi fungsi definisi, prototipe, dan lain sebagainya.

satu, Fungsi dan tipe deklarasi, variabel global, deklarasi struktur, dan beberapa case, dan fungsi inline, pendefinisiannya harus terpusat dalam satu file utama.

dua, Pada Header file, tidak boleh menggunakan file header yang redundant, hanya sekumpulan kecil dari statement. 

tiga, Jangan meletakkan definisi fungsi pada sebuah header. Letakkan file tersebut terpisah pada file .c.

empat, Deklarasi include untuk fungsi dan variabel yang didefinisikan akan terlihat ketika menuju linker. Juga, definisi dari struktur data dan enumerasi yang terbagi antara multiple sumber file.

lima, Secara singkat hanya file-file yang diperlukan saja yang perlu dimasukkan pada file header.





Fungsi library isgraph() pada bahasa C

Fungsi library isgraph() pada bahasa C

Fungsi pustaka isgraph() pada bahasa C adalah memberitahukan apakah karakter adalah karakter grafis atau bukan. Karakter yang memiliki tampilan representasi grafis dikenal dengan istilah karakter grafis (char). Contoh : ':',';','?','@', dan lain sebagainya.

Sintak
#include <ctype.h>
int isgraph(int ch);

Return Value - fungsi return nonzero adalah karakter dari karakter cetak apapun kecuali spasi, sisanya akan memberikan nilai 0 jika ditemukan.

Untuk tabel ASCII, karakter cetak berada pada range 0X21 hingga 0X7E.

Contoh kode program
Output:
var1 = |g| can be printed
var2 = | | can't be printed
var3 = |1| can be printed

Contoh kode program
Output:
In C programming All graphic characters are: 
! " # $ % & ' ( ) * +, - . / 0 1 2 3 4 5 6 7 8 9 
: ;  ? @ A B C D E F G H I J K L M N O P Q R S T U
 V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n
 o p q r s t u v w x y z { | } ~ 





Preprosesor direktif bahasa C dan C++ lanjutan

Preprosesor direktif bahasa C dan C++ lanjutan

Direktif preprosesor: Pada hampir setiap program pada bahasa C dan C++, dapat ditemukan beberapa baris pada bagian atas dari program yang diawali dengan tanda '#'. Baris tersebut akan dilakukan preprosesing oleh kompilator sebelum kompilasi aktual dimulai. Pada bagian akhir dari baris diidentifikasi oleh karakter baris baru '\n' dan tidak ada semicolon ';' yang diperlukan untuk mengakhiri perintah pada baris tersebut. 

Direktif preprosesor umumnya digunakan untuk mendefinisikan makro dan evaluasi kondisional statement, include file sumber, direktif pragma, kontrol baris, deteksi error, dan lain sebagainya.

Pada bagian ini akan dibahas beberapa tipe dari direktif preprosesor seperti diperlihatkan sebagai berikut:
satu, Kompilasi kondisional
dua, Line kontrol
tiga, Direktif error

Selanjutnya adalah perhatikan setiap direktif tersebut secara lebih detail:
satu, Kompilasi Kondisional: Direktif kompilasi kondisional membantu untuk mengkompilasi porsi spesifik dari program atau melewati kompilasi dari bagian khusus dari program berdasarkan kondisi tertentu. Pada materi direktif preprosesor sebelumnya, telah dibahas tentang dua tipe direktif 'ifdef' dan 'endif'. Pada materi kali ini akan dibahas #ifndef, #if, #else, dan #elif.

#ifdef: Direktif ini adalah jenis direktif dengan kondisi paling sederhana. Block ini disebut dengan grup kondisional. Teks yang dikontrol akan dimasukkan dalam output preprocessor jika macroname didefinisikan. teks kontrol yang terdapat dalam kondisional akan merangkul direktif preprosesor, dan hanya akan dieksekusi ketika kondisi telah terpenuhi. Direktif ini dapat ditempatkan pada multiple layer, tetapi harus dalam kondisi bersarang penuh. Dengan kata lain, ‘#endif’ harus selalu cocok dengan ‘#ifdef ' terdekat (atau‘ #ifndef ’, atau‘ #if ’). 

Sintak:
#ifdef MACRO
    controlled text
#endif /* macroname */

#ifndef: Diketahui bahwa pada direktif #ifdef jika macroname telah didefinisikan, maka blok dari statement mengikuti direktif #ifdef akan dieksekusi secara normal tetapi jika tidak maka kompilator akan secara sederhana melewati blok statement tersebut. Direktif #ifndef secara sederhana berlawanan dengan direktif #ifdef. Pada kondisi #ifndef, blok statement antara #ifndef dan #endif akan dieksekusi hanya jika makro dari identifier dengan #ifndef tidak didefinisikan.

Sintak:
ifndef macro_name
    statement1;
    statement2;
    statement3;
    .
    .
    .
    statementN;
endif

Jika makro dengan nama 'macroname' tidak didefinisikan menggunakan direktif #define maka hanya blok statement saja yang akan dieksekusi.

#if, #else, dan #elif: Direktif tersebut bekerja bersamaan dan mengendalikan ukuran dari kompilasi dari program menggunakan beberapa pengkondisian. Jika kondisi dengan direktif #if dievaluasi ke nilai non zero, maka kelompok dari baris akan dieksekusi secepatnya setelah direktif #if dieksekusi, juga jika kondisi dengan direktif #elif dievaluasi ke nilai non zero, maka kelompok dari direktif akan segera dieksekusi telah direktif #elif dieksekusi jika tidak maka direktif #else akan dieksekusi setelahnya.

Sintak:
#if macro_condition
   statements
#elif macro_condition
   statements
#else
   statements
#endif

Contoh:

Output:
50

Perhatikan bahwa semua struktur dari direktif #if, #elif, dan #else saling berkaitan dan diakhiri dengan #endif.

dua, Line Control (#line): Dimanapun ketika melakukan kompilasi program, selalu terdapat kemungkinan dari ketidaktepatan dari beberapa program error. Dimanapun identifier kompilator mengalami error dalam program maka akan disediakan nama file yang ditemukan error bersamaan dengan daftar baris dari angka pasti dimana posisi dari baris error tersebut berada. Hal ini akan mempermudah proses pencarian error.

Namun Demikian programmer dapat mengendalikan informasi mana yang harus disediakan oleh kompilator selama error terjadi pada saat proses kompilasi program menggunakan direktif #line.

Sintak:
#line number "filename"

Tiga, Error direktif (#error): Direktif ini membatalkan proses kompilasi ketika ditemukan program mengalami error yang bersifat optional dan secara khusus dapat dipergunakan sebagai parameter.

Sintak:
#error optional_error

Berikut, optional_error yang ditentukan oleh user terhadap jenis error tertentu dan akan ditampilan ketika menemukan program error.

Contoh:
#ifndef GeeksforGeeks 
#error GeeksforGeeks not found ! 
#endif 

Output:
error: #error GeeksforGeeks not found !

Sumber Referensi:
ppd_better_practice_cs.auckland.ac.nz
http://www.cplusplus.com/doc/tutorial/preprocessor/