วันพฤหัสบดีที่ 20 พฤษภาคม พ.ศ. 2553

การใช้ & operator ใน C++

โอเปอเรเตอร์ & ใน c++ อาจหมายถึง address หรือการอ้างอิงก็ได้ compiler c++ จะตีความหมายของ & operator โดยดูจากเนื้อความของประโยคนั้นๆ

ตัวอย่าง 1: ในประโยคต่อไปนี้ & operator ใช้ในการสร้างตัวแปรแบบอ้างอิง(Reference Variable) หรือก็คือ Alias Variable นั้นเอง

int &iAccount = iMyVariable;

ตัวอย่าง 2: ในประโยคต่อไปนี้ & operator ใช้หา Address ของตัวแปร

cout << “Address of iMyVariable = “ << &iMyVariable

วันจันทร์ที่ 10 พฤษภาคม พ.ศ. 2553

Fibonacci in Assembly

INCLUDE Irvine32.inc

          .data

         .code

main PROC

          mov ecx,7

          mov eax,0

          mov ebx,1

          mov edx,eax

          add edx,ebx

          call writedec

          call crlf

          xchg eax,ebx

          call writedec

          call crlf

          xchg ebx,eax

          mov eax,edx

          call writedec

          call crlf

l1:     mov edx,ebx

          add edx,eax

          mov eax,edx

          call writedec

          call crlf

          xchg ebx,eax

          loop l1

          exit

main ENDP

          END main

วันพฤหัสบดีที่ 15 เมษายน พ.ศ. 2553

Pointer กับ Array

pointer กับ array ในภาษา c++ จะมีความใกล้ชิดกันมาก ตัวอย่างเช่น เมื่อประกาศตัวแปรarray ชนิดหนึ่งขึ้นมา ชื่อตัวแปรนั้น ก็คือ address ที่ชี้ไปยังดัชนีแรกสุด โดยที่เราไม่ต้องใช้ operator & วางหน้าตัวแปรarray เลย และถ้าเราเพิ่มจากเดิมไปอีก1ก็จะได้เป็น address ใหม่ที่จะชี้ตำแหน่งถัดไป ลองมาดูตัวอย่างกันคับ

int x[5] = {12,14,16,18,20};

cout<<x<<endl; //พิมพ์ค่า address ของ array ณ ตำแหน่งที่ 0 ออกมา

cout<<x+1<<endl; //เพิ่มค่าindexเข้าไปอีก1 จะทำให้ address เพิ่มไปอีก 1 ตำแหน่ง

วันอังคารที่ 13 เมษายน พ.ศ. 2553

Decimal to Binary

#include <iostream>

#include <string>

using namespace std;

string compute(int n){

     if(n==0)

          return "";

     else if(n%2==0)

          return compute(n/2)+"0";

     else

          return compute(n/2)+"1";

}

int main(){

     cout<<compute(14)<<endl;

     return 0;

}

วันพุธที่ 7 เมษายน พ.ศ. 2553

Binary to Decimal

#include <iostream>

#include <string>

using namespace std;

int compute(string s){

     if(s=="")

          return 0;

     else if(s.at(s.length()-1)=='1')

          return compute(s.erase(s.length()-1,1))*2+1;

     else

          return compute(s.erese(s.length()-1.1))*2+0;

}

int main(){

     cout<<compute("1110010")<<endl;

     return 0;

}

วันจันทร์ที่ 5 เมษายน พ.ศ. 2553

Pointerกับการจองหน่วยความจำ

