2013/07/28

C++基本資料型態

在寫程式之前
必須要先知道資料有哪些型態可以儲存
資料型態分為兩大類
 ● 基本資料型態
  - 整數 : short, int, long
- 浮點數(有小數點以下) : float, double
- 字元 : char
- 邏輯值 : bool
 ● 衍伸資料型態
- 與結構相關(結合多個基本的資料型態)
+ array
+ struct, union, enum
+ string
- 與位址相關(跟實際存取記憶有關)
+ 指標
+ 位址

基本資料的長度&範圍(會根據不同的compiler有所不同)
- short(16bits) : -32768 ~ 32767
- int (32bits) : -2,147,483,648 ~ 2,147,483,647
- long (32bits) : -2,147,483,648 ~ 2,147,483,647
- float (32bits) : 9.9*(10^-41) ~ 3.402*(10^38)
- double (64bits) : 9.9*(10^-320) ~ 3.402*(10^308)
- char (8bits) : A~Z, a~z, 0~9, #,+,$...
- bool (8bits) : 0 或 1
這邊解釋一下float & double的表達方式
(10^-41)是說10的負41次方
那char所能存放的字元是以ASCII碼
可以參考這個連結知道有哪些符號
在整數與浮點數的部份
如果所要存的資料都是正數(大於0)的話
可以在資料型態的前面加上 unsigned這樣可以存的正數資料量就變成雙倍了
unsigned short : 0 ~ 65535

這邊有個簡單的範例來說明
如何知道每個基本的資料型態所佔的記憶体大小
#include <iostream>

using namespace std;

int main() { 
  cout << "Size of int is    " << sizeof(int)  << "byte" << endl;
  cout << "Size of short is  " << sizeof(short) << "byte" << endl;
  cout << "Size of long is   " << sizeof(long) << "byte" << endl;
  cout << "Size of float is  " << sizeof(float) << "byte" << endl;
  cout << "Size of double is " << sizeof(double)<< "byte" << endl;
  cout << "Size of char is   " << sizeof(char)  << "byte" << endl;
  cout << "Size of bool is   " << sizeof(bool)  << "byte" << endl;
 
  system("pause");
  return 0;
}
將檔案存成size.cpp並執行下列的指令
bcc32 size.cpp

執行size.exe會出現下面的結果
Size of int is      4byte
Size of short is    2byte
Size of long is     4byte
Size of float is    4byte
Size of double is   8byte
Size of char is     1byte
Size of bool is     1byte
這邊說明一下程式的內容
這邊有一個新的函式 : sizeof()
這個函式主要是計算所輸入的變數的記憶体大小
所以我們將資料的型態輸入就可以得出記憶體的大小了
要注意一下這邊的單位是byte
1 byte = 8 bits    

2013/07/21

library 實作範例 ...

之前有一篇文章再介紹library
有興趣的朋友可以點上述的連結去了解
這邊用個簡單的範例來說明
首先我們先建立一個test的執行檔
# vim main.c
  #include <stdio.h>
  int main()
  {
    printf("Hello world!!!\n");
    return 0;
  }
# gcc main.c -o test
這時我們會有一個test的執行檔
這個執行檔的大小是4642

接著我們使用file來看看這個執行檔的資訊
# file test
test: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped
可以從上面的描述得知
 - 這是一個32bit的Linux執行檔 (32-bit LSB executable)
 - 可以在intel 80386的硬體環境下執行 (Intel 80386)
 - 使用動態的library (dynamically linked (uses shared libs))
 - 在linux 2.6.32的作業系統上 (GNU/Linux 2.6.32)
 - 還沒有stripped (可以用 strip的指令去除一些debug的資訊,讓檔案變小[4642 --> 3000])

如果想要看一下這個檔案用到哪些的動態library
而且可以看出這些dynamic library之間的相依性
# ldd test
    linux-gate.so.1 =>  (0x00614000)
    libc.so.6 => /lib/libc.so.6 (0x00697000)
    /lib/ld-linux.so.2 (0x00676000)
可以知道有用到兩個函式庫 :
  - libc.so.6 : 標準C函式庫
  - ld-linux.so.2 : 提供基本的library給其他的library,這個library為static library

那如果我們要用靜態的函式庫要如何做呢?
很簡單,在compile的時候加入-static的參數
# gcc -static main.c -o test_static
這時test_static的檔案大小就會飆升到632124

這是用file去看這個檔案的資訊就會變成statically linked
# file test_static
test_static: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, not stripped
這個檔案就無法使用ldd的指令了
因為沒有連結動態的函式庫

2013/07/14

行動裝置開發...

