- Dec 14 Tue 2010 00:24
-
C語言 滑鼠連點程式
- Dec 13 Mon 2010 00:17
-
XOR Rubberbanding (圖學 橡皮圈)
- Dec 09 Thu 2010 00:50
-
設定OpenGL Camera 相機 正交圖與透視圖
- Dec 08 Wed 2010 22:33
-
在VS 2008 底下 創建DLL檔的方式
新建專案 -> Console Application -> 選 DLL File
1. 在 DLL 檔裡面要先 Define 這行!
#define DLL extern "C" __declspec(dllexport)
2. 開始在 DLL 檔裡面寫 Function !!
DLL int sum(int c){ return ++c; }
--------------------------------------DLL 檔寫完了
如何呼叫 DLL 檔裡面的 Function ?
在一個MFC程式中..
HINSTANCE hinstDLL=LoadLibrary(L"theDLL.dll"); //讀取 DLL
if(hinstDLL!=0){ //如果有找到 DLL 檔
typedef int(__cdecl *Connect)(int i); //先宣告一下要連結的函式的prototype
Connect Proc; //宣告一下連結用的Connect指標 (應該是指標吧!?)
Proc = (Connect)GetProcAddress(hinstDLL,"sum"); //用Proc連結 DLL 中的函式
int get=Proc(2); //開始使用DLL中的函式,注意DLL中的函式名稱從sum變成Proc了
FreeLibrary(hinstDLL); //DLL用完沒有利用價值了,就可以扔了
CString g;
g.Format((CString)"%d",get); //這三行是顯示函式回傳的值,應該是2+1=3 才對
MessageBox(g);
}
else{ printf("找不到你的DLL檔啦!你放在哪裡!?"); }
- Dec 07 Tue 2010 22:24
-
Computer Architecture
Pipeline
overlapping execution / Parallelism improves performance
if -> instruction fetch
id -> decode instruction and (read) register
ex -> execution (operation) and calculate address
mem -> (access memory operand)
wb -> write result back to register
hazards
1. Structure
require separate instruction/data memories or caches
2. Data
a.stall b.bypassing/forwarding c.scheduling
3. Control
a.stall b.prediction c.reduce branch time
SRAM / Cost Highest / Speed Fastest
DRAM / Cost Higher / Speed Faster
Magnetic Disk / Cost the less / Speed slowest
cache
1. direct associated 2.set associated 3.fully associated
Write-through -> Updates both upper and lower hierarchy memory
Write-back -> Updates both upper hierarchy memory, and updates lower if needed
compulsory miss -> 一開始啟動時沒寫入資料 肯定會發生的miss情況 (cold start miss
)
capacity miss -> due to finite cache size
conflict miss -> due to not fully associated
virtual memory -> the main memory works as a "cache" of a magnetic disk
bit->byte->word->block->page
register->cache->memory->secondary magnetic disk
RAID 0 - No Redundancy
RAID 1 - Mirroring
RAID 2 - Error Detection and Correction Code
RAID 3 - Bit Parity Bit
RAID 4 - Block Parity Bit
RAID 5 - Distributed Block Parity Bit
RAID 6 - P+Q Redundancy
- Dec 06 Mon 2010 22:16
-
C 分割字串
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char str[] = "This is a good example"; //要被分割的
char *s = strtok(str, " "); //分割的判斷字元
char *put[100]; //分割後放入新的字串陣列
int s_count=0; //分幾個了
while(s != NULL) {
put[s_count++]=s; //把分出來的丟進去 結果陣列
s = strtok(NULL, " "); //我不知道 這行幹嘛
}
for(int x=0;x<s_count;x++) //驗收成果
printf("%d %s\n",x,put[x]);
system("pause");
return 0;
}
/*補充 其實改成 strtok(str," @"); 這樣的話
即使是 This@is a good@example
也會分成 "This" "is" "a" "good" "example" 了*/
- Dec 05 Sun 2010 23:54
-
所有的知識 來自同源
- Dec 04 Sat 2010 23:40
-
Program / Process / Thread 的差別
Program:放在二次儲存裝置中,尚沒有被Load到記憶體的一堆Code
稱之為「程式」。 (也就是還是死的)
Process:已經被Load到記憶體中,任何一行Code隨時會被CPU執行,且其宣告的在記憶體
的變數的值會隨著需求而不斷變動。
稱之為「程序」。 (也就是活的Program) => 恐龍本第三章
一個多工作業系統(Multitasking Operating System)可以同時運行多個Process
然而一個CPU一次只能做一件事情,但CPU的數量永遠少於運行中的Process數,
因此每個Process使用的時間需要被排程(Scheduling) => 恐龍本第五章
又每個Process間在記憶體中,如果擺放的方式不當,就會在記憶體中產生很多
沒辦法用到的碎片,因此MemoryManagement是一個問題 => 恐龍本第八章
另外,每個Process所需要的記憶體總合,也可能大於實體記憶體,因此需要另
外用二次儲存裝置充當虛擬記憶體(Virtual Memory),但是二次儲存裝置的速
度肯定很慢,因此如何做到對虛擬記憶體最小的依賴,盡量避免Page Fault(電
腦在主記憶體中找不到資料,而要去二次記憶體找,就稱為Page Fault)
防止Thrashing的發生(因為Virtual Memory演算法不當,造成幾乎每次存取都要
依賴二次記憶體,就是Thrashing),以達到效能最佳化,也是個學問 => 第九章
Thread :在同一個Process底下,有許多自己的分身,就是Thread,中文又翻成執行緒。
以往一個Process一次只能做一件事情,因此要一面輸入文字,一面計算字數,
這種事情是不可能的。但是有了Thread之後,可以在同一個Process底下,讓輸
入文字是一個Thread,計算文字又是另外一個Thread,對CPU來說兩個都是類似
一個Process,因此兩個可以同時做。
又一個Process底下有數個Thread,而一個Process的Global Variable可以讓
它的所有Thread共享,也就是所有Thread都可以存取同一個Process的Global
Variable。而每個Thread自己也有自己的專屬Variable。 => 恐龍本第四章
但是,如果有兩個Thread要存取同一個Global Variable,有可能發生問題,
也就是說可能會存取到錯的值(例如兩個Thread同時要對一個Variable做加減,
最後那個答案可能會是錯的),這就是Synchronization問題 =>恐龍本第六章
又,每一個Thread之間可能會互搶資源,而造成死結(Deadlock),只要以下四
個條件都滿足就有死結。(1)這個資源不能同時給兩個人用 (2)有一個人拿了一
個資源,又想拿別人的資源 (3)如果一個人占了茅坑不拉屎,占用資源很久,仍
不能趕他走 (4)A等B,B等C,C等D,D又等A 等成一圈。 要解決這種狀況有
Avoid(預防) 或 避免(Prevent)兩種方式,破除以上四種其中一種即可。
=> 恐龍本第七章
- Dec 04 Sat 2010 22:06
-
DRAGON QUEST(勇者鬥惡龍) 戰鬥系統初解
上一篇FinalFantasy的系統 用到了執行緒的概念 (multithreading)
但是執行緒必須配合其運行的作業系統才能使用
這次的DragonQuest並沒有使用到執行緒
所以其實在DOS底下就可以寫出一個模擬程式了
================================================
Dragon Quest的特點是「真正的回合制」
每一回合,必須在敵我雙方把指令都做完之後,才會發動
然後依據雙方的速度,去決定哪一個角色先動作
有趣的是,只要你下完指令之後,這一回合就是完全看電腦動畫表演給你看了
也就是一旦下完指令之後,你角色這一回合的生死就聽天由命啦!
================================================
在一回合開始的時候,指令選單會開啟,讓你去決定角色要做什麼動作
全部的角色都指定完動作之後,電腦就開始抓取各角色目前的速度值
例如抓到的速度值是
- Dec 03 Fri 2010 22:03
-
FINAL FANTASY (太空戰士) 戰鬥系統初解
- Dec 02 Thu 2010 20:24
-
無聊自編資工面試題目
1. 電腦動畫,像是GIF格式,通常是一張一張換圖來達成,「循環不斷」的
例如畫格是 1.2.3.4.5.1.2.3.4.5.1.2.3.4.... 這樣依序顯示
請用一個最簡單的方法,讓數字可以依照 1.2.3.4.5.1.2.3.4.5.1.2.3.4.5....
這樣的順序一直無止盡的循環下去。
2. 請用最簡單的方法,算出 2+4+6+8+10+12+...+n = ?
3. 如果你要寫一個射擊遊戲,畫面上的子彈可以顯示無限顆,直到記憶體用完,
你的資料結構要怎麼設計?
4. 如果你在智慧型手機上寫一個連線遊戲,你會用TCP socket或UDP socket?
請說出你的理由。
5. 使用pass by value和pass by address的好處壞處分別為何?
假設經由pass by address傳送一個值到某個function裡面,
我在該function裡面更改該值,在function外面的那個變數會不會跟著改變?
(注意:以上都是local variable 非 global)
6. 將下列function改為遞迴形式:
int get_ans(int n){
int b=0;
for(int a=n;a>=1;a--)
b+=3;
return b;
}
例如畫格是 1.2.3.4.5.1.2.3.4.5.1.2.3.4.... 這樣依序顯示
請用一個最簡單的方法,讓數字可以依照 1.2.3.4.5.1.2.3.4.5.1.2.3.4.5....
這樣的順序一直無止盡的循環下去。
2. 請用最簡單的方法,算出 2+4+6+8+10+12+...+n = ?
3. 如果你要寫一個射擊遊戲,畫面上的子彈可以顯示無限顆,直到記憶體用完,
你的資料結構要怎麼設計?
4. 如果你在智慧型手機上寫一個連線遊戲,你會用TCP socket或UDP socket?
請說出你的理由。
5. 使用pass by value和pass by address的好處壞處分別為何?
假設經由pass by address傳送一個值到某個function裡面,
我在該function裡面更改該值,在function外面的那個變數會不會跟著改變?
(注意:以上都是local variable 非 global)
6. 將下列function改為遞迴形式:
int get_ans(int n){
int b=0;
for(int a=n;a>=1;a--)
b+=3;
return b;
}
- Sep 12 Sun 2010 08:59
-
高靈敏性的G-Sensor Remote解決方案



