Time of Update: 2018-12-04
看C++的教材的時候,一直記得書上說inline只是一個提示,編譯器可能會拒絕將函數定義成內聯的。今天犯了思維定式的錯誤:函數或成員函數加上inline的時候,其實現部分一定要寫在標頭檔中,否則連結的時候將發生找不到引用的錯誤(GCC編譯器在編譯的時候還會給出警告)。 請看下面重犯這個錯誤的代碼:// MyClass.h#ifndef _MY_CLASS_H_#define _MY_CLASS_H_#include <stdio.h>class MyClass..
Time of Update: 2018-12-04
•Run-Time Library是編譯器提供的標準庫,提供一些基本的庫函數和系統調用。我們一般使用的Run-Time Library是C Run-Time Libraries。當然也有Standard C++ libraries。 CRun-Time Libraries實現ANSI C的標準庫。VC安裝目錄的CRT目錄有C Run-Time庫的大部分原始碼。 CRun-Time
Time of Update: 2018-12-04
上篇文章寫了:Java中構造方法的執行順序,這次是C++中建構函式的執行順序。經測試按照如下順序:一、先執行靜態成員的建構函式,如果靜態成員只是在類定義中聲明了,而沒有實現,是不用構造的。必須初始化後才執行其建構函式。二、任何抽象基類的建構函式按照它們被繼承的順序構造(不是初始化列表中的順序)三、任何虛擬基類的建構函式按照它們被繼承的順序構造(不是初始化列表中的順序)四、任何非虛擬基類的建構函式按照它們被繼承的順序構造(不是初始化列表中的順序)五、任何成員對象的建構函式按照它們聲明的順序構造六、
Time of Update: 2018-12-04
1 標頭檔預定義 # ifndef __MY_TYPE_H__ #define __MY_TYPE_H__ ...........//omit #endif 前兩行是用來防止標頭檔被多次引用時重複定義而報錯。預定義的那個字元是一個唯一的標誌,它的命名規則為:寫成兩個底線加檔案名稱(檔案名稱的“ . ”用一個底線替換)加兩個底線的格式。這種宏定義是經常要用到的來控制碼是否被編譯的方法。2 volatile和idata關鍵字 volatile uint8
Time of Update: 2018-12-04
(隔段時間不看就會在實際使用中忘記掉---c語言數組、異或指標的使用),轉載一下,忘時供查詢 C語言處理數組的方式是它廣受歡迎的原因之一。C語言對數組的處理是非常有效,其原因有以下三點: 第一,除少數翻譯器出于謹慎會作一些繁瑣的規定外,C語言的數組下標是在一個很低的層次上處理的。但這個優點也有一個反作用,即在程式運行時你無法知道一個數組到底有多大,或者一個數組下標是否有效。ANSI/ISOC標準沒有對使用越界下標的行為作出定義,因此,一個越界下標有可能導致這樣幾種後果: (1)
Time of Update: 2018-12-04
//十進位轉二進位 Console.WriteLine(Convert.ToString(69, 2)); //十進位轉八進位 Console.WriteLine(Convert.ToString(69, 8)); //十進位轉十六進位 Console.WriteLine(Convert.ToString(69, 16)); //二進位轉十進位 Console.WriteLine(Convert.ToInt32(”100111101″, 2)); //八進位轉十進位
Time of Update: 2018-12-04
最近嘗試了一下Oracle9i 中 PRO*C的串連池功能,結過越搞越糊塗:1、首先,在proc的編譯參數中加上以下選項: threads=yes 使用多線程 cpool=yes 使用串連池 cmax=6 最多6個串連 cmin=4 最少4個串連 cincr=1 每次增加一個串連 ctimeout=2
Time of Update: 2018-12-04
上文提到從v$Session查看串連數,發現使用串連池後莫名增加了MIN個串連(MIN為串連池的最小串連數)。但是實際上,v$session中看見的串連數是邏輯串連數,並非ORACLE的物理串連。ORACLE的會話與串連甚至可以不相關,允許存在沒有物理串連的會話。 因此,僅僅從v$session視圖看串連數是不準確的,至於從什麼地方可以看見用戶端與ORACLE的確切串連數。目前還沒找到。PRO*C的串連池特性,也只有通過效能測試來確定其有效性了。
Time of Update: 2018-12-04
1 字串分割string url = "[url]http://asdfsfd[/url][*]asdf[*]asdfsdf[*]";string[] sss = GetString(url,"[*]");foreach(string str in sss){Response.Write(str.ToString() +" ");}private string[] GetString(string str,string cutStr){char[] cutChar =
Time of Update: 2018-12-04
測試發現,Pro*C中,不管ORACLE資料庫中的number欄位是多大,只要欄位的值大於綁定的變數所能夠容納的範圍,就會出現“ORA-01455: 轉換列溢出整數資料類型”。不過,Pro*C不支援long long(64位)類型的綁定。當number欄位的值大於2147483647或小於- 2147483648時,建議使用double類型來綁定,然後再將double類型轉換成long long類型。double temp;long long value;//…EXEC SQL SELECT
Time of Update: 2018-12-04
編碼中發現一個奇怪的編譯錯誤,花了很長時間才找到問題所在。下面把重現這個問題的最精簡的代碼貼出來:/**//*MyClass.h存在一個namespace和一個類*/#ifndef _MY_CLASS_H_#define _MY_CLASS_H_namespace MySpace...{class MyClass...{public: int Field;};}#endif 下面的一個檔案聲明一個全域的指標,因為僅僅指示聲明,所以盡量不包含其他檔案:/**//*global.
Time of Update: 2018-12-04
一)位元組序,顧名思義位元組的順序,再多說兩句就是大於一個位元組類型的資料在記憶體中的存放順序(一個位元組的資料當然就無需談順序的問題了)。其實大部分人在實際的開發中都很少會直接和位元組序打交道。唯有在跨平台以及網路程式中位元組序才是一個應該被考慮的問題。在所有的介紹位元組序的文章中都會提到位元組序分為兩類:Big-Endian和Little-Endian,引用標準的Big-Endian和Little-Endian的定義如下:a) Little-Endian就是低位位元組排放在記憶體的低地址端,
Time of Update: 2018-12-04
最近在研究驅動的代碼,發現這樣一個宏,沒太搞懂什麼用途:#define E1000_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1))) 調用的時候是這樣的: unsigned int i = 4097; E1000_ROUNDUP(i, 4096); 拆解這個運算,還是沒明白到底要幹什麼:簡化的運算式相當於: i = (i + 0x00000fff) | 0xfffff000;
Time of Update: 2018-12-04
Pro*C中批量讀取遊標中的資料的時候,需要注意:最後一次批量讀取遊標中的資料的時候,資料被取到HostArray中,同時sqlca.sqlcode被置為1403(NO_DATA_FOUND)。如果在fetch後立即判斷sqlca.sqlcode的話,可能就導致最後一次的資料取不到。 保險的辦法是定義一個變數記錄上次的讀取條數:if (sqlca.sqlcode==1403 && sqlca.sqlerrd[2]<=nLastCount){
Time of Update: 2018-12-04
int i=atoi(m_strSendPeriod); //轉為整型SetTimer(1,m_strSendPeriod,NULL); ////////////////////////////////////////////////////////////////////// _itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow Convert an integer to a string. char *_itoa( int
Time of Update: 2018-12-04
最近因為忙!!經常外出工作!有時晚上趕不回公司,所以就在網上下了個自動關機程式!!不過自己一直想自己寫個!!但還不會調用API所以就想用C寫了個!!以後會用API寫的的!雖然沒技術含量,但必竟是自己寫的,還是比較開心的!!不過程式很簡單!!只是調用了系統的自動關機罷了!!代碼如下:#include <stdio.h>#include <stdlib.h>int main(){ system ("at 00:00 shutdown -s");
Time of Update: 2018-12-04
用來存放數組的地區是一塊在棧中靜態分配的記憶體(非static),而數組名是這塊記憶體的代表,它被定義為這塊記憶體的首地址。這 就說明了數組名是一個地址,而且,還是一個不可修改的常量,完整地說,就是一個地址常量。數組名跟枚舉常量類似,都屬於符號常量。數組名這個符號,就代表 了那塊記憶體的首地址。注意了!不是數組名這個符號的值是那塊記憶體的首地址,而是數組名這個符號本身就代表了首地址這個地址值,它就是這個地址,這就是數組
Time of Update: 2018-12-04
今天看到了一道c#筆試題,是關於靜態欄位和靜態建構函式初始化的。靜態函數是c#新的特性,如果不知道它的初始化順序就會對這道題暈頭轉向。對於靜態建構函式可以參考http://www.cnblogs.com/michaelxu/archive/2007/03/29/693401.html。下來從這道筆試題來分析一下靜態建構函式的初始化順序。 1 class A 2 { 3 public static int X; 4 static A() 5 { 6 X =
Time of Update: 2018-12-04
摘抄自more effective c++ 仔細想想地位卑賤的類型轉換功能(cast),其在程式設計中的地位就象goto語句一樣令人鄙視。但是它還不是無法令人忍受,因為當在某些緊要的關頭,類型轉換還是必需的,這時它是一個必需品。 不過C風格的類型轉換並不代表所有的類型轉換功能。 一來它們過於粗魯,能允許你在任何類型之間進行轉換。不過如果要進行更精確的類型轉換,這會是一個優點。在這些類型轉換中存在著巨大的不同,例如把一個指
Time of Update: 2018-12-04
C++的static有兩種用法:面向過程程式設計中的static和物件導向程式設計中的static。前者應用於普通變數和函數,不涉及類;後者主要說明static在類中的作用。 一、面向過程設計中的static 1、靜態全域變數在全域變數前,加上關鍵字static,該變數就被定義成為一個靜態全域變數。靜態全域變數有以下特點: 該變數在全域資料區分配記憶體; 未經初始化的靜態全域變數會被程式自動初始化為0(自動變數的值是隨機的,除非它被顯式初始化);