史萊姆論壇

返回   史萊姆論壇 > 專業主討論區 > 程式語言討論區
忘記密碼?
論壇說明

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


發文 回覆
 
主題工具 顯示模式
舊 2007-09-30, 10:21 PM   #1
mini
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時
註冊日期: 2002-12-07
文章: 13249
精華: 0
現金: 26241 金幣
資產: 3024051 金幣
預設 討論 - 動態組合的程式技巧

不知有無支援 動態組合 這種程式語言 或 語法範例

比如
一個程式有 A、B、C 等 副程式
傳統程式設計之 主程式 如下
語法:
For i = 0 to n
 If x.check = 1 then Call A
 If y.check = 1 then Call B
 If z.check = 1 then Call C
Next
在 A B C 無變動參數的情況下
動態組合之 主程式 如下
語法:
ret = GetSUBAddress(Z)
If x.check = 1 then Call SubAdd(ret, GetSUBAddress(A))
If y.check = 1 then Call SubAdd(ret, GetSUBAddress(B))
If z.check = 1 then Call SubAdd(ret, GetSUBAddress(C))

For i = 0 to n
 Call Z
Next
GetSUBAddress 負責得到 函式的位址

SubAdd 根據 函式的位址
負責將 A、B、C 串接成 Z

Z 是動態組合副程式

其作用是可省略每次的
If x.check = 1 then
If y.check = 1 then
If z.check = 1 then
當 n 是一筆很大的數值時,將可節省下相當的運算時間

當然前提是 Z 不能有多餘的判讀
否則就失去其意義


======================
用組合語言好像可以改寫的出來
不過...太麻煩了

自己可以想到的是
根據 A、B、C 大小 及
If x.check = 1 then
If y.check = 1 then
If z.check = 1 then
結果
宣告一個空白的記憶體
再將 A、B、C 稍做修改的內容 傾印入內
做成一個全新的 可執行副程式

只是中間好像不是這麼單純的樣子...
mini 目前離線  
送花文章: 1999, 收花文章: 7957 篇, 收花: 26749 次
回覆時引用此帖
向 mini 送花的會員:
joebin (2007-09-30)
感謝您發表一篇好文章
舊 2007-09-30, 10:57 PM   #2 (permalink)
註冊會員
 
joebin 的頭像
榮譽勳章

勳章總數
UID - 270712
在線等級: 級別:2 | 在線時長:16小時 | 升級還需:5小時級別:2 | 在線時長:16小時 | 升級還需:5小時
註冊日期: 2007-06-06
住址: 過去*現在*未來
文章: 42
精華: 0
現金: 58 金幣
資產: 118 金幣
預設

這程式碼應該不是C或C++的吧

有的話可給一下嘛.....不然我不能應用XD~感謝^^
joebin 目前離線  
送花文章: 15, 收花文章: 18 篇, 收花: 28 次
回覆時引用此帖
舊 2007-10-01, 10:32 AM   #3 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時
註冊日期: 2002-12-07
文章: 13249
精華: 0
現金: 26241 金幣
資產: 3024051 金幣
預設

引用:
作者: joebin 查看文章
這程式碼應該不是C或C++的吧

有的話可給一下嘛.....不然我不能應用XD~感謝^^
不是啦~
這個主題是問題與討論
個人也想知道有無可能與實作範例...

個人偏好用VB、PB寫
那個程式碼只是一種表達式,並非哪一種程式(教學或考試時 方便使用)
剛剛找到一個程式碼
好像稍作應用就可以完成
哪天寫出來再分享

當然也希望大家參與討論
mini 目前離線  
送花文章: 1999, 收花文章: 7957 篇, 收花: 26749 次
回覆時引用此帖
舊 2007-10-20, 09:34 AM   #4 (permalink)
管理版主
 
mini 的頭像
榮譽勳章
UID - 4144
在線等級: 級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時級別:96 | 在線時長:9665小時 | 升級還需:132小時
註冊日期: 2002-12-07
文章: 13249
精華: 0
現金: 26241 金幣
資產: 3024051 金幣
預設

找到一個折衷的寫法
(雖沒有達到理想境界,但可以接受)
c++ 可能需用到 函式指標 觀念
個人大部分是寫 VB

會用到的WinAPI
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

原理是
得到各函式記憶體位址
接著經過一次的判讀決定用哪一個函式
而迴圈統一固定使用 CallWindowProc

經過測試
的確有省略時間
用 OllyDbg 可發現
CallWindowProc 會 push 五個參數
而 If 有 60% 的可能性會被編譯器轉成
虛擬機器判讀語法
如此就會超過
CallWindowProc 總共 6條 組合語言指令

(聽不懂就當本人在自說自話吧~畢竟花了兩個星期研究,有點一言難盡)

至於實作
已在個人 新版 檔案清單列表機 使用到
而範例...
如有版友有興趣
方 打包貼出來分享

mini 目前離線  
送花文章: 1999, 收花文章: 7957 篇, 收花: 26749 次
回覆時引用此帖
發文 回覆



發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
系統 - 系統應用高階技巧錦集 psac 作業系統操作技術文件 5 2007-03-25 12:29 AM
教學 - Ghost 8.3 使用例子 和 參數指導 psac 應用軟體使用技術文件 7 2006-10-03 03:52 AM
Win98 怎麼灌 86258354 軟體應用問題討論區 7 2005-12-06 07:18 PM
反病毒引擎設計之既時監控篇 psac 應用軟體使用技術文件 0 2004-08-11 03:48 PM
Windows 2000/Xp 錯誤編號詳解(收集整理) psac 作業系統操作技術文件 9 2003-08-03 03:27 PM


所有時間均為台北時間。現在的時間是 03:54 PM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1