Buy Reviews
Powered by MaxBlogPress  

Archive for the ‘C_and_CPP’ Category

Set Color Number

星期四, 九月 2nd, 2010點閱人數:2次

在看過30天打造OS!作業系統自作入門(附光碟)的04-05 指標的應用(二)這節後,ㄚ琪要進展到04-06 設定顏色編號,http://community.osdev.info/?VGA這裡的視訊DA轉換器是本節會用到的資訊:

  • 0x03c6:ピクセルマスクレジスタ(8bit、R/W)
    • bit0-7:DAコンバータが受け取ったカラーコードは、このレジスタの内容でマスクされた後にRGBに変換され、ディスプレイに送られる。
  • 0x03c7:ステータスレジスタ (8bit、R)
    • bit0-1:これが00だったら書き込み中
    • bit2-7:リザーブ
  • 0x03c7:アドレスレジスタ (8bit、W)
    • ここに書き込みアクセスすると、パレット読み込みモードになる
    • bit0-7:パレット番号
  • 0x03c8:アドレスレジスタ (8bit、W)
    • ここに書き込みアクセスすると、パレット書き込みモードになる
    • bit0-7:パレット番号
  • 0x03c9:データレジスタ (8bit、R/W)
    • bit0-7:RGB成分の一つ(0~63)
      • 書き込むときは上位2ビットを0に、読み込むときは上位2bitを0と見なす
  • パレットのアクセスの手順
    • まず一連のアクセス中に割り込みなどが入らないようにする(たとえばCLI)。
    • 0x03c8に設定したいパレット番号を書き込み、続いて、R、G、Bの順に0x03c9に書き込む。もし次のパレットも続けて設定したいのなら、パレット番号の設定を省略して、さらにRGBの順に0x03c9に書き込んでよい。
    • 現在のパレット状態を読み出すときは、まず0x03c7にパレット番号を書き込んで、0x03c9を3回読み出す。これが順にR、G、Bになっている。これももし次のパレットも読み出したいときは、パレット番号の設定を省略してRGBの順に読み出してよい。
    • 最初にCLIした場合は、最後にSTIする。

貼上日文的自行參考,中文就自己買書來看吧!

接著04-07 矩形的繪製處理,透過用#define顏色的代碼,讓我們不用記那麼多的顏色代碼,其餘看程式怎麼做就行了!

04-08 最終的成果長這樣:

2010-09-02_160526

看到這個徒有沒覺得跟WX的畫面很像啊!原來自己DIY OS是這樣的喔!

Finally Begin to import C Language

星期三, 九月 1st, 2010點閱人數:5次

在看過30天打造OS!作業系統自作入門(附光碟)的03-08 邁向32位元模式前的準備工作這節後,ㄚ琪要進展到03-09 終於開始導入C語言,這一節主的一些指令一定要記起來,不然下週書還了,又不知要如何進行了。

首先使用cc1.exe由bootpack.c製作bootpack.gas。

然後使用gas2nask.exe由bootpack.gas製作bootpack.nas。

接著使用nask.exe由bootpack.nas製作bootpack.obj。

並且使用obj2bim.exe由bootpack.obj製作bootpack.bim。

最後使用bim2hrb.exe由bootpack.bim製作bootpack.hrb。

然後使用copy命令,將asmhead.bin與bootpack.hrb連結起來,就成了haribote.sys。

先試著紀錄這幾個部份,再繼續往下一章看!

在04-03向指標挑戰這裡,使用C語言的指標跟組合語言的關係,在宣告的部份:

char *p; /* BYTE用位址的情況 */

short *p;/* WORD用位址的情況 */

int *p;/* DWORD 用位址的情況 */

程式:

void HariMain(void)
{
int i; /* 変数宣言。iという変数は、32ビットの整数型 */
char *p; /* pという変数は、BYTE [...]用の番地 */

for (i = 0xa0000; i <= 0xaffff; i++) {

p = i; /* 番地を代入 */
*p = i & 0x0f;

/* これで write_mem8(i, i & 0x0f); の代わりになる */
}

for (;;) {
io_hlt();
}
}

用這個去make run的話,會發生

bootpack.c:10: warning: assignment makes pointer from integer without a cast

第10行p = i; /* 代入位址 */這是轉型的問題,只要做p = (char *) i;的修正就可以解決問題!

所以專欄二中,有個進階的寫法:

p =(char *)  i; /* 番地を代入 */
*p = i & 0x0f;

可以寫成:

*((char *) i) = i & 0x0f;

而這又跟組合語言的BYTE [i] = i & 0x0f;很像。

專欄3指標跟位址的說明很清楚,我就不重述紀錄了!

什麼是Symbian工具包?

星期一, 八月 9th, 2010點閱人數:6次

