Deploy Windows Program

Ini kali pertama saya ngedeploy program di PC yang berbeda dengan PC tempat saya mendevelope program (atau biasanya, saya compile ulang pake Visual Studio yang ada di PC yang bersangkutan). Berikut ulasannya ketika mendeploy program berbasis VS2013.

1. Error
Pada PC yg bersangkutan tidak terdapat MSVCR120D.dll
Perhatikan bahwa huruf D menandai debug process (saya baru uji coba running program dalam debug mode). Jika program di-release terlebih dahulu, library yg dibutuhkan adalah MSVCR120.dll (tanpa huruf D)

2. Alternatif solusi (tidak berhasil)
Saya coba meng-kopi-paste dll yg dibutuhkan dari dan ke System32, namun tidak berhasil.

3. Solusi yang baik (elegan)
Dengan menginstal Visual C++ Redistributable Packages for Visual Studio 2013 dari situs resmi microsoft pada PC yang bersangkutan (prototype PC).
Jangan lupa dll ‘paksaan’ yg sebelumnya dikopi, di-remove dulu sebelumnya.

Lebih lanjut tentang deployment (skala lebih kompleks) ada di sini

Komentar

Lagi berusaha memperbaiki teknik bekerja saya. Salah satunya mungkin teknik memberi komentar ya.. (Selanjutnya teknik documenting, klo ada waktu.)

Langsung aja.

Yang dibutuhkan:
1. JUDUL
Nama judul keseluruhan (aplikasi/modul)
Author, tanggal pembuatan

2. KETERANGAN FILE
Nama file
Tujuan (purpose)

