顯示具有 Programming 標籤的文章。 顯示所有文章
顯示具有 Programming 標籤的文章。 顯示所有文章

2013年8月20日 星期二

String literals in C

先看一下以下的例子,你知道哪個可以改內容,哪個不能改嗎?

char *name = "Jack";

char name[] = "Jack";

在 C 裡很常會用到字串,使用的時候要注意,宣告時的不同,會造成使用上的不同。像上面的例子,char *name 是不能修改的;char name[] 才能夠修改。要區分它們,要了解它們在記憶體上的什麼位置。

2013年5月14日 星期二

如何知道程式所需要連結的函式庫

方法一:使用 ldd

$ ldd /usr/bin/python


linux-gate.so.1 =>  (0x007c4000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00d4c000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00755000)
libutil.so.1 => /lib/i386-linux-gnu/libutil.so.1 (0x00bea000)
libssl.so.1.0.0 => /lib/i386-linux-gnu/libssl.so.1.0.0 (0x00abb000)
libcrypto.so.1.0.0 => /lib/i386-linux-gnu/libcrypto.so.1.0.0 (0x00dfc000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x00110000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x002e3000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x0030d000)
/lib/ld-linux.so.2 (0x00160000)

方法二:使用 lsof -P -T -p <Application_PID>

$ lsof -P -T -p 2047


方法三:使用 objdump -p

$ objdump -p /usr/bin/python

Dynamic Section:
  NEEDED               libpthread.so.0
  NEEDED               libdl.so.2
  NEEDED               libutil.so.1
  NEEDED               libssl.so.1.0.0
  NEEDED               libcrypto.so.1.0.0
  NEEDED               libz.so.1
  NEEDED               libm.so.6
  NEEDED               libc.so.6
  INIT                 0x08059cd4
  FINI                 0x08177ffc
  GNU_HASH             0x080481ac
  STRTAB               0x08051374
  SYMTAB               0x0804a9d4
  STRSZ                0x00006d63
  SYMENT               0x00000010
  DEBUG                0x00000000
  PLTGOT               0x0826bff4
  PLTRELSZ             0x00000cf0
  PLTREL               0x00000011
  JMPREL               0x08058fe4
  REL                  0x08058fbc
  RELSZ                0x00000028
  RELENT               0x00000008
  VERNEED              0x08058e0c
  VERNEEDNUM           0x00000008
  VERSYM               0x080580d8

如果在 ARM 的平台上,使用 objdump -p 是比較快的方式。

2013年3月14日 星期四

Shell Script : 多個條件判斷

在使用 shell script 時,如果要使用 if 判斷句,可以這樣寫

if [ "${name}" = "Jack" ]; then
    echo "I'm Jack"
fi

如果要判斷2個條件時,可以用 && 來同時判斷,但要注意寫法

if [ "${name}" = "Jack" && "${year}" = "30" ]; then
    echo "I'm Jack and I'm 30 years old"
fi

要小心!這樣的寫法是錯的,這不是在寫 C !
要改成


if [ "${name}" = "Jack" ] && [ "${year}" = "30" ]; then
    echo "I'm Jack and I'm 30 years old"
fi

要注意紅色的括號!
因為容易犯這個錯,所以在這裡記下來~

2013年2月7日 星期四

GCC configure : --build --host --target

從知道 Cross Compile 這個名詞以來,就看過這三個參數不知道幾次了,但除了剛開始時有想過這個問題之外,後來就沒仔細了解。這個問題是,這三個參數到底是有什麼差別?以自己的經驗,使用最多也只會的是 --host 這個參數(當要對某個程式做 cross compile 時用的),其他我還真的不了解怎麼用!今天總算對它們比較了解!

首先,根據不同的組合,它們有不同的名稱:

Native compiler: --build, --host, --target 都一樣
例:--build=x86 --host=x86 --target=x86

Cross compiler: --build 和 --host 一樣但 --target 不同
例:--build=SH --host=SH --target=ARM

