2010-07-30 64 views
1

我不得不類,與這些方法的一個執行器:在一個結構在運行時處理的可變數量的參數

  1. 執行器()
  2. 結構執行(字符串s)
  3. 查找(字符串名稱,INT模塊,INT NUM,...)

和分析器:

  1. 分析器()
  2. 結構解析(字符串s)

的Exectuers Execute方法調用解析器解析方法。解析器然後將字符串卡入較小的位(它將在; -sign上爆炸字符串)並將結構返回給Execute方法。它用來調用查找方法的結構。 該解析返回的結構保持的一些標準信息:

  1. 的命令名
  2. 甲senderId(用戶名,MAC地址和密碼)
  3. 的參數個數可變

這就是我的問題。 Lookup方法需要可變參數,但是如何通過結構來處理這些可變參數的交接?我不是C和C++的專家。我應該把這兩個班級集中到一起嗎?所以Parser方法可以調用Execute方法,避免使用結構體。 或者也許有一種解析運行時參數的未知變量的方法?通過某種數組?

編輯 我不能使用C++的STL庫。我只使用C++類和虛擬功能。我寫一個編譯器,Im限制使用幾乎所有的C庫+ C++(虛擬和類)的魔法技能。 SOory不會馬上告訴你。

編輯2 將代碼寫入嵌入式系統,從而使用avr-gcc編譯我的代碼。這就是爲什麼我不能使用STL。 avr-gcc不支持這個。

+0

閱讀你怎麼打算使用這個變量的參數集? – Jacob 2010-07-30 09:34:06

+0

變量集的參數傳遞給Commands Execute方法。這種方法是純虛擬的,並且保存程序員定義的代碼。通過查找方法找到該命令(它通過一個列表並找到匹配模塊ID和傳遞給查找方法的命令名稱的命令)。然後由程序員決定執行Commands Execute方法來處理參數。 – mslot 2010-07-30 09:37:36

回答

1

使用std :: vector < >或一個可容納任意數量條目的simular容器。

struct { 
    std::string commandName; 
    sender_t senderId; 
    std::vector<arg_t> arguments; 
}; 

編輯:哦,你不能使用std :: vector。在這種情況下:使用一個數組並存儲長度:

struct { 
    const char* commandName; 
    sender_t senderId; 
    int argumentCount; 
    int maxArgumentCount; // you might not need this 
    arg_t* arguments; // pointer to array of (at least) argumentCount elements. 
}; 

使用malloc()或新的()以產生用於arguments陣列。

我會建議將argumentCount,maxArgumentCount和參數包裝在一個單獨的類中,它可以處理malloc/new和free/delete。這將使防止內存泄漏更容易。最後,你會寫出自己的vector_of_arg_t類,所以也許看看一些基本的矢量實現。網絡上必須有教程。

+0

哦。我很抱歉:(我標記了錯誤的方式,我使用了虛擬和類C++功能,我忘了寫我不能使用C++ STL庫,這是因爲編譯器的限制,我已經更新了我的問題 – mslot 2010-07-30 09:38:38

+0

@mslot呵呵?「他們」不希望你使用經過良好測試,優化的代碼,但更喜歡你重新發明輪子?奇怪... – Sjoerd 2010-07-30 09:43:33

+0

嵌入式系統。我使用avr-gcc編譯器,所以我不能使用整潔的C++功能 – mslot 2010-07-30 09:45:00

1

如下您可以宣佈你的Lookup方法:

void Lookup(string name, int module, int num, std::vector<std::string> &args); 

通過存儲在args數組變量參數,你可以有你想要的。

+0

由於我編輯過,我不能使用STL庫,我更新了我的問題灰。但也許我可以用一個標準的C類數組來做到這一點? – mslot 2010-07-30 09:44:09

+0

是的,你當然可以。假設你可以調用'malloc()',那就是。 – 2010-07-30 09:45:56

+0

Aaah Im允許這樣做!在我的Parse方法中,我調用malloc,返回結構中的指針並將指針或數組包含的內容分析到Lookup函數。 – mslot 2010-07-30 09:48:40

1

問:我如何寫一個函數,它採用可變數量的參數,並將它們傳遞給其他一些功能(它採用可變數量的參數)? A:一般來說,你不能。理想情況下,您應該提供接受va_list指針的其他函數的版本。

假設你想寫一個faterror函數,它將打印一個致命的錯誤消息,然後退出。你可能想將它寫在問題15.5的誤差函數方面:

void faterror(const char *fmt, ...) 
    { 
     error(fmt, what goes here?); 
     exit(EXIT_FAILURE); 
    } 

,但它並不明顯如何手工faterror的論點關閉錯誤。

<snip> 

http://c-faq.com/varargs/handoff.html

+0

+1鏈接!在此之前,我已經搜索了很多,但我沒有找到。謝謝。 – mslot 2010-07-30 09:56:13

+0

這很晦澀。我只記得它,因爲很久以前我被迫進入OP這樣的位置。編寫可變參數的C函數,甚至更麻煩的交換都很麻煩。 – bradgonesurfing 2010-07-30 10:01:11

相關問題