這一篇譯文在http://developer.symbian.org/wiki/index.php/What_are_the_Kits%3F/zh-hans

本處僅做備份!

本文件提供有關軟體套件的相關資訊。

套件主要針對應用程式開發人員(他們建構應用程式在Symbizn平台上)或是”產品”開發人員(他們使用Symbian平台來建構設備且/或開發程式碼來貢獻或補足這個平台),也有針對工具鏈開發人員跟那些想要專注在基本的埠跟設備驅動程式的開發人員所用的額外套件。

所有的套件和工具都是免費的,所有的套件都提供給每一個開發人員,雖然有些特定的套件會跟特定的開發人員較有關係。

你需要什麼套件?

我如何能夠跟上最新的工具包?

要跟上最新的工具包新聞和版本你可以:

其他工具包

  • 製造商的SDK擴充Symbian的SDK來支援附加設備的特定功能以及平台的模擬器外觀,這些包括新的諾基亞設備的Symbian^3 SDK跟諾基亞的Qt SDK。
  • 工具包的外掛和擴充包 擴充工具和軟體工具包來建構Symbian平台提供的軟體補充或擴充的軟體,例如,外掛可以建來擴充”標準”C/C++的支援,或是允許工具包用來跟其他程式語言開發。

進一步資訊

所有維基裡工具包的資訊見 Category:Kits.

下面(複雜的)圖表提供一個Sybian工具包相互作用的視覺化概述: Kits interactions diagram (pdf)

Knowledge Gained by Back to Basics

星期三, 七月 14th, 2010點閱人數:9次

今天我繼續將約耳趣談軟體:來自專案管理的現場實錄這本書看下去,到了回歸原點這裡,我突然感覺Joel Spolsky是個底子很深厚的人,因為這一次討論的主題說要回歸到CPU,然後自以為C很厲害的ㄚ琪就被打了一棍,原來C的字串有這麼大的問題!它處理字串的演算法竟然像是油漆工Shlemiel的笑話,哇,這麼大的笨方法怎沒有人更正,還讓我玩C玩得這麼爽的!

C的字串用法:它們是由一串位元組後面接一個null字元(值為0)所組成。這裡有兩個明顯的暗示:

  1. 必須整個字串走一遍找到結尾的null字元,才能知道字串在哪裡結束(也就是說字串的長度)。
  2. 字串裡不能有任何零。所以你不能用C字串來儲存JPEG圖片之類的二進位大物件。

像這支程式:

void strcat( char* dest, char* src )
{
while (*dest) dest++;
while (*dest++ = *src++);
}

ㄚ琪並未看出來有什麼不妥?連Kernighan和 Ritchie也是如此,Joel Spolsky說當資料量變大時,效能就會變得很慘!

好了,如果你要重寫strcat,並且想要用記憶體配置器malloc來做的話,其實這個也是ㄚ琪很喜歡用的函式,他就提出這個問題,如果這個函式「可以自動重新配置目的緩衝區。這個函數是否應該每次都重新配置到剛好的大小呢?」嗯,我覺得很困難,所以他的老師Stan Eisenstat就出來講話了,「當你呼叫realloc時每次都應該用原本配置大小的兩倍。意思是永遠不必呼用realloc超過lg n次,即使是對很大的字串來說也會有很不錯的效率特性,而且也絕不會浪費超過一半的記憶體。」看起來很像是你要數學夠好才會懂,沒錯,這就是寫程式的人要懂數學的原因,不然寫出來的程式都會像是笨油漆工那樣!

他在Working on CityDesk, Part Five提到了SQL中select跟XML比較的問題,看來XML這個新潮流再效能上也是有很多問題啊,那學這個的人,不就…。

所以學程式要像『像電影「小子難纏」一樣。不斷的上蠟打蠟。三個星期後輕輕鬆鬆就把別的小鬼幹掉了』,小子難纏沒看過,有空找來看看好了!

結論是不要自以為C是很底層了,因為如果瞭解底層的話,C裡面的事還是有不合理的!但是比較起來C還是比其它語言好多了,這在第一章時Joel Spolsky已經提過了!

程式語言教學 – C、C++、OpenGL、STL

星期三, 五月 19th, 2010點閱人數:210次

想要學C++嗎?C++很容易,第一課 (所有課程)
想要學C嗎? C很容易,第一課 (所有課程)
在找進階主題嗎? 查看完整的教學列表
C++ 教學跟C 教學、OpenGL的C++教學、C++標準模板庫(STL)教學、C跟C++程式語言跟電腦科學的相關文章,還有Denthor Asphyxia的圖學涵蓋C++(主要是C程式碼),有更正或要提交此頁請寄給我郵件到
透過RSS訂閱更新