Crossback compiler: --build 和 --target 一樣但 --host 不同
例:--build=x86 --host=MIPS --target=x86

Crossed native compiler: --host 和 --target 一樣但 --build 不同
例:--build=PPC --host=SPARC --target=SPARC

Canadian compiler: --build, --host, --target 都不一樣
例:--build=ARM --host=SH --target=MIPS

2013年1月20日 星期日

Object Literals - Objective-C 新的寫法

現在 Objective-C 也提供了一些新的簡化寫法,看起來似乎可以少打幾個字,程式碼也比較簡潔,但總是要花時間習慣一下。這裡整理了2012年 Apple 在 WWDC 提供的一些例子,如果有興趣,可以去官方網站下載觀看!

NSNumber Creation

NSNumber *value;
value = [NSNumber numberWithChar:'X'];
value = [NSNumber numberWithInt:12345];
value = [NSNumber numberWithUnsignedLong:12345ul];
value = [NSNumber numberWithLongLong:12345ll];
value = [NSNumber numberWithFloat:123.45f];
value = [NSNumber numberWithDouble:123.45];
value = [NSNumber numberWithBool:YES];

簡化後

NSNumber *value;
value = @'X';
value = @12345;
value = @12345ul;
value = @12345ll;
value = @123.45f;
value = @123.45;
value = @YES; 


2013年1月9日 星期三

OpenGL ES 2.0 tutorial for iOS 6 and Xcode 4.5.2 ﹣Part 2

在 OpenGL ES 2.0 tutorial for iOS 6 and Xcode 4.5.2 ﹣Part 1 中已經試過了最簡易實現的步驟,接著繼續加入 Shader  的使用。Shader 使用像 C 語言一樣的 GLSL 語言,主要有2種 Shaders,Vertex Shader 和 Fragment Shader,各自有各自的作用。讓我們加入 Shader!

建立一個空白檔案,取名為 SimpleVertex.glsl

2013年1月5日 星期六

OpenGL ES 2.0 tutorial for iOS 6 and Xcode 4.5.2 ﹣Part 1

原本的 tutorial 來自 OpenGL ES 2.0 for iPhone Tutorial,因為在它的實驗裡不是使用 iOS 6 和 Xcode 4.5.2 的版本,所以實際在執行時,遇到了一些問題,導致無法看到正確的結果。就如同我常告訴自己一樣,有不了解的東西時,一定是有觀念不懂,才看不到問題的所在,就像在實驗這個 tutorial 時,從不能執行到最後做出來後,才知道是個簡單的觀念。

實驗開始!參考 OpenGL ES 2.0 for iPhone Tutorial ,首先會遇到找不到 window-based Application 的問題,在 Xcode 4.5.2 已經拿掉,必須改用 Empty Application。

2012年12月27日 星期四

Function Pointer - 函式指標

C 語言有一個強大的功能,Function Pointer (函式指標),在我真正了解它之前,只是覺得它能用指標來代表一個函式而已。但事實上並非如此,受到物件導向程式設計的影響,當我了解什麼是多型 (Polymorphism) 而且從中明白它的強大之處,再回頭想到 Function Pointer,它們是一樣的概念,都是能在程式執行中動態地改變函式 (Function) 或方法 (Method) 。那這為什麼重要?在「軟體建構之道 第二版」(Code Complete 2) 提到了軟體開發很重要的一件事:避免複雜度。隨著自己寫程式的時間越來越長,看別人寫得的程式碼也越來越多時,真的發現了一件事,程式碼越複雜越難維護;這也不是說系統很大,功能很多而造成程式碼很複雜,想想看 Linux kernel 有多大?一樣很有系統和結構。所以,撰寫程式絕對可以寫很簡單明瞭,也可以很複雜,全在於程式設計師本身的功力而已。

回到正題,函式指標到底可以多好用?先從最基本的開始吧!