Feeds:
文章
留言

Archive for 九月 27th, 2005

VC 自動縮排功能

ㄟ~ 想不到VC有這個功能都不知道,
 
1. 先選取要縮排的程式區段
2. 再點選 "Edit | Advanced | Format Selection"
3. 完成
 
相當不錯的小功能

Read Full Post »

不太容易理解的 Union

這個 Union 還真的很少有機會用,今天剛好看書有介紹… 寫個範例留個註記
 
#include <iostream>
union uVar {
 int iVal; // 4 bytes
 char b[4];  // 4 bytes
};
int main(int argc, char* argv[])
{
 union uVar data;
 data.b[0]  = 0x01;
 data.b[1]  = 0x23;
 data.b[2]  = 0x45;
 data.b[3]  = 0x67;
 std::cout << "Size: " << sizeof(data) << std::endl; // 4
 std::cout << "Value: " << data.iVal << std::endl; // 1732584193
 std::cout << "Hex Value: " << std::hex << data.iVal << std::endl; // 67452301
 return 0;
}
 
記憶體的分派狀態,共用同一個區塊

 
上面範例是剛好安排兩個結構體一樣,實際上可以兩個結構體的大小不一樣大,例如一個為 8 bytes一個為 4 bytes。但是如果記憶體大小不一樣大時,編譯器會分配可以容納最大的記憶體空間給這個結構體。不過,我個人是沒有用不同的大小,感覺很容易混淆也不容易維護,Union可能在記憶體受限系統中會使用到吧….

Read Full Post »

fatal error C1010: unexpected end of file while looking for precompiled header directive 如果你用 Microsoft Visual C++ 編寫 C++ 時,應該常常看到這個錯誤訊息,尤其是將網路上抓到的 C++ 程式直接加到 VC 中編譯,就會出現這個訊息,或是你是建立一個新的 Win32 Console Application 應用程式,然後將 #include "stdafx.h" 註解掉,如下:
 
//#include "stdafx.h"
int main(int argc, char* argv[])
{
 printf("Hello World!n");
 return 0;
}
 
進行編譯,妳就會看到這個訊息了。
 
那這個訊息是什麼意思呢?
這個訊息是說編譯器找不到預先編譯的標頭檔,可是我並沒有使用這個啊??這是因為VC預先會啟用預先編譯功能,所謂預先編譯功能就是為了解決大量標頭檔重複編譯所產生編譯時間過長的問題,要修正這個問題有兩個方法,第一個就是依循 VC 的規格建立一個 stdafx.h 標頭檔並且將相關標準函數庫的宣告放在 stdafx.h 裡面。第二個方法就是修改 VC 的編譯參數,將 /Yu"stdafx.h" 移除即可,設定方式如下圖:

 

Read Full Post »

寫 C 語言一般會看到標頭檔的寫法是 #include<iostream.h> 和 #include"iostream.h",第一個一般是用在標準標頭檔,第二個則用在自訂的鏢頭檔上,兩者的差異在於,#include"iostream.h" 會先找尋目前資料夾裡面是否含有 iostream.h ,如果沒有則到標準標頭檔的路徑下去找,#include<iostream.h> 則直接到標準標頭檔的路徑下去找。
 
#include <iostream> 是只有在 C++ 才會出現的寫法,這個寫法主要是為了避免 C++ 標準函數庫和其他函數名稱重疊所體出來的寫法,也就是說這寫法引入了 namespace 機制,所以,只要是C++的標準函數庫都隸屬於 std namespace 之下,要使用的時候必須使用先 using 修識字,或是直接在相關的寒數之前加上 std:: 修飾,例如:
 
using std::cout;
cout << "hello";
 
std::cout << "hello";
 
補充:
一個有規模的程式會引入相當多的標頭檔,所以,很有可能造成標頭檔重複定義,對於這個問題,一般會在標頭檔中加入
 
#ifndef __CWC_LIB
#define __CWC_LIB
  // 含數定義
#ednif
 
但是這個方法有一個假設條件"沒有任何兩個標頭檔依賴相同的前置處理器常數"

Read Full Post »

C/C++ 裡面的 extern 到底有什麼用?

extern 這個修飾子可以告訴編譯器其他地方已經宣告了這個變數,也就說這個變數具有外部連結特性(linkage),以範例來看比較容易瞭解
//test2.cpp
int x = 100;
int y = 200;
————————————————————-
// test.cpp
// extern 範例
#include <iostream>
#include “test2.cpp" // 宣告 x 和 y
int a = 10;
extern int x; // 有效範圍; 整個程式
int main(int argc, char* argv[])
{
extern int y; // 有效範圍: 這個函數內
std::cout << a << std::endl; // 10
std::cout << x << std::endl; // 100
std::cout << y << std::endl; // 200
return 0;
}
假如沒有 #include “test2.cpp" ,編譯階段 test.cpp 是可以過,但是連結時會發生 x 和 y 變數無法解析的錯誤。這就是 extern 的效用,宣告變數已經在某個地方定義過。

Read Full Post »

 
這個問題有很多的答案,你可以自己辛苦一點寫一支 PHP 來達成,或透過其他工具的支援例如 MySQL-Front、phpmyadmin等,或是乾脆直接透過 mysql shell 執行 SQL 後將結果導到一個檔案(mysql -e "SELECT …" > outfile ),但是,今天又學到一個新的方法,原來可以使用 SELECT … INTO OUTFILE ‘filename’ 的 SQL 語法來達成,我查了一下 MySQL的手冊發現,這個方法有一些限制:
1. 在伺服器上必須具有使用檔案的權限
2. 輸出的檔案不可以存在,因為基於安全的考量不允許覆寫檔案
 
說的這麼多,不如一個範例來的明瞭,如下:
 
SELECT * INTO OUTFILE "/tmp/result2.text"
FIELDS TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘"’
LINES TERMINATED BY "n"
FROM CO_student
 
OPTIONALLY ENCLOSED、FIELDS TERMINATED BY 和 LINES TERMINATED BY 是用來替換字元,例如LINES TERMINATED BY是設定每一列(row)後面的斷行以 "n" 取代
 
result2.text 將會以類似 csv 格式存檔

Read Full Post »