自從Apple出了iPhone與iPad之後
所有的程式人員都發現
要學的語言變多了
以前只有PC的時代只要學習開發微軟的程式就好了
現在開發應用程式給大家用
要熟析C#、Java(Andriod)、Object-C(ios)
真的是太困難的任務了

這邊說明一下目前三種APP的開發方式

  • Native APP
就是我們常見到手機上面有一個icon的應用程式。針對不同的作業系統要用不同的語言:C#(Window)、JAVA(Andriod)、Obecjt-C(ios)。因為是針對不同系統所開發的,所以這類的APP順暢度比較好、可以離線存取、可背景執行、硬體存取的功能較好、而且有自己對應的icon;缺點就是同時間要熟悉多個語言或是需要不同的人來撰寫不同的作業系統。
  • Web APP
透過瀏覽器來操作系統,優點是只需要一種語言就搞定了,但是相對的上面所提到的優點都沒有。而且網頁版與手持裝置的頁面是有所不同的,像是頁面的呈現、手持裝置操作的方式等。這編也說明一下jQuery Mobile對手持裝置提供的功能:可以依照畫面的大小調整排版、有支援網頁預先載入的功能、手指滑動的操作、下拉刷新...
  • Hybrid APP
這個方式主要是將Web APP透過PhoneGap或是其他類似的軟體,包裝成一個類似Native的APP。但是一樣會有效能較差與可控制硬體的限制。但是跟Web APP有一樣的好處,就是只需熟悉一種語言就好了。


至於各位看官們要用什麼方式,就要根據APP的應用與現有的資源來進行選擇了。

2013/07/07

網頁開發的進程 ~

最近網頁開發的名詞越來越多了
讓我這個老扣扣的人越來越搞不懂現在的網頁開發技術
這篇文章針對了網頁的開發技術做個簡單的說明
讓大家了解一下網頁開發的歷程

  • ASP (1996)
ASP是一個直譯式的語言,不需要透過編譯器便可以直接在網站伺服器上面執行。用來處理動態的網頁,基本上就是瀏覽器將參數送到伺服器,伺服器再將得到的資料回傳給瀏覽器。寫過ASP的人都知道HTML與ASP 會緊密的聯結在一起,比較無法分開;而且需要個別的處理Database的insert, delete, modify, query。而且比較容易攻擊,要額外撰寫很多code去避免攻擊。

  • ASP.NET (2002)
之後微軟為了改進上述的缺點(還有種種原因),就開發了ASP.NET。在ASP.NET並不需要學新的語言,可以用VB, C#, C++來進行網頁程式的撰寫;並且可以用拖拉元件的方式直接產生網頁的語言,讓原本只會寫window form的人快速的開發Web Form的網頁程式。

  • AJAX (2005)
但是上述的網頁技術在進行互動時,都需要將整個網頁的資料重新傳輸,即便是沒有變更的內容也都會重傳。為了充分的利用網路頻寬與節省時間就產了AJAX的技術,這個技術說穿了就是在傳輸的時候只針對有變化的地方進行傳遞,所以可以節省很多的時間。AJAX的全名是Asynchronous Javascript And XML,非同步代表說可以同時間做很多的事情並且採用Javascript與XML的技術來達成。這種技術可以快速的提升網站的效能,但是會有不容易debug與"回前一頁"的功能有問題。
    • jQuery (2006)
在同一個時期有個天才發明了一個簡易的Javascipt的函式庫,將原本不好寫的Javascript的語法包裝成好寫好用的方式。Write Less Do More是jQuery的目標。支援了AJAX, DOM的操作還有很多簡易的操作,之後還有衍伸到jQuery UI(針對UI所開發的)與jQuery Mobile(針對手持操作所開發的),而且還是免費的。

  • HTML5 (2012)
在伺服器端的戰爭結束之後,因為手持裝置的出現與Apple壯大,發生了令一場瀏覽器端的戰爭。因為在流覽器端要看影片與動畫,都必須要採用Flash這個外掛的軟體。但是這個外掛的軟體卻會造成Apple作業系統的當機,賈伯斯就決定Apple的產品不支持Flash。題外話:微軟自己也有推出Rich Internet Application(RIA就是像Flash的外掛軟體),叫做Sliverlight,後來因為打不過Flash而且Apple不支援就退出了。
在去年底HTML5推出來就是要補足HTML在動畫與影音的不足。它可以跨平台(因為每個瀏覽器都必須支援)、有離線存取資料的能力、支援手持裝置的操作、效能也會比較好(不需要多一層去做轉換)。所以之後的網頁遊戲與動畫都會以HTML5為主了。最大的影音網站Youtube已經有部分的影片是HTML5的格式了。