3. Lain2
File inclusion (#include)
Global definitions and macros (#define)
Prototypes (function declaration)

4. KETERANGAN FUNGSI
Nama fungsi
Tujuan
Input
Output
Return value
Author

Mengukur waktu

Kebetulan lagi butuh menyusun suatu proses real time. Jadi penasaran juga ngitung time-lapse (execution time) dsb nya. Menurut stackoveflow bisa pakai

1. <time.h>

clock_t begin, end;
double time_spent;
begin = clock();
//
end = clock();
time_spent=(double)(end-begin) *1000.0/ CLOCKS_PER_SEC;

2. time ./a.out (at running time)

—-

Keterangan:

  • clock()
    clock_t clock(void)
    fungsi yang mengembalikan waktu prosesor (processor time) yang dikonsumsi oleh program
  • clock_t
    tipe yang termasuk fundamental arithmetic, merepresentasikan clock tick counts.
  • CLOCKS_PER_SEC
    macro yang merepresentasikan jumlah clock ticks per detik.
    Clock ticks: unit waktu dari suatu konstanta yang panjangnya spesifik terhadap sistem (PC)
    fungsi clock() di point teratas mengembalikan (return value) clock ticks ini.

.NET, C++/CLI

Setelah lama ga berurusan dengan dunia GUI, akhirnya saya kembali lagi. Kali ini mau coba VC++ instead of VB. Ternyata udah lama ga update ilmu (halah), kali ini harus berurusan dengan .NET, C++/CLI.

Langsung aja ya, ini disarikan dari sini dan sini

.NET Framework

Adalah suatu library graphical dari Microsoft yang menyediakan fungsionalitas2 yang dibutuhkan untuk mendukung persyaratan modern aplikasi komputer. .NET Framework menyediakan kelas2 yang bisa digunakan untuk graphical objects.

Suatu aplikasi harus memiliki entry point. Pada aplikasi C++/CLI, entry point ini adalah suatu fungsi main.

Windows Form & Common Language Runtime (CLR)

Windows Form adalah teknik membuat aplikasi komputer berbasis CLR. Teknik ini menawarkan sekumpulan obyek control, yang sudah dibuat di dalam .NET framework melalui bermacam2 kelas.

Big Picture

Pada dasarnya yang dilakukan adalah
1. Bikin project (VC++, CLR Empty Project)
2. Tambah references: System, System.Windows.Forms
3. Bikin kelas, tambah header.
4. Bikin application class: bikin .cpp, isi dengan entry point, main(), untuk buka form.

Praktek

1. Create new project, click VC++, CLR Empty Project

2. Windows Forms. Click Project, References…

3.  Add New Reference, .NET tab/assembly, click System. OK.

4. Add New Reference, .NET tab.assembly, click System.Windows.Forms. OK.

5. Click Project, Add Class…

6. Click C++ Class, Add. Input Class name: CForm, Base class: Form. OK.

7. Complete the header, save.

#pragma once

using namespace System;
using namespace System::Windows::Forms;

public ref class CForm :
public Form
{
public:
CForm();
};

8. Application Class. Click Project, Add New Item…

9. Click C++ File (.cpp), isi nama, OK.

10. Tambahkan main() pada .cpp

int main(array<System::String ^> ^args)
{
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);

Application::Run(gcnew Form());
return 0;
}

Windows Forms Application

Langkah2 di atas sebenarnya dapat digantikan dengan menggunakan template Windows Form Application, namun sayangnya pada VS2013, opsi ini hanya tersedia pada VC#, tidak pada VC++.

Preprocessor Directives

Disarikan dari sini

Yang paling terkenal adalah #define dan #ifdef.

Preprocessor directives (directive: perintah/instruksi) ini digunakan untuk membuat source program mudah diubah dan mudah di-compile pada execution environment yang berbeda.

Perintah ini menyuruh preprocessor untuk melakukan aksi spesifik, seperti me-replace teks token (kata kunci), memasukkan isi dari file lain ke source file, atau menghilangkan bagian (section) dari teks.

Yang termasuk preprocessor directives (14):

#define #elif #else #endif #error #if #ifdef #ifndef #import #include #line #pragma #undef #using

Masalah double inclusion

Penggunaan #ifndef biasanya berkaitan dengan masalah double inclusion (suatu file meng-include header yang sama dua kali).  Untuk mengatasi double inclusion ini, digunakan include guard atau macro guard pada file .h:

#ifndef NAMEOFHEADER_H
#define NAMEOFHEADER_H

// specific code

#endif

sehingga specific code (misalnya mendefinisikan suatu struct) hanya dilakukan satu kali, yaitu ketika NAMEOFHEADER_H belum didefinisikan (ifndef).

(link alternatif)

Mengatasi double inclusion dengan pragma once

#pragma once adalah header guard. Misalnya, jika suatuheader.h menggunakan directive/perintah ini, file suatuheader.h ini hanya akan di-include satu kali pada saat compiling. Dengan menggunakan pragma once akan menghilangkan kebutuhan untuk menggunakan include guard (misalnya strategi ifndef di atas).

Using namespace

Disarikan dari sini

Hari ini pertama kalinya saya melihat using namespace selain std. Mari kita bahas dulu mengenai using namespace std, yang biasanya dicantumkan untuk menggunakan perintah cout atau cin.

Using namespace std;

Perintah using namespace membuat seluruh simbol di dalam namespace yang disebutkan menjadi terlihat (visible), tanpa perlu menambahkan prefix namespace tersebut. Misalnya jika menggunakan using namespace std; maka penggunaan cout cukup menggunakan cout, bukannya std::cout.

Namun sayangnya, cara ini (using namespace std;) sebetulnya tidak direkomendasikan. Menurut link berikut, dan berikut, sebaiknya hindari menggunakan keseluruhan namespace std. Lebih baik gunakan prefix std:: , sehingga code akan menjadi

std::cout

atau

std::cin

atau

using std::cout;

karena di dalam namespace std ada banyak identifier yang sangat umum dipakai, seperti list, sort, string, iterator, dan lain lain.

Contoh lain dari sini, jika kita menggunakan dua library yang keduanya memiliki nama fungsi yang sama, misalnya xyz(). Maka jika menggunakan using namespace, kita dapat mendefinisikan, fungsi dari namespace mana yang akan digunakan.

Jika menggunakan using std::cout; , maka ketika menggunakan item lain di dalam namespace std (seperti std::endl), harus secara eksplisit disebutkan std::endl.

Penjelasan lain (berikut contoh) mengenai namespace ada di sini.