程式語言教學地圖

C++很容易:學習用C++寫程式

[至頂]

C教學 – C很容易

這份教學是根據上面教學而來,但只使用標準C語言的功能。

[至頂]

更進階的C跟C++語言功能

[Top]

C++標準模板庫(STL)

[Top]

瞭解浮點數 Jeff Bezanson著

每個程式設計師應該足夠瞭解浮點數來避免假設完美精度的陷阱。

[Top]

使用遠端程序呼叫(RPCs) eff Bezanson著

[Top]

在C++中使用Microsoft ADO與SQL Databases Patrick Mancier著

SDL教學

(By Thomas Carriero)

[Top]

OpenGL教學

(By RoD)

[Top]

三維的旋轉 Confuted 跟 Silvercord著

這事一系列的教學詳細說明執行三維旋轉所需的數學處理。

[Top]

圖形程式設計教學

我提供這些教學比較像是程式設計知識的遺跡而不是今天如何用心研讀來設計圖形;不過,假如你正在搜尋C/C++的DOS圖形,這些教學可能很有用,這些教學由Grant Smith,又名Denthor of Asphyxia所寫,你可子在教學這裡找到所提的原始程式碼

[Top]

AI 教學

[Top]

資料結構

  • 堆疊 學習堆疊是什麼以及何時使用
  • 佇列 學習佇列是什麼以及如何使用
  • 堆積 學習堆積是什麼、為何、何時及如何使用
  • 在電腦科學中的圖形 學習有向跟無向圖形的差意跟為何使用他們
  • 二三樹 學習幫助平衡搜尋樹的資料結構

[Top]

最優效率的演算法、排序跟搜尋演算法

[Top]

進階演算法

[Top]

電腦科學理論

程式撰寫風格

[Top]

編譯器跟Makefiles

[Top]

記憶體管理

一旦你完成了這些教學,做一下C++記憶體管理測驗
[Top]

除錯

[Top]

其他的程式語言

[Top]

其他的程式設計文章

[Top]

圖解手機Nokia 97 Symbian C++ 程式快速入門大公開

星期四, 五月 6th, 2010點閱人數:114次

ㄚ琪擁有Nokia 5800已經快一年了,這期間一會兒玩javaME,這會兒又玩C,真是不亦樂乎,不過今天終於讓我試成功了最簡單的hello world應用程式了,Cool!這一切得歸功於Symbian C++ Quick StartDevelopment Environment Troubleshooting Guide這兩篇的協助,就讓我大概來貢獻一下中文圖解吧!對了,軟體是英文!

設定開發環境

1.perl,強烈建議使用perl 5.6.1,而且最好安裝在C槽,這是我的痛苦經驗,聽先人跟我講的準沒錯!

2.Application Developer Toolkit (ADT),這個網址提供的是1.0版的,可是有更新的1.4版的ADT 1.4 可以下載,新的總是不錯的,你說是不?

3.Symbian^1 Software Developer Kit (SDK),我下載的是Nokia_N97_SDK_v1.0,當然都是為了配合我的Nokia 5800玩的!

2跟3的軟體也是建議使用預設的安裝路徑,應該都是在C槽吧!這點很重要喔!

啟動Carbide.c++

開始->Symbian Foundation ADT v1.4->Carbide.c++->Carbide.c++

2010-05-06_111007

一開始就照預設的按OK吧!

2010-05-06_111602

哼!有錯誤,先不管它,其實也不懂是什麼錯誤,只好按OK!

2010-05-06_111635

然後它說我沒devices.xml,確實是沒有,按Yes吧!

2010-05-06_113644

後來在C:\Program Files\Common Files\Symbian這裡果真看到了這個產生的檔案!因為我是先裝Nokia 97的SDK所以看起來這個Carbide.c++不認識這個SDK,也沒有自動掃描到的能力,所以才叫我們去新增!

2010-05-06_114040

Window | Preferences | Carbide.c++ | SDK Preference 就可以看到上圖的畫面

2010-05-06_114628

SDK ID開始我也不知道要填什麼?就拿SDK的安裝路徑來碰碰運氣了,果真沒有錯!

2010-05-06_114644

就可以得出一些訊息出來!

建立專案

File | New | Symbian OS C++ Project.照著做吧!然後選下圖的GUI Application with UI Designer

2010-05-06_114801

2010-05-06_114833

New Symbian OS C++ Project,取個專案名稱!

2010-05-06_114854

Symbian OS SDKs

Emulator Debug (WINSCW)就是Windows上的模擬器
Phone Debug | Release (GCCE)使用這個SDK附得GCCE編譯器
Phone Debug | Release (ARMV5)使用ARM RealView Compiler (RVCT),這個編譯器是啥?我無栽…

2010-05-06_114937

