全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:957
推到 Plurk!
推到 Facebook!

關於巨集define問題

尚未結案
cliffpen
一般會員


發表:35
回覆:18
積分:15
註冊:2005-05-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-01 10:57:47 IP:220.130.xxx.xxx 未訂閱
請問各位大大 假如我在巨集中做如下的define #define IOMOD *(unsigned int *)0x3ff5000 在程式中只要出現IOMOD就表示了*(unsigned int *)0x3ff5000這東西 那假如我在程式中又寫: IOMOD=0x03ffff; 是否表示我改變了 IOMOD 的定義? define 的東西應該不能改吧? 還是說這裡有一些別的觀念呢?
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-01 13:21:57 IP:59.115.xxx.xxx 未訂閱
cliffpen 您好:    巨集可用來簡化程序及資料,當您定義了一個巨集並在程式敘述中使用了它,那麼編譯器就會在編譯程式時將巨集展開,以 BCB Help 中的範例為例: #define HI "Have a nice day!" 當您在程式中使用了如下的敘述時: ShowMessage(HI); 編譯器會在編譯時,將前一行的敘述展開成為: ShowMessage("Have a nice day!"); 如果您另外定義了一個巨集如下: #define MYDEF AnsiString test; 而您在程式中設定了如下的敘述: MYDEF test = "aa"; ShowMessage(test); 編譯時將會展開如下: AnsiString test; test = "aa"; ShowMessage(test); 如果照您的例子來看: IOMOD=0x03ffff; 在編譯時將會展開成: *(unsigned int *)0x3ff5000=0x03ffff; 您認為編譯器會有什麼樣的反應呢? 7 天天敲鍵盤 v 時時按滑鼠 8
cliffpen
一般會員


發表:35
回覆:18
積分:15
註冊:2005-05-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-01 14:30:59 IP:220.130.xxx.xxx 未訂閱
RedSnow大大您好 所以說 *(unsigned int *)0x3ff5000=0x03ffff; 是不是就表示說 0x3ff5000 會指到 0x03ffff 這個位置呢?
yhchu
一般會員


發表:2
回覆:70
積分:24
註冊:2004-01-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-02 15:29:12 IP:220.130.xxx.xxx 未訂閱
Compile 時應該會錯誤吧?0x3ff5000 是數值常數,不能放到等號的左邊的。你可以實際試試看。
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-02 22:56:40 IP:61.230.xxx.xxx 未訂閱
0x3ff5000 好像是步進馬達 I/O Port 暫存器的位址,那行敘述應該是設定記憶體位置 0x3ff5000 的值,也就是設定 I/O Port 的輸出入模式吧?      7 天天敲鍵盤 v 時時按滑鼠 8
cliffpen
一般會員


發表:35
回覆:18
積分:15
註冊:2005-05-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-03 09:47:07 IP:220.130.xxx.xxx 未訂閱
感謝大大的精采解說 可是這個例子是從一本暫存器的書上看來的 書上所有的例子都是這樣定義 大概的程式如下:
#include
#include    #define IOMOD *(unsigned int *)0x3ff5000  // I/O port Mode
#define IOCON *(unsigned int *)0x3ff5004  // I/O port Control
#define IODATA *(unsigned int *)0x3ff5008  // I/O port Data    int main()
{
        int i,j;
        IOMOD = 0x03ffff; // p0~p17 output,1:Out 0:in
        IOCON = 0x00000;
            .....    }
實際上我找不到 unistd.h 所以我把它mark起來,然後就會編譯錯誤 有沒有可能 include 後,就能改變define的東西呢?
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-03 12:20:44 IP:59.115.xxx.xxx 未訂閱
cliffpen 您好:    我使用 BCB4 在編譯時是可以通過的,但是在執行時會產生錯誤,這應該是沒有安裝相關硬體所導致的吧?不過就算您編譯成功了,define 的資料還是不會改變的,就像我前面所寫的,define 的資料會在編譯時被展開,而展開的那個敘述只會設定 I/O Port 的輸出入模式而已,就像您前一篇程式碼中的註解 (p0~p17 output,1:Out 0:in) 一樣,它是設定 I/O Port 暫存器的 out 與 in 模式。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/08/03 12:27:05
系統時間:2024-05-18 5:46:30
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!