2010年2月20日 星期六

「晨間日記」

這一次年假回到台南休息了一陣子,看到老弟房間有一本「晨間日記」拿起來看了一下,覺得似乎不錯!

可以開始試著試試看!

參考資料:
Mulberry的時間事件簿

2010年2月9日 星期二

Office2003不能存檔

最近突然在Word不能存檔,為了解決這一個問題,我還重灌了office。

耶!突然可以了!但是,更新了Office之後,竟然又不行了!因為一直出現Office Genuine Advantage,我還在想說會不會序號有問題?不對啊,這是公司的版本啊!

那就只好上網看看有沒有人遇到同樣的問題吧!
噹噹!果然是有的!同樣是因為玩過RamDisk後,又把它移除之後產生的問題!

之前玩過Ram Disk,好像有把Temp的目錄移過去,於是就檢查了一下檔錄檔.

在執行的地方打入regedit

找到這個路徑 :

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders

看一下這個目錄下的Cache的設定

果然Temporart Internet Files是設在一台不存在的Device,把它改為C:\Temporart Internet Files

噹噹,解決啦!

參考資料:
[資訊] word無法存檔

解決「命令提示字元」亂碼的問題

在公司的電腦的「命令提示字元」會出現亂碼的情況,為了解決這一個問題,在網路上找到解答啦!

Windows版本為中文,語系設定為中文語系沒有錯誤

所以請使用者用chcp指令查詢語系,結果是cmd視窗本身跑英文語系所以視窗會出現亂碼,因為中文字抓不到...

解決方式:

1.在命令提示字元視窗處的標題按右鍵選預設值,然後將預設字碼頁改成950
2.用chcp指令直接更改頁碼,但僅限該命令提示字元視窗。

方法二:
在開始運行裡輸入regedit 找到分支HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe

再雙擊右邊CodePage選項將數值改為十進制950

參考資料:
CMD環境恢復中文 dos(cmd)中文亂碼解決方案!
開啟CMD視窗之後中文會顯示亂碼
Windows下Chcp命令的用法

2010年2月2日 星期二

nmake 簡單教學

在Linux下使用的是make,而在Windows下使用的就是nmake啦!

在語法上,有一些不同,這裡留下一些記錄!

有很多語法跟在Linux下的make是相同的,可以參考Makefile - 簡單教學

!IFDEF
了解後面的變數是否有被定義,若有被定義的話,就執行後面要執行的指令!

!IFNDEF
了解後面的變數(可以是全域變數)是否有被定義,若有沒有被定義的話,就執行後面要執行的指令!

!IF
在後面的判斷式是否成立

!ENDIF
做為!IFDEF的結尾

!ELSE
!IF, !ENDIF一起使用的語法

!ELSEIF
是跟!IF!ELSEIF!ENDIF一起使用的,與!ELSE不同的是,後面可以接判斷式

!ERROR
顯示出後面的錯誤訊息,並且停止nmake的執行

!MESSAGE
顯示出後面的訊息,但與!ERROR的差別在於,並不會停止nmake的執行!

!INCLUDE
把後面接的檔案的內容貼到目前的位置上

!ELSEIFDEF
!ELSE IFDEF 的同義資料表。

!ELSEIFNDEF
!ELSE IFNDEF 的同義資料表。

!UNDEF macroname
取消定義 macroname。

而要讀取出變數的內容的話,則必需使用$()把它包起來!

下面就一個編譯.cpp的例子
food.hfood.cppmain.cpp請參考這裡
另外,要注意的一點是,這裡的[tab]指的是,一定要用tab鍵產生出來的,在linux的make,指令前一定要用[tab]鍵,但是,在nmake似乎沒有這一個限制,但是,基於習慣與相容性,我還是會用[tab]鍵。
mymake
# Program, flags, etc.
CC      = cl
CCFLAGS = /c
OBJ     = main.obj food.obj
TARGET  = main.exe

everything: $(TARGET)

clean:
[tab]del $(OBJ) $(TARGET)

all: clean everything

food.obj: food.cpp
[tab]$(CC) $(CCFLAGS) food.cpp /Fo$@

main.obj: main.cpp
[tab]$(CC)  $(CCFLAGS) main.cpp /Fo$@

main.exe: $(OBJ)
[tab]$(CC) $(OBJ) /Fe$@


而,可以透過隱含規則再簡化Makefile的內容,請參考Makefile - 簡單教學
# Program, flags, etc.
CC      = cl
CCFLAGS = /c
OBJ     = main.obj food.obj
TARGET  = main.exe
FLAGS   =

!IF "$(NAME)" == "koba"
!MESSAGE  You want to try Koba phase
FLAGS = /DKOBA
!ELSEIF "$(NAME)" == "caspar"
!MESSAGE  You want to try caspar phase
FLAGS = /DCASPAR
!ELSE
!MESSAGE  You want to try other phase
!ENDIF

everything: $(TARGET)

clean:
[tab]del $(OBJ) $(TARGET)

all: clean everything

.cpp.obj:
[tab]$(CC) $(CCFLAGS) $< /Fo$@ $(FLAGS)

$(TARGET): $(OBJ)
[tab]$(CC) $(OBJ) /Fe$@


這裡要注意的是,在Windows下的nmake與Linux下的make的語法確實有所不同!例如在隱含規則就有非常大的不同。可以參考Makefile - 簡單教學
像是$<(只能用在隱含規則中),而在make就沒有這一個限制!

可以執行以下的命令,看出輸出結果有所不同!
下面三個nmake指印選一個執行
$ nmake /f mymake all name=caspar
$ nmake /f mymake all name=koba
$ nmake /f mymake all

最後再執行編譯出來的結果

$ main.exe

[2011.09.18 補充]
!IF DEFINED(DATE) && DEFINED(TIME)
確認DATE與TIME變數同時有被定義

!IF EXIST(File.txt)
確認File.txt存在時,才做以以下被包住的程式碼

[2011.12.07 補充]
參考簡單的 nmake 使用的 Makefile 範例得知,nmake有一個替換功能
巨集替換

[2012.01.03 補充]
在nmake的指令中,如果要定義巨集有包含空格,請以引號括住這些定義。

這裡要解釋一下,

target : prerequisites
command

1. $@表示target的第一個名字,也就是代表目前的標的(target)
2. $**目前目標的所有相依性(一般linux下是用$^來表示
3. $?同一個規則的所有先決條件名,但是只有原始程式碼改過的比obj檔新才會符合,也就是比target還新的先決條件檔案。
4. $*同一個規則的第一個先決條件,但是不包含副檔名
5. $<具有比目前目標較晚之時間戳記的相依性檔案。只有在介面規則的命令中才有效。


參考資料:
nmake的用法
筆記:學習vc之cl, link, rc常用參數
命令行編譯工具NMAKE
對於.NET中的NMake和Makefile的理解
NMAKE Reference
[C++] nmake 最簡單範例
Nmake Tool
簡單的 nmake 使用的 Makefile 範例