先看一下以下的例子,你知道哪個可以改內容,哪個不能改嗎?
char *name = "Jack";
char name[] = "Jack";
在 C 裡很常會用到字串,使用的時候要注意,宣告時的不同,會造成使用上的不同。像上面的例子,char *name 是不能修改的;char name[] 才能夠修改。要區分它們,要了解它們在記憶體上的什麼位置。
2013年8月20日 星期二
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)
$ 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 是比較快的方式。
標籤:
Linux,
Programming
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
要注意紅色的括號!
因為容易犯這個錯,所以在這裡記下來~
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
要注意紅色的括號!
因為容易犯這個錯,所以在這裡記下來~
標籤:
Programming,
Shell
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
首先,根據不同的組合,它們有不同的名稱:
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
標籤:
GCC,
Linux,
Programming
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;
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;
標籤:
Objective-C,
Programming,
Xcode
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
建立一個空白檔案,取名為 SimpleVertex.glsl
標籤:
Multimedia,
OpenGLES,
Programming,
Xcode
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。
實驗開始!參考 OpenGL ES 2.0 for iPhone Tutorial ,首先會遇到找不到 window-based Application 的問題,在 Xcode 4.5.2 已經拿掉,必須改用 Empty Application。
標籤:
Multimedia,
OpenGLES,
Programming,
Xcode
2012年12月27日 星期四
Function Pointer - 函式指標
C 語言有一個強大的功能,Function Pointer (函式指標),在我真正了解它之前,只是覺得它能用指標來代表一個函式而已。但事實上並非如此,受到物件導向程式設計的影響,當我了解什麼是多型 (Polymorphism) 而且從中明白它的強大之處,再回頭想到 Function Pointer,它們是一樣的概念,都是能在程式執行中動態地改變函式 (Function) 或方法 (Method) 。那這為什麼重要?在「軟體建構之道 第二版」(Code Complete 2) 提到了軟體開發很重要的一件事:避免複雜度。隨著自己寫程式的時間越來越長,看別人寫得的程式碼也越來越多時,真的發現了一件事,程式碼越複雜越難維護;這也不是說系統很大,功能很多而造成程式碼很複雜,想想看 Linux kernel 有多大?一樣很有系統和結構。所以,撰寫程式絕對可以寫很簡單明瞭,也可以很複雜,全在於程式設計師本身的功力而已。
回到正題,函式指標到底可以多好用?先從最基本的開始吧!
回到正題,函式指標到底可以多好用?先從最基本的開始吧!
訂閱:
文章 (Atom)