เราจะจองหน่วยความจำเมื่อเราต้องการให้Programของเราทำงานแบบ Dynamic แต่ถ้าเรากำหนดขนาดของตัวแปรแบบArrayเอาไว้ล่วงหน้าแล้ว ถ้าเวลาจริงเราใช้ไม่พอ ก็จะขยายขนาดของArrayไม่ได้เลย จึงต้องหันไปใช้ LinkedList แทน การจองพื้นที่หน่วยความจำใน c และ c++ ก็จะต่างกันหน่อยนึง ลองมาดูกันคับ

  • ภาษา c จะใช้ function พวก malloc,calloc ในการจองหน่วยความจำและใช้คำสั่ง free ในการคืนหน่วยความจำให้กับระบบ
  • ภาษา c++ จะใช้คำสั่ง new ในการจองหน่วยความจำ และ delete ในการคืนหน่วยความจำให้กับระบบ

เราลองมาดูตัวอย่างกันนะคับ

int *num;

*num = 72;

การที่จู่ๆเราเอา pointer ของเราไปไปค่า72แบบนี้ทำไม่ได้นะคับ เนื่องจาก pointer ไม่สามารถนำไปเก็บค่าแบบนี้ได้โดยตรง เราก็เลยจะต้องจองพื้นที่ในหน่วยความจำให้มันกันก่อน แล้วจะสามารถนำมาเก็บค่า72ได้คับ

int *num;

num = new int;

*num=72;

cout<<*num<<endl;

delete num;

เมื่อเราจองหน่วยความจำได้แล้ว ข้อมูลในช่องนั้นสามารถนำไปใช้ในโปรแกรมของเราได้ ส่วนมากในการเขียนโปรแกรมทั่วๆไป เราไม่จำเป็นต้องประกาศตัวแปรPointer และจองหน่วยความจำแบบนี้เสมอไป เราก็แค่ประกาศตัวแปรแบบธรรมดาและเก็้บค่าไปเท่านั้น แต่ในการทำงานของ LinkedList นั้นจะต่างจาก array ตรงที่ linked list ไม่ได้จองหน่วยความจำทีเดียวแบบ array เช่น

int number[40];

array number ตัวนี้จะเเก็บค่าได้ 40 ตัว ขยายก็ไม่ได้ด้วย แต่ถ้าเราเปลี่ยนมาให้ LinkedList เราจะต้องจองหน่วยความจำให้กับข้อมูลที่ต้องการจะเก็บ และถ้าจะเพิ่มข้อมูลเข้าไปใน Linked List อีก ก็จองหน่วยความจำให้กับข้อมูลใหม่ และก็เชื่อมต่อเข้าไปอีกเรื่อยๆ

วิธีการของ Linked List นี้จะข่วยไม่ให้เราต้องจองหน่วยความจำเอาไว้มากมาย และจะเก็บข้อมูลเท่าที่เราต้องการจะเก็บเท่านั้น เมื่อเราลบข้อมูลในช่องใดออกไปก็จะไม่มีช่องว่างเหลือเหมือนกับarray

วันอาทิตย์ที่ 4 เมษายน พ.ศ. 2553

Pointer to Structures

การใช้ pointer ชี้ไปที่ข้อมูลชนิด structure เป็นที่นิยมมาก โดยเราจะใช้ตัวดำเนินการ -> (arrow operator) ในการอ้างถึงฟิลด์ต่างๆ เราลองมาพิจารณาโครงสร้างชนิดข้อมูลนี้กันดูคับ

struct database {

     int key;

     int big_array[25];

}my_data;

เป็นการประกาศข้อมูลชนิดโครงสร้างโดยใช้ชื่อ database แล้วก็กำหนดให้ my_data เป็นตัวแปรชนิดนี้ แล้วก็จะประกาศ pointer ชื่อ my_pointer ให้เป็นตัวแปร pointer ชนิดโครงสร้างนี้

struct database *my_pointer;

เราสามารถกำหนดให้ pointer ชื่อ my_pointer ชื่อไปยังตัวแปร my_data ได้ดังนี้

my_pointer = &my_data;

ต่อจากนี้เราก็จะสามารถอ้างถึงฟิลด์ต่างๆใน my_data เช่น my_data.key โดยใช้ตัวดำเนินการ ->

my_pointer -> key = 5;   // ใช้เช่นเดียวกับ my_data.key