2010年8月8日
1 --打開日志文件
2 svnlogPath = assert(arg[3], "路徑為空");
3 svnlog = assert(io.open(svnlogPath, "r"), "打開日志文件失敗!");
4
5 --日志是否為空
6 if svnlog:read(0) == nil then
7 --日志為空
8 svnlog:close();
9 io.stderr:write("請填寫日志!");
10 os.exit(1);
11 else
12 --檢查日志內容
13 local count = 1;
14 while true do
15 local line = svnlog:read();
16
17 if line == nil then
18 break;
19 end
20
21 --查找是否匹配
22 if string.len(line) > 0 then
23 if not string.find(line, ".:%s*%S") then
24 if not string.find(line, ".\239\188\154%s*%S") then
25 svnlog:close();
26 io.stderr:write("日志沒有填寫完整");
27 os.exit(1);
28 end
29 end
30 end
31
32 count = count + 1;
33 end
34
35 --檢查行數是否>6行
36 if count < 6 then
37 svnlog:close();
38 io.stderr:write("請填寫完整日志! ");
39 os.exit(1);
40 end
41
42 end
43
44 svnlog:close();
45
2009年11月8日
我發現串口類cnComm在串口轉USB的設備上有些能工作(USB430),但在EZ430上卻不能工作,很奇怪!我懷疑是硬件問題,畢竟串口轉USB硬件上有差別。我發現cnComm的線程一直收到一些不存在的事件,導致死循環。
今天上網看了一篇資料,說是那個DCB配置了硬件握手協議導致了一些不支持這個功能的串口轉USB設備出錯。我覺得有點道理,有時間試驗一下。先看一下cnComm的DCB配置情況。
發現cnComm打開了發送和接收的流控制,fDtrControl=DTR_CONTROL_ENABLE,fRtrControl=RTR_CONTROL_ENABLE。有可能是這個原因。
2009年11月3日
最近發現CRT控制臺程序沒有TRACE和內存溢出檢查,很郁悶。無聊中翻看MSDN的Memory Management and the Debug Heap篇,發現C的Debug版本用_malloc_dbg代替malloc,而_malloc_dbg者給數據堆加上一個控制頭組成鏈表,方便記錄溢出。原話如下:
When you request a memory block, the debug heap manager allocates from the base
heap a
slightly larger block of memory than requested and returns a pointer to
your portion of that block. For example, suppose your application contains the
call:
malloc( 10 )
. In a release build,
malloc would call the base heap allocation routine
requesting an allocation of 10 bytes. In a debug build, however,
malloc
would call
_malloc_dbg, which would then call
the base heap allocation routine requesting an allocation of 10 bytes plus
approximately 36 bytes of additional memory. All the resulting memory blocks in
the debug heap are connected in a single linked list,
ordered according to when
they were allocated:
那個控制頭的數據結構如下:
typedef struct _CrtMemBlockHeader
{
// Pointer to the block allocated just before this one:
struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
struct _CrtMemBlockHeader *pBlockHeaderPrev;
char *szFileName; // File name
int nLine; // Line number
size_t nDataSize; // Size of user block
int nBlockUse; // Type of block
long lRequest; // Allocation number
// Buffer just before (lower than) the user's memory:
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
這個nBlockUse有6種內存塊,具體含義還沒有搞清楚,分別如下
/* Memory block identification */
#define _FREE_BLOCK 0
#define _NORMAL_BLOCK 1
#define _CRT_BLOCK 2
#define _IGNORE_BLOCK 3
#define _CLIENT_BLOCK 4
#define _MAX_BLOCKS 5
檢測內存溢出用_CrtDumpMemoryLeaks(),在
crtdbg.h中定義。有時間研究一下crtdbg.h文件。
參考
http://www.cnblogs.com/phinecos/archive/2009/10/29/1592604.html
2009年10月21日
從NIST網站上下了個時間軟件,看起來很古老,但功能強大。我在NIST網站上一直找不到網絡時間服務器,但在這個軟件中發現可以下載更新服務器地址,很好很強大。
下載
2009年10月20日
《window程序設計》果然是經典,相對于MFC來說SDK簡直是返璞歸真啊。繼續摘錄一些API函數和技巧:
CheckRadioButton(hwnd,IDC_SERVER1,IDC_SERVER10, wServer);
1、
Selects (adds a check mark to) a given radio button in a group and clears
(removes a check mark from) all other radio buttons in the group.
在IDC_SERVER1-IDC_SERVER10中選中wServer的ID,有點像分組。
DialogBoxParam (hInst, TEXT ("Servers"), hwnd, ServerDlg, (LPARAM) szIPAddr);
2、可以在WM_INITDIALOG的LPARAM傳參數,建立模態對話框。ServerDlg為消息處理函數,szIPAddr為參數,在WM_INITDIALOG消息響應中處理LPARAM的值。
typedef char * va_list;
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )
3、va_list可變參數的結構,有點復雜慢慢看。
一般的用法是這樣(個人理解)
va_list args; //聲明變量
va_start(args, fmt); //開始解析。args指向fmt后面的參數
TYPE var = va_arg(args, TYPE); //取下一個參數并返回。args指向下一個參數
va_end(args); //結束解析
http://hi.baidu.com/kang_liang/blog/item/168c9059a9a1ca2d2934f05f.html 4、wsprintf和wvsprintf的區別,從它們的參數可以看出。
wsprintf純粹是格式化字符串,wvsprintf是以參數列表Va_list格式化字符串。
2009年10月19日
最近看Petzold的《windows程序設計》,在Internet那章中看到如何在字符串中提取IP地址,特地標記一下:
1 GetDlgItemTextA (hwnd, wServer, szLabel, sizeof (szLabel));
2 strtok (szLabel, "(");
3 strcpy (szServer, strtok (NULL, ")"));
在Msdn上查了一下,有下面一段:
On the first call to strtok , the function skips leading delimiters and
returns a pointer to the first token in strToken , terminating the token
with a null character. More tokens can be broken out of the remainder of
strToken by a series of calls to strtok . Each call to
strtok modifies strToken by inserting a null character after the
token returned by that call. To read the next token from strToken , call
strtok with a NULL value for the strToken argument. The
NULL strToken argument causes strtok to search for the next
token in the modified strToken . The strDelimit argument can take
any value from one call to the next so that the set of delimiters may vary.
Warning Each of these functions uses a static
variable for parsing the string into tokens. If multiple or simultaneous calls
are made to the same function, a high potential for data corruption and
inaccurate results exists. Therefore, do not attempt to call the same function
simultaneously for different strings and be aware of calling one of these
function from within a loop where another routine may be called that uses the
same function. However, calling this function simultaneously from multiple
threads does not have undesirable effects.
看來用了靜態變量,還好有多線程的C運行庫,否則在多線程在有麻煩了。