線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1269
推到 Plurk!
推到 Facebook!

模組化問題

答題得分者是:derrenbol1
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-10-13 10:44:06 IP:59.104.xxx.xxx 未訂閱
將一個程式模組化    把部分資料 & 函式在宣告標頭檔中    下面是書中程式碼是三個檔案    
    /* 程式範例: Ch1-4.h */
#define MAXCMP  1
#define MINCMP  0
/* 外部變數宣告 */ 
extern int var1;
extern int var2;
/* 顯示整數變數的比較結果 */
extern void cmpresult(int);        /* 程式範例: Ch1-4.c */ 
#include 
#include 
#include "Ch1-4.h"
/* 函數原型宣告 */
static void maxvalue(void);
static void minvalue(void);
int var1, var2;
static int result;
/* 函數: 最大值 */
static void maxvalue() {
   if ( var1 > var2 ) result = var1;
   else               result = var2;
}
/* 函數: 最小值 */
static void minvalue() {
   if ( var1 < var2 ) result = var1;
   else               result = var2;
}
/* 函數: 顯示整數變數的比較結果 */
void cmpresult(int type) {
   printf("變數1: %d\n", var1);
   printf("變數2: %d\n", var2);
   if ( type == MAXCMP ) {
       maxvalue();
       printf("最大值: %d\n", result);
   } else {
       minvalue();
       printf("最小值 : %d\n", result);
   }
}    /* 程式範例: Ch1-4m.c */ 
#include 
#include 
#include "Ch1-4.h"
/* 主程式 */
int main() {
   var1 = 45;              /* 指定變數 */
   var2 = 100;
   cmpresult(MINCMP);
   cmpresult(MAXCMP);
   system("PAUSE");
   return 0; 
}    
1.程式進入點不是從main()開始為何不是把int var1, var2; 宣告在Ch1-4m.c 檔中 而是宣告在 ch1-4.c?? 2.程式中並沒有在ch1-4m.c 宣告 int var1, var2; 而又可以在ch1-4.c中宣告的 ,為什麼可以直接把值指定給兩個變數?? var1 = 45; /* 指定變數 */ var2 = 100; 把ch1-4.c中的int var1 , var2拿掉改成下面直接在ch1-4m.c宣告後直接給初始值這樣為什麼不可以??
/* 主程式 */
int main() {
   int var1 = 45;
   int var2 = 100;
   cmpresult(MINCMP);
   cmpresult(MAXCMP);
   system("PAUSE");
   return 0; 
}    
3.讓我感覺是先從ch1-4.c 執行後在執行 ch1-4m.c 這程式執行順序怎 麼跑的?? 4.還有在ch1-4.c 特別使用static來宣告變數??用一般變數不可以嗎?? static 變數只能在該檔案使用~~檔案只有ch1-4.c 算是一個檔案, 還是整個ch1-4.c & ch1-4m.c & Ch1-4.h 算是一個檔案?? 謝謝 發表人 - syao 於 2005/10/13 11:16:49 發表人 - syao 於 2005/10/13 11:19:10 發表人 - syao 於 2005/10/13 11:27:31
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-10-13 15:57:31 IP:210.202.xxx.xxx 未訂閱
To syao:    1. 將var1及var2宣告在Ch1-4.c就是要告訴讀者, 全域變數    在跨模組是可以使用的, 藉由Ch1-4.h中        
   extern int var1;
   extern int var2;
   
的宣告讓其他引入此Header檔的模組都能使用var1及var2. 2. 像你這樣寫的話:
   /* 主程式 */
   int main() {
     int var1 = 45;
     int var2 = 100;
     cmpresult(MINCMP);
     cmpresult(MAXCMP);
     system("PAUSE");
     return 0; 
   }
   
是在main中宣告兩個區域變數var1及var2, 所以你給的初值 是給區域變數, 並非設定到全域變數var1及var2;compresult 函數會將全域變數var1及var2的值印到螢幕上, 你可以看一下 是不是你設的初值. 3. C的程式都是從main開始的, 你可以在main函數中, 呼叫compresult 之前先printf一個訊息, 你就會知道誰先被執行. 4. Ch1-4.c, ch1-4m.c是兩個不同的檔案;像ch1-4.c中宣告了一個 全域變數result, 但它的前面多了個static, 所以你在ch1-4m.c 中的函數不得引用result, 你可以在main函數中也指定result初 值試試看, 鏈結時就會出現error.
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-10-15 09:19:35 IP:59.104.xxx.xxx 未訂閱
derrenbol1謝謝你    我還有兩個問題    1.我將Ch1-4.h中的extern void cmpresult(int);此行拿掉 只將void cmpresult(int);加到Ch1-4m.c ,Ch1-4.c不加 , 這樣編譯可以成功 但是換成只到Ch1-4.c 中 , Ch1-4m.c不加這樣編譯就無法通過 這是什麼原 因?? 2. 在Ch1-4.c & Ch1-4m.c 中分別引入兩個相同的標頭檔這樣不發生衝突嗎???不能只在其中一個檔案引入標頭檔後就可以讓其他檔案一起共用嗎??需要每個檔案都需要引入標頭檔嗎?? 還是標頭檔裡面都是做宣告而已所以不會發生衝突這是我的想法 .... 但在標頭檔中做宣告動作是要讓編譯器知道什麼訊息嗎??? 謝謝 發表人 - syao 於 2005/10/15 10:07:31 發表人 - syao 於 2005/10/15 10:08:30
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-15 15:42:57 IP:61.228.xxx.xxx 未訂閱
To syao:    1. 函數也可以是static的. 而且有些編譯器的預設就是    static. 所以你若不加extern void compresule(int);    的話, 這種編譯器會發出Error, 有些編譯器則頂多是    給個警告而已, 並不影響後續的編譯行為.    2. 當兩個文件檔(*.c)同時引入相同的標頭檔時, 一般的    巨集定義(#define)並不會造成編譯錯誤; 因為編譯器    同時間只會編譯一個文件檔, 所以當編譯器正在編譯    xxx.c時, 該標頭檔所定義的巨集或常數, 只有用在該    文件檔中; 在標頭檔中撰寫一些常用的巨集是節省設    計人員在開發上的時間, 因為你就不用在每個文件檔    中作相同的巨集定義, 只要引入該標頭檔即可. 但得    注意的是, 千萬不要在標頭檔內宣告變數, 因為未指    定static的變數, 在整個程式專案內, 該變數名稱要    是唯一, 否則編譯器會產生重複定義的錯誤.    請參考.
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-15 23:19:39 IP:59.104.xxx.xxx 未訂閱
derrenbol1謝謝 大概了解 發表人 - syao 於 2005/10/15 23:58:05
系統時間:2024-07-02 23:24:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!