Application properties

Baseline SDK就選我唯一安裝的!

2010-05-06_115008

選預設Empty.

2010-05-06_115030

Container Name and Type

2010-05-06_115129

沒什麼好改的吧!

2010-05-06_115557

畫面出來了,但是原本不是這個畫面,是透過Eclipse的操作調整出來的!

目標模擬器

2010-05-06_115844

點工具列的Manage configurations for the current project 這個按鈕

或是Project | Build Configurations | Set ActiveEmulator Debug

2010-05-06_115916

按工具列的Build 按鈕

Project | Build Project

2010-05-06_120034

哇!一堆警告!不管它,反正我也看不懂是什麼問題!

模擬器執行

2010-05-06_145620

按Run 按鈕 (Ctrl + F11).

很順利 YA!

目標到設備

2010-05-06_153637

在Manage configurations for current project 工具列點按鈕 ()

按Build 按鈕 (或 Project | Build Project)。

2010-05-06_154020

糟糕有錯了!

2010-05-06_160458

錯誤落落長!

2010-05-06_162222

這個問題有可能的原因就是我白目,沒把perl裝在C槽,去Google很多人都建議我要這樣做,好吧,就搬家吧!還記得把環境變數的路徑修改喔!

2010-05-06_163417

還是不行,也有人勸說要注意EPOCROOT的設定,我只好把前面沒有C:加進來,但是我覺得這不是問題!

後來一直白目了很久,一直錯誤,有人也建議移除這個錯誤的專案,重建吧!

我不死心,又搞了一陣子,後來要回家了,好吧!重建專案,傑克真神奇Ya!可以編譯執行了!

真有成就感,終於寫出了曠世最簡單的Hello World!的程式了!

相信後來的程式碼都不會難倒我了!

2010-05-06_165220

C/C++入門

星期三, 四月 14th, 2010點閱人數:64次

今天究竟要如何開始使用C / C + +

從大學開始學C到現在掐指一算好像也有21年了,C++雖然是晚近才開始摸的,但是怎麼我感覺我的C功能,跟我的英文一樣菜呢?好吧!今天來看看cprogramming.com的這一篇C/C++入門導覽,看看我們還有哪些是欠缺不會的!

一旦你開始了之後,Alex Allain推薦

下面有更多的資料,請繼續閱讀。

繼續閱讀 »

標準 C++ 類別的成員函式 c_str()

星期五, 四月 9th, 2010點閱人數:147次

功能:將string物件轉換成C語言形式的字串常數。

使用格式:const char* c_str ( ) const;

說明:c_str() 演算法會把string物件轉換成C語言形式的字串常數。由於轉換之後的字串已經變成常數,因此無法再任意更改。若有特殊原因必須更改字串常數時,應該先把字串常數儲存到緩衝區(buffer)之後再予以更改。

範例:

// strings and c-strings
#include <iostream>
#include <cstring>
#include <string>
using namespace std;

int main ()
{
  char * cstr, *p;

  string str ("Please split this phrase into tokens");

  cstr = new char [str.size()+1];
  strcpy (cstr, str.c_str());

  // cstr now contains a c-string copy of str

  p=strtok (cstr," ");
  while (p!=NULL)
  {
    cout << p << endl;
    p=strtok(NULL," ");
  }

  delete[] cstr;
  return 0;
}

 

ㄚ琪在Windows的命令列下,用g++編譯,輸出:

Please
split
this
phrase
into
tokens

C++ Windows Sockets

星期一, 三月 29th, 2010點閱人數:68次

今天在看這一本精通Windows Sockets網路程式設計:使用Visual C++,這裡面是用Microsoft Visual Studio 6.0來開發講解的,現在要找到這個版本應該很難了吧,來試試看,用Visual Studio 2010 Express會不會有問題!

在控制台程式的部份

2010-03-29_115923

好像沒有了課本所說的那種A “Hello,World” application這種專案了,另外沒提到的 An application that supports MFC.也沒有了!2010-03-29_120059

MFC應用程式,基本上我找不到如何對應到新版的專案設定!

看來接下來繼續看,可能會很累!

stardict get_user_config_dir

星期四, 三月 25th, 2010點閱人數:4次

std::string get_user_config_dir()
{
const gchar *config_path_from_env = g_getenv(“STARDICT_CONFIG_PATH”);
if (config_path_from_env)
return config_path_from_env;
#ifdef _WIN32
std::string res = g_get_user_config_dir();
res += G_DIR_SEPARATOR_S “StarDict”;
return res;
#else
std::string res;
gchar *tmp = g_build_filename(g_get_home_dir(), “.stardict”, NULL);
res=tmp;
g_free(tmp);
return res;
#endif
}

這個函式應該滿單純的!