C++ Passing argument (by value vs by references)

การส่ง argument ไปยังฟังก์ชั่น มี 2 แบบ คือ

  • pass by value คือการ คัดลอกค่า ที่เก็บจากตัวแปรที่ส่ง ไปยังตัวแปรของฟังก์ชั่น
  • pass by reference คือ การใช้งาน ข้อมูลที่เก็บจาก address ของตัวแปรที่ส่งไป ในฟังก์ชั่นนั้น

ตัวอย่างการเขียนฟังก์ชั่น แบบ pass by value

#include <iostream>
using namespace std;

void increment(int inp){
  cout << inp++ << endl;
}

int main(){
 for(int i=0;i<5;i++)
  incrment(i);
 return 0;
}

เอาท์พุตของโปรแกรม

0 1 2 3 4

ตัวอย่างการเขียนฟังก์ชั่นแบบ pass by reference

#include <iostream>
using namespace std;

void increment(int &inp){
  cout << inp++ << endl;
}

int main(){
 for(int i=0;i<5;i++)
  increment(i);
 return 0;
}

เอาท์พุตของโปรแกรม

0 2 4

วิธีการส่งค่าแบบแรกนั้นจะใช้เวลามากกว่า เนื่องจากจะต้องมีโอเปอเรชั่นในการคัดลอกค่าเพิ่มเติม ซึ่งถ้าต้องการส่งไฟล์ข้อมูลโครงสร้างขนาดใหญ่แล้ว แน่นอนว่าประสิทธิภาพย่อมลดลงแน่นอน แต่การส่งแบบ pass by reference นั้นก็เสี่ยงต่อการที่จะมีการเปลี่ยนแปลงค่าเช่นเดียวกัน

 

วิธีการคัดลอก vector ของ c++ แบบง่าย ๆ

สมมติว่ามี vector ตัวหนึ่งที่ต้องการคัดลอก สามารถทำได้ง่าย ๆ คือ ตั้งชื่อของตัวแปรขึ้นมาแล้ว ใช้โอเปอเรเตอร์ = ในการคัดลอกดังตัวอย่างบรรทัดที่ 4

vector<int> a ;
for(int i=0; i< 10 ;i++)
 a[i] = 10-i;
vector<int> b = a;
for(int i=0; i < 5;  i--)
 a.pop_back();

ในที่นี้ผลลัพธ์ของ a และ b ที่ได้จะแตกต่างกันดังนี้

a={10,9,8,7,6}
b={10,9,8,7,6,5,4,3,2,1}

เพราะโดยหลักแล้วการสร้างตัวแปรถ้าไม่ใช่ตัวแปรพื้นฐาน การใช้เครื่องหมาย = จะถือเป็นการ copy by value นั่นเอง

การแจ้งเตือนค่าขอบเขต ของการดำเนินการทางคณิตศาสตร์ ของคอมไพลเลอร์ C++(GCC)

วันนี้ผมจะพูดถึงข้อจำกัดในการคำนวณในทางคณิตศาสตร์เวลาที่เราเขียนโปรแกรม โดยยกสองตัวอย่างนี้ขึ้นมา

  • 1/0
  • sqrt(-1)

เวลาที่เขียนโปรแกรมในลักษณะ อินพุตจากผู้ใช้ หรือจากไฟล์ ควรมีการตรวจสอบค่าเหล่านี้ด้วย เนื่องจากอาจจะทำให้การทำงานของโปรแกรมมีการผิดพลาดได้ โยงกลับมาที่ภาษา C++ นะครับ ถ้าเขียนแบบนี้ลงไปตรงๆ

cout << 1/0  ;

คอมไพล์เลอร์จะแจ้งเตือนว่า division by zero (หมายถึงหารด้วย 0) เช่นตัวนี้ผมคอมไพล์บนวินโดวส์โดยใช้ GCC 4.9.2 มันจะแจ้งเตือนเป็นข้อความว่า

97 11 C:\Users\user\Desktop\OR_Solver\main.cpp [Warning] division by zero [-Wdiv-by-zero]

หมายถึงบรรทัดที่ 97 คอลัมน์ที่ 11 มีการหารด้วย 0

ซึ่งการแจ้งเตือนของมันคือคอมไพล์ผ่านนะครับ แต่ว่าเวลารันโปรแกรมจะตายทันที(ทั้งนี้แล้วแต่คอมไพลเลอร์หรือ IDE ที่ใช้นะครับ)

คราวนี้ลองเป็นลักษณะอินพุตจากผู้ใช้บ้าง จากตัวอย่างต่อไปนี้ครับ

int input1 ,input2 ;
cout << “Input 1 : ” ;
cin >> input1;
cout << “Input 2 : ” ;
cin >> input2;
cout << input1/input2 << endl;

ตรงนี้เวลาคอมไพล์ ตัว compiler จะไม่รู้กับเราว่าอาจจะมี การหารด้วย 0 เกิดขึ้น ซึ่งมันจะไม่เตือนให้เราทราบใดๆ เลยครับ(คอมไพล์ผ่านฉลุย)

ตัวอย่างการรันเมื่อ เลขตัวที่ 2 เป็น 0 นะครับ

Input 1 : 2
Input 2 : 0
inf

จะเห็นว่ามันจะออกมาเป็นค่า inf หรือ infinity ซึ่งหมายถึงเลขที่มีค่าเป็นอนันต์(ไม่มีที่สิ้นสุด) ครับ

คราวนี้ลองมาดูการถอดแสควร์รูทของตัวเลขติดลบบ้างว่าคอมไพล์เลอร์มันว่ายังไง

cout << sqrt(-1) << endl;

ตัวนี้คอมไพล์ผ่าน แต่ไม่แจ้งเตือนใดๆ  ทดลองรันดูเอาท์พุตเป็นค่านี้ครับ

nan

คำว่า nan ในที่นี้หมายถึง Not A Number ครับ ถ้าเป็นคณิตศาสตร์ รากที่ 2 ของค่าลบจะเป็นจำนวนจินตภาพ ซึ่งผมขอนำโครงสร้างของจำนวนจริงมาแปะไว้ให้ดูเผื่อใครไม่รู้จำนวนจินตภาพคืออะไร สนใจคณิตศาสตร์เพิ่มเติมก็ตามลิงค์ไปเลยนะครับ วันนี้ขอจบเพียงเท่านี้ก่อน 😀

เครดิตภาพ : http://vichakarn.triamudom.ac.th/comtech/studentproject/final54/824/Infinite%20Stratos/MATH/Real.html

การติดตั้ง oracle jdk 8 บน ubuntu 14.04

พิมพ์คำสั่งต่อไปนี้บน terminal

sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer

อ่านเพิ่มเติมเกี่ยวกับการใช้งาน jdk บน ubuntu

http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html

How to install Google Drive on Ubuntu 14.04

There isn’t native official’s google drive client yet, but you can use another way by using  grive

If you followed the steps explain by grive page but got some error like this

grive (>= 0.3) but 0.2.0-1.1 is to be installed

This is my solution by adding new ppa  :

$ sudo add-apt-repository ppa:nilarimogard/webupd8
$ sudo apt-get update
$ sudo apt-get install grive-tools