保存程式設計與電腦資訊之倉庫,程式部分請先俱備 VB6/VB2005/C/C++ 閱讀能力,只負責提供相關技術性之章文。本單位嚴禁注音文、火星文、灌水,以及各式商品販售廣告。我只是一個業餘程式設計的玩家,應用電腦程式來解決實際問題,請多指教。舉手之勞做環保,資料搜尋快又好。
保存程式設計與電腦資訊之倉庫,程式部分請先俱備 VB6/VB2005/C/C++ 閱讀能力,只負責提供相關技術性之章文。本單位嚴禁注音文、火星文、灌水,以及各式商品販售廣告。我只是一個業餘程式設計的玩家,應用電腦程式來解決實際問題,請多指教。舉手之勞做環保,資料搜尋快又好。
鑑於編譯器版本之不同,新舊版本對於程式語法的要求也不會一致,本篇刊載內容是大部分使用者會遇到的問題,在此一專欄裡逐步揭露。
| VB6 | VB2005 |
| 宣告 | |
| Integer | Short,Int16 |
| Long | Integer,Int32 |
| Currency | Long,Int64 |
| Type(不需 Dim 敘述) | Structure(需 Dim 敘述) |
| 函數 | |
| = String(1024, Chr(0)) | = New String(Chr(0), 1024) |
| DoEvents | My.Application.DoEvents() |
| App.Path | My.Application.Info.DirectoryPath |
| 物件(通用) | |
| .Caption | .Text |
| .hWnd | .Handle |
| .SetFocus | .Focus() |
| .ZOrder 0 .ZOrder 1 |
.BringToFront() .SendToBack() |
| Combo, ListBox 物件 | |
| .AddItem 資料 | .Items.Add(資料) |
| .Clear | .Items.Clear() |
| .ListCount | .Items.Count |
| .List(索引) | .Items.item(索引) |
| .ListIndex | .SelectedItems.item(0) |
| .Selected(索引) = True 註:True 表示被選取,反之為否 |
.SelectedItems.item(索引) 註:所有被選取的項目全都在此集合裡 |
| .RemoveItem 索引 | .Items.RemoveAt(索引) |
| TextBox 物件 | |
| .Locked | .ReadOnly |
| .SelLength | .SelectionLength |
| .SelText | .SelectedText |
| .SelStart | .SelectionStart |
簡易自製工具:VB6/VB.Net/VB2005 變數宣告轉換器
最後修訂:2009/01/08-0915
我一向討厭取名字,自然連取什麼為部落格的名字亦是。
這裡,我打算用來存放一些我個人認為非常不錯的程式碼或心得技巧,所使用的電腦語言為 Visual Basic 6.0 (VB6) 、 Visual Basic 2005 (VB8) 與 Dev-C++ 。當然,要看懂我這裡保存的程式,請先自行俱備相關基礎,恕不做基礎式的新手教學,這裡並不屬於新手或入門者的園地,免得文章讀起來像啃天書一般難懂,嫌文章有寫跟沒寫一樣。
好的程式技巧全都來自於最基礎的指令運用,程式設計其實就是利用電腦指令來處理數位資訊的運用,細節不是三言兩語即可說明,請務必先累積足夠的撰寫經驗。
不需要成立的祝福,只希望小小的經驗可以大大的應用。
我個人喜歡保持固定每天刊登一些資訊,似乎有點把部落格搞成報紙一樣,要是哪天沒有貼新東西上來,那肯定是我放假了,恕不繳交請假單喔。另外會不定時針對舊文加以修詞,這部份是不會有任何更新通知的,挖到寶時請好好享用。
由於計劃存放許多個人認為極為不錯的電腦相關資訊,命名為「倉庫」不為過吧,話又說回來,恐怕整理倉庫時才會是我這個管理員高頻的嫌懶狀況,呵呵,貼文容易管文難,請饒過我吧。
於 2008/04/18 決定新增的「股市小散戶」分類。
聲明:
凡注音文、火星文、各式電子廣告與純灌水無意義性質的留言或回應,殺無赦;請別在事後追問那些東西到哪裡去了,盡管向雅虎部落格官方洽詢即可。
讓我感到厭惡的東西,我都是向官方檢舉來解決困擾。
這裡只收知識或經驗,謝謝合作。
鳴謝:
bauann 、 JOJO 、 Kevin 、 Ku3 、 MicoAg 、 小琳、志堅、阿虹、啟民(豬頭小瓜瓜)、璉璉,等網友批評與指教。(依照英中文筆劃次序)
旁邊的部落格廣告可以為部落格作者增加收入,有興趣者可以點這裡申請刊登。
最後修訂:2008/05/01-1035
「是男人都會犯的錯」這句話令我難以認同,就好像「不會犯錯的人不算是男人」,抑或是「是男人最少也應該犯一次錯」的意思。
有點不合乎公平正義對吧。是男人,就會很小心的不去犯錯,不去受到誘惑才對,我想這是最基本的做人態度,而不是允許犯錯後才來道歉什麼的,那還需要道德倫理嗎?自己禁不起誘惑就算了,別一竿子打翻一船人,我想沒有多少男性都會承認「自己不是男人」對吧?
以上純個人心得,不以任何案例為評論基礎,不需要嘴炮,我努力當個知禮守法不會犯錯的人而已。
本篇教學只做概念上的介紹,如何使用較有效率的辦法來達成比對兩個較為龐大的資料,功能未必侷限於檔案,包含陣列或記憶體資料都行,本篇選擇使用檔案為範例來做講解。
講到比對資料,初學者通常會使用迴圈直接一個 Byte 一個 Byte 比較的方式來搜尋,能懂得這麼做已經學會這個最基礎的處理演算,實際上也並沒有什麼不妥,只是實作之後很容易發現:資料少倒還好,一但超過 1MB ,效能就會開始慢到令人吐血,再加上磁碟讀取,那更是容易產生砸電腦的衝動。
同樣都是程式,為什麼網路上的軟體就是比自己寫的效能好?難不成別人使用的語言特別好用?還是有什麼不可告人之祕技?咱們來仔細的研究一下,憑什麼 VB 就辦不到?
不是辦不到,道理也很簡單,說穿了也沒什麼祕訣或大不了,直接把它搞成批次作業 (Batch) 來處理就行了。
善用批次作業可以有效的降低耗時動作,尤其是磁碟的檔案操作,每次磁頭讀/寫都是以磁區為單位來操作;意思是說:只要不超過這個大小,磁碟都會這麼一次完成,既然如此,咱們又何必費事的在同一磁區上重複操作小單位的 Byte 呢?
這就是批次作業的重點,而以下的範例,也是以磁區為單位來操作檔案,只是讀取量嫌小了些,沒關係,乘上倍數就好,視每個人的需要來做增減,過小容易耗時,過大容易佔用記憶體空間,增加作業系統記憶體管理的耗時。
以目前的磁碟格式來說,分為 FAT16 (可能已經遭淘汰難以遇到)、 FAT32 與 NTFS ,都是以磁簇為單位在操作,若能以這個單位的倍數來操作自然更好,詳情請自行查閱技術手冊,恕不贅言。
Const 讀取量 = 2 ^ 0 * 512 * 1024 ' 以磁區為單位的自定倍數, 2^0 用來宣告為 Long 型態
Dim FileName(1) As String ' 處理的檔名
Private Sub Command1_Click()
Dim i As Long, j As Long, k As Long
Dim 整數 As Long, 餘數 As Long
Dim b1() As Byte, b2() As Byte ' 讀取緩衝區
Dim s1 As String, s2 As String ' 比對緩衝區
Dim FileNum1 As Integer, FileNum2 As Integer ' 檔案代號
If FileName(0) = FileName(1) Then
MsgBox FileName(0) & vbCrLf & FileName(1) & vbCrLf & vbCrLf & "同一個檔案, 不需要比較"
Exit Sub
End If
i = FileLen(FileName(0)) ' 保存檔案長度暫存用, 不用重新再取
If i <> FileLen(FileName(1)) Then
MsgBox FileName(0) & vbCrLf & FileName(1) & vbCrLf & vbCrLf & "檔案大小不一致"
Exit Sub
End If
餘數 = GetMod(i, 讀取量) ' 計算處理次數
整數 = (i - 餘數) / 讀取量
FileNum1 = FreeFile
Open FileName(0) For Binary As #FileNum1
FileNum2 = FreeFile
Open FileName(1) For Binary As #FileNum2
k = 0
If 整數 > 0 Then
ReDim b1(讀取量)
ReDim b2(讀取量)
For k = 1 To 整數
Get #FileNum1, , b1 ' 讀取資料
Get #FileNum2, , b2
s1 = b1 ' 強制轉換成字串
s2 = b2
If s1 <> s2 Then ' 以「讀取量」直接判斷
MsgBox "檔案內容不一致,於" & vbCrLf & vbCrLf & k * 讀取量
GoTo 結束
End If
Next
End If
ReDim b1(餘數) ' 處理未滿「讀取量」單位的剩餘部分
ReDim b2(餘數)
Get #FileNum1, , b1
Get #FileNum2, , b2
s1 = b1
s2 = b2
If s1 <> s2 Then
MsgBox "檔案內容不一致,於" & vbCrLf & vbCrLf & k * 讀取量
Else
MsgBox "很棒,檔案內容完全相同"
End If
結束:
Close #FileNum2
Close #FileNum1
End Sub
Private Sub Form_Load()
FileName(0) = "...." ' 請自備檔案
FileName(1) = "...."
End Sub
Function GetMod(被除數 As Long, 除數 As Long) As Long
' Mod 之強化函數, 支援 Long 型態, 但效能較差
Dim 計算值 As Long
計算值 = 被除數
Do While 計算值 >= 除數
計算值 = 計算值 - 除數
Loop
GetMod = 計算值
End Function
在 VB 內建的數學函數中,正巧沒有提供這樣子的函數可用,舉個例子來說,運輸貨物或商品過程中,沒有滿一個集裝箱(貨櫃,TEU)單位的貨物,也是得使用一台貨車來運輸,而不是化整為零讓貨物變不見,憑空送到客戶手上。
例子是題外話,如何使用才是重點。
y = -Int(-x)
這是從網路抄來的技巧,如 VBA 請愛用 ROUNDUP 函數。
如果是一般的除法計算,可以這麼做:
Debug.Print RoundUp(100, 12)
至於指定位數無條件進位,本法不適用。
很奇怪,莫名奇妙的得罪人很容易,理由就出在:「說者無心,聽者有意」的行為上。
不知為什麼,禮貌詞都會被人下意識的忽略掉,被人以為說壞話,回話反應太快未必是好事。
小心,禍從口出就是這麼一回事兒。
最後修訂:2009/05/04-1000
這個知識比較冷門一點,在研究遞迴的效能之前,先來關心一下什麼是「遞迴」。
遞迴是函式呼叫的應用,呼叫的不是別的函式,正是自己。
為什麼效率不好,最主要的原因是它的執行流程細節上的問題,一般設計師喜歡用較簡單的方式來寫,而不是用「較具效能」的方式來寫,故把一堆動作丟給編譯器來解決,只管結果正確無誤就了事。這麼做不是不好,得視使用需求來決定,在微處理器時脈高達 2GHz 的環境下大可以忽略不計。
在程式語言中,只要呼叫函式或副程式,就一定會做資料推入堆疊的動作,這個動作包含保存暫存器的值之外,還得視呼叫所使用的參數數量加以調整,大部分的程式語言都嘛是透過多推入一點資料給堆疊後所佔用的空間來做參數的傳遞暫存位置,如果使用傳值的話,那麼會花更多時間去配置需要用到的暫存空間,這麼一來一去,自然耗時多,無法跟單純的迴圈相比。
呼叫完還得釋放空間,堆疊這東西不是只管資料推進去就好,推過頭會溢位的。
再請參閱傳址與傳值的說明。
再來耗時的另一部分,函式或副程式裡面或多或少都會有私用的變數,在呼叫後,編譯器都嘛要想辦法把需要用到的空間給「生出」來,結束呼叫後還得「回收」掉,多做了這兩個細節動作,不耗時才怪。
這個只是使用一次函式或副程式就需要消耗這麼多資源,若是多來幾次數層遞迴時,不就會更慢?那自然是肯定的。
請參閱圖例:
上圖中,左邊是正常的程式流程,中間來個呼叫,藍色的部分是使用者撰寫的程式碼,橘黃色則是編譯器增加的程式碼,也正是這個多出來的細節增加了執行上的負擔。
這個問題其實就是硬體與編譯器的運作原理,對初學者來說挺硬的,比較難消化吸收。簡而言之,呼叫函式唯一的好處是節省程式體積,執行函式的前與後都做了不少額外程式設計師管不太到的動作。另一個相關的名詞為「巨集」,這個在組合語言上非常常見,具有效能快的優點,但是展開來就很佔體積了,暫不贅述。
至於使不使用遞迴還得看使用場合,不能因為它效能比較不好就棄之不用,不用遞迴來寫或許會增加開發上的困難,這個就比較具有挑戰性,請多多加油。
本篇不是只有針對 VB 系列的語言適用,幾乎所有的程式語言都有遞迴效能較差的狀況,其原理都照本篇所述,算是各編譯器廠商愛用的技術標準吧。不論何種高階語言都得編譯成機器語言後才可以給微處理器執行,中間處理的部分就是組合語言了,組合語言的運作就是整個軟硬體實際狀況,有興趣者可以想辦法讓程式語言的開發環境製作出 *.lst 檔來研究,進而從組合語言中了解高階語言在實際運作上的處理。
VB 程式設計工廠我的新網站 - CLONIN資訊網 已正式開站 ( http://clonin.phpnet.us/ ),歡迎大家多多指教~目前已經將資料慢慢轉移到新網站上~~ |
謝小茹的喃喃自語~我超愛老闆的~冏rz如果你也一樣是個頑強苦情上班族,具有特異於常人的【帶賽】體質,歡迎一起來碎碎唸吧! |
Fightmon 戰鬥毛
|
女科技新鬼的家科技與我們的生活息息相關!想要走在時代潮流尖端,就加入我們吧!哇哈哈哈‧‧‧註:此部落格有不負責任的科幻成份。 ﹝薰依吵幫之事件已經落幕!與本部落格文章無關之回應或留言一律不予回覆,歡迎訂閱之格友隨意哈拉,謝謝!﹞ |