GuiToolkit(開源,類似Visual Studio 2003風格)
http://www.beyondata.com/default.htm
GardenUI(免費,界面效果挺好的,XML,代碼 界面 分離)
http://www.gardenui.com/
CJLib(開源,免費,UNICODE編碼,是xtreme toolkit的前生,但xtreme toolkit收費了)
http://www.codejock.com/
LibUIDK(部分免費,不開源,效果好,適合貼圖)
http://www.iuishop.com/download.htm
BCGControlBar(收費,界面感覺和Office類似)
http://www.bcgsoft.com
SKin++(收費,界面很好看,從它的截圖上可以看出)
http://www.uipower.com/
SkinMagic(收費,看起來像Office)
http://appspeed.com/html/download.html
ActiveSkin(未知)
http://www.softshape.com/software/develop/
SYGUI(收費,類似Office)
http://www.sygui.com/
posted @
2007-03-21 10:42 喬棟 閱讀(4157) |
評論 (3) |
編輯 收藏
?
???? 一個View中用到了一個CListCtrl,在OnInitialUpdate函數里面他調用了m_listCtrl.ModifyStyleEx(0, LVS_EX_FULLROWSELECT);但是結果是并沒有改變View中這個ListCtrl的效果。
?
???? 仔細的查閱了MSDN的關于ModifyStyleEx的說明,發(fā)現沒什么可以的地方,調試幾遍發(fā)現也沒異常,最后在網上一搜索ModifyStyleEx,結果發(fā)現碰到這個問題的朋友還真不少,有一遍關于ModifyStyle和ModifyStyleEx無法改變樣式的解決方法的文章被轉載得到處都是,不僅感慨現在的互聯網信息重復程度~~結果看完文章很失望,他完全是重新Create了一個控件。
?
???? 最后經過努力,發(fā)現使用SetExtendStyle函數就可以實現改變Style的功能。
?
???? 有一點是可以肯定地,如果你重構一個控件繼承自CListCtrl,那么你可以在該控件的OnCreate中使用ModifyStyle或者ModifyStyleEx,這都是可以達到目的的,但是如果控件的一個實例是另一個窗口的成員變量,那么你在這個窗口的初始化函數中調用該控件的ModifyStyle或者ModifyStyleEx是不能達到目的的,有些關聯的一個說明是SetWindowLong會因為控件和調用者不在同一進程而失敗(ModifyStyle和ModifyStyleEx函數中有調用SetWindowLong).
posted @
2007-03-19 18:30 喬棟 閱讀(4071) |
評論 (1) |
編輯 收藏
數據庫安裝后的root的用戶只是對本機具有全部的權限,但是不具備客戶機的連接
當無法遠程連接的時候,建議新建一個用戶,并確具有全部權限,問題一般可以得到解決.
posted @
2007-03-16 11:59 喬棟 閱讀(588) |
評論 (0) |
編輯 收藏
動態(tài)鏈接庫的連接方式: 顯式鏈接,隱式鏈接
在命令行下運行當前目錄下(如C:\Documents and Settings\Tony\桌面\dll1\Debug),運行命令dumpbin,如果不能運行,說明環(huán)境找到損壞,利用vcvars32.bat(VC87 / VC7 目錄下Bin 文件夾直接拖入然后運行). 運行dumpbin -exports dll1.dll可以看到DLL中到處函數名.
Code:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
dll1.cpp:
_declspec(dllexport) int add(int a, int b )
{
???????return a+b;
}
_declspec(dllexport)int subtract(int a, int b)
{
???????return a-b;
}
_declspec(dllexport)表示為導出函數,可供應用程序調用。"extern C"表示,可以使用其他編程語言訪問dll中的函數.
編譯后可以得到DLL1.DLL文件.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
dlltest.dlg
extern int add(int x,int y);
extern int subtract(int x,int y);
//_declspec(dllimport) int add(int a, int b )
//_declspec(dllimport)int subtract(int a, int b)?? //這樣的方法告訴編譯器這些函數是從一個dll中調用的函數.編譯器就能調用相應的lib文件,提高運行效率
extern可以置于變量或者函數前,以標示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其他模塊中尋找其定義
?CString str;
?str.Format("3+5=%d",add(3,5));
?MessageBox(str);
編譯器工程屬性LINK-->input-->additional dependencies 添加相應的lib文件,LINK-->input-->Module defintion file添加def文件.
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
如何顯式的加載一個動態(tài)鏈接庫
動態(tài)加載不需要lib文件,只需要dll文件即可
HINSTANCE與HMODULE可以通用
HInstance hinst;
hinst = Loadlibrary("dll2.dll");???????? //顯式加載
typedef int (*ADDPROC)(int a , int b);??????????? //定義一個函數指針
ADDPROC Add = (ADDPROC)getprocAdress(hinst, "add");??? //獲得函數指針
if(!add)
{
???messagebox("fail");
}
else
{
????CString str;
????str.Format("3+5=%d",add(3,5));
????MessageBox(str);
}
posted @
2007-03-15 15:11 喬棟 閱讀(426) |
評論 (0) |
編輯 收藏
在mysql下經常會遇到漢字的顯示問題,解決方案如下:
1: 設定全部的數據庫格式為utf-8,包括字段的字符集格式.
2: 正常讀寫即可.
3: 注意mysql-front對于字符集的支持有些問題,很多時候可以正常寫入讀出,但是在mysql-front
卻顯示亂碼.命令行格式下顯示正常.
connect string: Driver={mySQL ODBC 3.51 Driver};Server=localhost;"
??????????????????????????"Port=3306;Option=4;Database=mysql;Uid=root;Pwd=;
posted @
2007-03-14 10:32 喬棟 閱讀(437) |
評論 (0) |
編輯 收藏
main()
{
? ?? ???int a,b;
? ?? ???int i;
? ?? ???a=b=1;
? ?? ???for(i=1;i<100;i++)
? ?? ???{
? ?? ?? ?? ?? ? printf("%4d%4d",a,b);
? ?? ?? ?? ?? ? a+=b;
? ?? ?? ?? ?? ? b+=a;
? ?? ???}
? ?? ???printf("\n");
}
posted @
2007-03-11 23:02 喬棟 閱讀(270) |
評論 (0) |
編輯 收藏
步驟如下:
1:在安裝好mysql 5.0
2:?? 安裝GUI管理工具,我用的的是mysql -front
3:???安裝好驅動,這里我使用的是mysql-connector-odbc-3.51.12-win32,這個可以在mysql官網下載到
4:連接字符串:"Driver={mySQL ODBC 3.51 Driver};Server=localhost;"
??"Port=3306;Option=4;Database=storage;Uid=sa;Pwd=;"
?????????IP地址為:localhost?;端口為:3306;選項默認為:4 ; 數據庫名:storage; 用戶名:sa; 密碼為空
另外在.net平臺下連接mysql 可以參照下面這篇文章:
http://www.microsoft.com/china/community/Columns/Luyan/6.mspx總體感覺mysql 是中小企業(yè)設計數據管理必須的系統(tǒng), 希望大家都能做好.
posted @
2007-03-07 16:29 喬棟 閱讀(674) |
評論 (0) |
編輯 收藏
Demonstrates ? how ? to ? use ? plain ? C ? to ? create ? a ? MySQL ? database, ? connect ? to ? it, ? create ? a ? table ? with ? fields, ? populate ? the ? table, ? execute ? an ? SQL ? query, ? and ? print ? the ? results. ? No ? MFC ? required ? - ? uses ? only ? plain ? C. ?
? ?
? #include ? <conio.h> ?
? #include ? <stdarg.h> ?
? #include ? <stdio.h> ?
? #include ? <stdlib.h> ?
? #include ? "winsock.h" ?
? #include ? "mysql.h" ?
? ?
? MYSQL ? ? ? ? ? *mysql ? = ? NULL; ?
? ?
? void ? MySQLError(void) ?
? { ?
? fprintf(stderr, ? "%s\n", ? mysql_error(mysql)); ?
? exit(1); ?
? } ?
? ?
? void ? ExecuteSQL(char ? *fmt, ? ...) ?
? { ?
? char ? SQL[1000] ? = ? {0}; ?
? int ? ? retval; ?
? va_list ? args; ?
? va_start(args, ? fmt); ?
? if ? (_vsnprintf(SQL, ? sizeof(SQL)-1, ? fmt, ? args) ? < ? 0) ?
? { ?
? fprintf(stderr, ? "SQL ? query ? truncated! ? Increase ? SQL ? buffer ? size ? in ? ExecuteSQL\n"); ?
? exit(1); ?
? } ?
? va_end(args); ?
? retval ? = ? mysql_query(mysql, ? SQL); ?
? if ? (retval) ?
? { ?
? fprintf(stderr, ? "Original ? SQL ? Statement: ? %s\n", ? SQL); ?
? fprintf(stderr, ? "%s\n", ? mysql_error(mysql)); ?
? exit(2); ?
? } ?
? } ?
? ?
? int ? main() ?
? { ?
? UINT ? ? ? ? ? ? ? ? ? i; ?
? UINT ? ? ? ? ? ? ? ? ? FieldCount; ?
? MYSQL_RES ? ? ? *res ? ? ? ? ? ? ? ? ? = ? NULL; ?
? MYSQL_ROW ? ? ? ? row ? ? ? ? ? ? ? ? ? = ? NULL; ?
? MYSQL_FIELD ? *field; ?
? ?
? char ? ? ? ? ? ? *DBName ? ? ? ? ? ? = ? "Test"; ?
? char ? ? ? ? ? ? *TableName ? ? ? = ? "People"; ?
? char ? ? ? ? ? ? *CreateDB ? ? ? ? = ? "CREATE ? DATABASE ? IF ? NOT ? EXISTS ? %s"; ?
? char ? ? ? ? ? ? *DropTable ? ? ? = ? "DROP ? TABLE ? IF ? EXISTS ? %s"; ?
? char ? ? ? ? ? ? *CreateTable ? = ? "CREATE ? TABLE ? IF ? NOT ? EXISTS ? %s ? (\n" ?
? ? "ID ? ? ? ? ? ? ? ? ? INT ? UNSIGNED ? AUTO_INCREMENT, ? \n" ?
? ? "FirstName ? ? VARCHAR(32), ? \n" ?
? ? "MiddleName ? VARCHAR(32), ? \n" ?
? ? "LastName ? ? ? VARCHAR(32), ? \n" ?
? ? "Address1 ? ? ? VARCHAR(50), ? \n" ?
? ? "Address2 ? ? ? VARCHAR(50), ? \n" ?
? ? "City ? ? ? ? ? ? ? VARCHAR(50), ? \n" ?
? ? "State ? ? ? ? ? ? VARCHAR(2), ? \n" ?
? ? "Zip ? ? ? ? ? ? ? ? VARCHAR(5), ? \n" ?
? ? "Email ? ? ? ? ? ? VARCHAR(50), ? \n" ?
? ? "Gender ? ? ? ? ? VARCHAR(1), ? \n" ?
? ? "WorkPhone ? ? VARCHAR(50), ? \n" ?
? ? "HomePhone ? ? VARCHAR(50), ? \n" ?
? ? "CellPhone ? ? VARCHAR(50), ? \n" ?
? ? "BirthDate ? ? DATE ? NULL, ? \n" ?
? ? "Primary ? Key ? (ID) ? \n" ?
? ? ")\n"; ?
? char ? ? ? ? ? ? *AddRecord ? ? ? = ? "INSERT ? INTO ? %s ? (FirstName, ? LastName) ? VALUES ? ('FirstName ? %03d', ? 'LastName ? %03d')"; ?
? char ? ? ? ? ? ? *GetRecords ? ? = ? "SELECT ? ID, ? FirstName, ? LastName ? FROM ? %s"; ?
? ?
? ?
? ?
? // ? Initialize ? MySQL ?
? mysql ? = ? mysql_init(NULL); ?
? ?
? // ? Connect ? to ? MySQL ?
? if ? (!(mysql_real_connect(mysql, ? "localhost", ? "admin", ? "", ? NULL, ? mysql->port, ? 0, ? 0))) ? ?
? MySQLError(); ?
? ?
? // ? Create ? database ?
? ExecuteSQL(CreateDB, ? DBName); ?
? ?
? // ? Connect ? to ? temporary ? database ?
? if ? (mysql_select_db(mysql, ? DBName)) ?
? MySQLError(); ?
? ?
? // ? Delete ? table ? if ? it ? already ? exists. ?
? ExecuteSQL(DropTable, ? TableName); ?
? ?
? // ? Create ? table ?
? ExecuteSQL(CreateTable, ? TableName); ?
? ?
? // ? Insert ? some ? data ? into ? the ? table. ?
? for ? (i ? = ? 0; ? i ? < ? 200; ? i++) ?
? ExecuteSQL(AddRecord, ? TableName, ? i, ? i); ?
? ?
? // ? Execute ? query ?
? ExecuteSQL(GetRecords, ? TableName); ?
? ?
? // ? Store ? the ? recordset ?
? if ? ((res ? = ? mysql_store_result(mysql)) ? == ? NULL) ?
? MySQLError(); ?
? ?
? // ? Print ? the ? recordset ?
? printf("Table ? %s\n", ? TableName); ?
? while((field ? = ? mysql_fetch_field(res)) ? != ? NULL) ?
? printf("%s\t", ? field->name); ?
? printf("\n"); ?
? FieldCount ? = ? mysql_num_fields(res); ?
? while((row ? = ? mysql_fetch_row(res)) ? != ? NULL) ? ?
? { ?
? for ? (i ? = ? 0; ? i ? < ? FieldCount; ? i++) ? ?
? printf("%s\t", ? row[i]); ?
? printf("\n"); ?
? } ?
? printf("\nTotal ? rows: ? %d\n", ? mysql_num_rows(res)); ?
? ?
? // ? Free ? the ? recordset ?
? mysql_free_result(res); ?
? ?
? // ? Close ? the ? connection ?
? mysql_close(mysql); ?
? ?
? printf("\nPrint ? any ? key ? to ? continue...\n"); ?
? getche(); ?
? } ?
? ?
? 如果有問題,請加入mysql++.lib????
在VC里的toos->option->directories中將include增加一個c:\mysql\include,將lib增加一個c:\mysql\lib,將libmysql.dll和libmysql.lib拷到當前目錄下,并且把libmysql.lib增加到工程中。
2,????? 建立與服務器的連接。
Include <mysql.h> //包含頭文件
MYSQL *conn;//定義一個MYSQL類型結構,這個幾乎在所有的后面的編程中都需要
MYSQL *mysql_init(MYSQL *conn);//如果conn=NULL,返回一個新分配的句柄結構返回,反之則重新初始化該結構,出現錯誤則返回NULL;
MYSQL *mysql_real_connect(MYSQL * connection,const char *server_host,const char *sql_urs_name,const char *sql_password,const char *db_name,unsigned int port_number,const char *unix_socket_name,unsigned int flags);//連接MYSQL服務器,里面的參數應該很清楚了,一般port_number和unix_socket_name的值為0和NULL。例如:
mysql_real_connect(conn_ptr,"localhost","sagely","secret","ra",0,NULL,0);
???? void mysql_close(MYSQL *connection);關閉一個連接。
3,????? 執(zhí)行SQL語句
mysql_select_db(MYSQL *connection,const char *db_name);選定某個數據庫。
???? int mysql_query(MYSQL *connection,const char *query)//他將執(zhí)行query語句,運行成功將返回0,例如mysql_query(conn_ptr, Create table cert_info(...),將創(chuàng)建一個名為cert_info的表,幾乎所有的SQL語句都能這么執(zhí)行。呵呵,是不是顯得很簡單,他就和命令行中輸入的SQL語句差不多。在使用上面函數的時候一般會使用
???? my_ulonglong mysql_affected_rows(MYSQL *connection),這個函數返回的是mysql_query對進行改動的行的數量。
4,????? 處理檢索到的數據
當我們可以執(zhí)行SQL語句以后,那么就很容易執(zhí)行增加刪除修改等操作,但是假若檢索出來的數據存儲在哪里呢?
???? MYSQL_RES *mysql_use_result(MYSQL *connection)這個函數得到一個連接對象返回一個結果集合指針,出錯時返回NULL。不過他只是返回一個集合對象初始化來接收數據,并沒有將任何檢索到的數據返回到結果集合中。
???? MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)這個函數獲得mysql_use_resul得到的結果結構體,并從中檢索單個行,并返回分配給行結構體的數據,沒有更多數據或出錯時,返回NULL。
???? Unsigned int mysql_field_count(MYSQL *connection)它得到一個連接對象并返回在集合中字段的數目。
于是有上面的基礎我們就可以理解下面這段了:(沒有錯誤處理)
mysql_init(&conn_ptr);
mysql_real_connect(conn_ptr,"localhost","sagely","secret","ra",0,NULL,0);
mysql_query(conn_ptr,"SELECT * form usr_info);
res_ptr=mysql_use_result(&conn_ptr);
sqlrow=mysql_fetch_row(res_ptr);
for(int i=0;i<mysql_field_count(&conn_ptr);i++){printf("%s ",sqlrow);}
???? MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result)它返回的是列的信息,比如列的名稱,列所在表名稱等等,有了這個就可以將列標題與數據想對應起來了。
posted @
2007-03-07 11:32 喬棟 閱讀(317) |
評論 (0) |
編輯 收藏
|
? |
本文主要包括二個部分,第一部分重點介紹在VC中,怎么樣采用sizeof來求結構的大小,以及容易出現的問題,并給出解決問題的方法,第二部分總結出VC中sizeof的主要用法。
1、 sizeof應用在結構上的情況
請看下面的結構:
struct MyStruct
{
double dda1;
char dda;
int type
};
對結構MyStruct采用sizeof會出現什么結果呢?sizeof(MyStruct)為多少呢?也許你會這樣求:
sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13
但是當在VC中測試上面結構的大小時,你會發(fā)現sizeof(MyStruct)為16。你知道為什么在VC中會得出這樣一個結果嗎?
其實,這是VC對變量存儲的一個特殊處理。為了提高CPU的存儲速度,VC對一些變量的起始地址做了“對齊”處理。在默認情況下,VC規(guī)定各成員變量存放的起始地址相對于結構的起始地址的偏移量必須為該變量的類型所占用的字節(jié)數的倍數。下面列出常用類型的對齊方式(vc6.0,32位系統(tǒng))。
類型 對齊方式(變量存放的起始地址相對于結構的起始地址的偏移量)
Char 偏移量必須為sizeof(char)即1的倍數
int 偏移量必須為sizeof(int)即4的倍數
float 偏移量必須為sizeof(float)即4的倍數
double 偏移量必須為sizeof(double)即8的倍數
Short 偏移量必須為sizeof(short)即2的倍數
各成員變量在存放的時候根據在結構中出現的順序依次申請空間,同時按照上面的對齊方式調整位置,空缺的字節(jié)VC會自動填充。同時VC為了確保結構的大小為結構的字節(jié)邊界數(即該結構中占用最大空間的類型所占用的字節(jié)數)的倍數,所以在為最后一個成員變量申請空間后,還會根據需要自動填充空缺的字節(jié)。
下面用前面的例子來說明VC到底怎么樣來存放結構的。
struct MyStruct
{
double dda1;
char dda;
int type
};
為上面的結構分配空間的時候,VC根據成員變量出現的順序和對齊方式,先為第一個成員dda1分配空間,其起始地址跟結構的起始地址相同(剛好偏移量0剛好為sizeof(double)的倍數),該成員變量占用sizeof(double)=8個字節(jié);接下來為第二個成員dda分配空間,這時下一個可以分配的地址對于結構的起始地址的偏移量為8,是sizeof(char)的倍數,所以把dda存放在偏移量為8的地方滿足對齊方式,該成員變量占用sizeof(char)=1個字節(jié);接下來為第三個成員type分配空間,這時下一個可以分配的地址對于結構的起始地址的偏移量為9,不是sizeof(int)=4的倍數,為了滿足對齊方式對偏移量的約束問題,VC自動填充3個字節(jié)(這三個字節(jié)沒有放什么東西),這時下一個可以分配的地址對于結構的起始地址的偏移量為12,剛好是sizeof(int)=4的倍數,所以把type存放在偏移量為12的地方,該成員變量占用sizeof(int)=4個字節(jié);這時整個結構的成員變量已經都分配了空間,總的占用的空間大小為:8+1+3+4=16,剛好為結構的字節(jié)邊界數(即結構中占用最大空間的類型所占用的字節(jié)數sizeof(double)=8)的倍數,所以沒有空缺的字節(jié)需要填充。所以整個結構的大小為:sizeof(MyStruct)=8+1+3+4=16,其中有3個字節(jié)是VC自動填充的,沒有放任何有意義的東西。
下面再舉個例子,交換一下上面的MyStruct的成員變量的位置,使它變成下面的情況:
struct MyStruct
{
char dda;
double dda1;
int type
};
這個結構占用的空間為多大呢?在VC6.0環(huán)境下,可以得到sizeof(MyStruc)為24。結合上面提到的分配空間的一些原則,分析下VC怎么樣為上面的結構分配空間的。(簡單說明)
struct MyStruct
{
char dda;//偏移量為0,滿足對齊方式,dda占用1個字節(jié);
double dda1;//下一個可用的地址的偏移量為1,不是sizeof(double)=8
//的倍數,需要補足7個字節(jié)才能使偏移量變?yōu)?(滿足對齊
//方式),因此VC自動填充7個字節(jié),dda1存放在偏移量為8
//的地址上,它占用8個字節(jié)。
int type;//下一個可用的地址的偏移量為16,是sizeof(int)=4的倍
//數,滿足int的對齊方式,所以不需要VC自動填充,type存
//放在偏移量為16的地址上,它占用4個字節(jié)。
};//所有成員變量都分配了空間,空間總的大小為1+7+8+4=20,不是結構
//的節(jié)邊界數(即結構中占用最大空間的類型所占用的字節(jié)數sizeof
//(double)=8)的倍數,所以需要填充4個字節(jié),以滿足結構的大小為
//sizeof(double)=8的倍數。
所以該結構總的大小為:sizeof(MyStruc)為1+7+8+4+4=24。其中總的有7+4=11個字節(jié)是VC自動填充的,沒有放任何有意義的東西。
VC對結構的存儲的特殊處理確實提高CPU存儲變量的速度,但是有時候也帶來了一些麻煩,我們也屏蔽掉變量默認的對齊方式,自己可以設定變量的對齊方式。
VC中提供了#pragma pack(n)來設定變量以n字節(jié)對齊方式。n字節(jié)對齊就是說變量存放的起始地址的偏移量有兩種情況:第一、如果n大于等于該變量所占用的字節(jié)數,那么偏移量必須滿足默認的對齊方式,第二、如果n小于該變量的類型所占用的字節(jié)數,那么偏移量為n的倍數,不用滿足默認的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大于所有成員變量類型所占用的字節(jié)數,那么結構的總大小必須為占用空間最大的變量占用的空間數的倍數;
否則必須為n的倍數。下面舉例說明其用法。
#pragma pack(push) //保存對齊狀態(tài)
#pragma pack(4)//設定為4字節(jié)對齊
struct test
{
char m1;
double m4;
int m3;
};
#pragma pack(pop)//恢復對齊狀態(tài)
以上結構的大小為16,下面分析其存儲情況,首先為m1分配空間,其偏移量為0,滿足我們自己設定的對齊方式(4字節(jié)對齊),m1占用1個字節(jié)。接著開始為m4分配空間,這時其偏移量為1,需要補足3個字節(jié),這樣使偏移量滿足為n=4的倍數(因為sizeof(double)大于n),m4占用8個字節(jié)。接著為m3分配空間,這時其偏移量為12,滿足為4的倍數,m3占用4個字節(jié)。這時已經為所有成員變量分配了空間,共分配了16個字節(jié),滿足為n的倍數。如果把上面的#pragma pack(4)改為#pragma pack(16),那么我們可以得到結構的大小為24。(請讀者自己分析)
2、 sizeof用法總結
在VC中,sizeof有著許多的用法,而且很容易引起一些錯誤。下面根據sizeof后面的參數對sizeof的用法做個總結。
A. 參數為數據類型或者為一般變量。例如sizeof(int),sizeof(long)等等。這種情況要注意的是不同系統(tǒng)系統(tǒng)或者不同編譯器得到的結果可能是不同的。例如int類型在16位系統(tǒng)中占2個字節(jié),在32位系統(tǒng)中占4個字節(jié)。
B. 參數為數組或指針。下面舉例說明.
int a[50]; //sizeof(a)=4*50=200; 求數組所占的空間大小
int *a=new int[50];// sizeof(a)=4; a為一個指針,sizeof(a)是求指針
//的大小,在32位系統(tǒng)中,當然是占4個字節(jié)。
C. 參數為結構或類。Sizeof應用在類和結構的處理情況是相同的。但有兩點需要注意,第一、結構或者類中的靜態(tài)成員不對結構或者類的大小產生影響,因為靜態(tài)變量的存儲位置與結構或者類的實例地址無關。
第二、沒有成員變量的結構或類的大小為1,因為必須保證結構或類的每一
個實例在內存中都有唯一的地址。
下面舉例說明,
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s為一個指針。
Class test1{ };//sizeof(test1)=1;
D. 參數為其他。下面舉例說明。
int func(char s[5]);
{
cout< //數的參數在傳遞的時候系統(tǒng)處理為一個指針,所
//以sizeof(s)實際上為求指針的大小。
return 1;
}
sizeof(func(“1234”))=4//因為func的返回類型為int,所以相當于
//求sizeof(int).
以上為sizeof的基本用法,在實際的使用中要注意分析VC的分配變量的分配策略,這樣的話可以避免一些錯誤。
|
|
posted @
2007-03-06 16:14 喬棟 閱讀(194) |
評論 (0) |
編輯 收藏
--
建表語句
CREATE
?
TABLE
?
[
MyTable
]
?(
????
[
MyId
]
?
[
varchar
]
?(
50
)?COLLATE?Chinese_PRC_CI_AS?
NULL
?,
????
[
MyName
]
?
[
varchar
]
?(
50
)?COLLATE?Chinese_PRC_CI_AS?
NULL
?
)?
ON
?
[
PRIMARY
]
GO
--
得到新的編號(不考慮補號)
create
?
function
?f_NextID(
@myDate
?
datetime
)
Returns
?
char
(
12
)
as
begin
?
????
Declare
?
@temp
?
char
(
6
)
?????
Declare
?
@ret
?
char
(
12
)
????
set
?
@temp
=
Substring
(
Convert
(
char
,
@myDate
),
9
,
2
)
+
Substring
(
Convert
(
char
,
@myDate
),
1
,
2
)
+
Substring
(
Convert
(
char
,
@myDate
),
4
,
2
)
????
if
(
@temp
?
in
?(
SELECT
?
distinct
?myid
=
left
(myid,
6
)?
FROM
?mytable?
WITH
(XLOCK,PAGLOCK)))
????????????
Select
?
@ret
=
@temp
+
right
(
1000001
+
Isnull
(
Max
(
Right
(MyID,
6
)),
0
),
6
)?
from
?Mytable?
with
(xlock,paglock)?
where
?
@temp
=
left
(MyID,
6
)
????
else
????????
Select
?
@ret
=
@temp
+
'
000001
'
?
from
?Mytable?
with
(xlock,paglock)
????
return
?
@ret
end
?
GO
drop
?
table
?MyTable
--
建表語句
CREATE
?
TABLE
?
[
MyTable
]
?(
????
[
MyId
]
?
[
varchar
]
?(
50
)?COLLATE?Chinese_PRC_CI_AS?
NULL
?,
????
[
MyName
]
?
[
varchar
]
?(
50
)?COLLATE?Chinese_PRC_CI_AS?
NULL
?
)?
ON
?
[
PRIMARY
]
GO
--
得到新的編號(融合了補號處理)
create
?
FUNCTION
?f_NextNewID(
@myDate
?
datetime
)
RETURNS
?
char
(
12
)
AS
BEGIN
????
Declare
?
@temp
?
char
(
6
)
?????
Declare
?
@ret
?
char
(
12
)
????
set
?
@temp
=
Substring
(
Convert
(
char
,
@myDate
),
9
,
2
)
+
Substring
(
Convert
(
char
,
@myDate
),
1
,
2
)
+
Substring
(
Convert
(
char
,
@myDate
),
4
,
2
)
????
DECLARE
?
@r
?
char
(
12
)
????
????
SELECT
?
@r
=
@temp
+
RIGHT
(
1000001
+
MIN
(MyId),
6
)
????
FROM
(
????????
SELECT
?MyId
=
RIGHT
(MyId,
6
)?
FROM
?MyTable?
WITH
(XLOCK,PAGLOCK)
????????
UNION
?
ALL
?
SELECT
?
0
????)a?
??
WHERE
?
NOT
?
EXISTS
(
????????
SELECT
?
*
?
FROM
?MyTable??
WITH
(XLOCK,PAGLOCK)
????????
WHERE
?MyId
=
@temp
+
RIGHT
(
1000001
+
a.myID,
6
))
????
RETURN
(
@r
)
END
GO
--
測試語句(可改變時間測試一下)
insert
?MyTable?
values
?(dbo.f_NextNewID(
GetDate
()),
'
one
'
)
insert
?MyTable?
values
?(dbo.f_NextNewID(
GetDate
()),
'
two
'
)
insert
?MyTable?
values
?(dbo.f_NextNewID(
GetDate
()),
'
three
'
)
insert
?MyTable?
values
?(dbo.f_NextNewID(
GetDate
()),
'
four
'
)
insert
?MyTable?
values
?(dbo.f_NextNewID(
GetDate
()),
'
five
'
)
insert
?MyTable?
values
?(dbo.f_NextNewID(
GetDate
()),
'
six
'
)
Select
?
*
?
from
?MyTable?
order
?
by
?MyId
GO
delete
?MyTable?
where
?myId
=
'
060629000002
'
delete
?MyTable?
where
?myId
=
'
060629000005
'
Select
?
*
?
from
?MyTable?
order
?
by
?MyId
Go
insert
?MyTable?
values
?(dbo.f_NextNewID(
GetDate
()),
'
nexttwo
'
)
insert
?MyTable?
values
?(dbo.f_NextNewID(
GetDate
()),
'
nextfive
'
)
Select
?
*
?
from
?MyTable?
order
?
by
?MyId
GO
§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§
SQL下測試成功
posted @
2007-03-06 13:38 喬棟 閱讀(438) |
評論 (0) |
編輯 收藏