2012-05-31 237 views
0

我是一名嘗試在有限的Arduino環境中編碼C++的Java開發人員。由於內存限制,異常和動態對象不可用或必須避免。返回多個值

我的任務,創建一個方法來分析字符緩衝區(十六進制半字節)並返回一個布爾值來表示成功以及實際結果。我到目前爲止的嘗試(無關的東西避免):

class Parser { 
    unsigned char buffer[SIZE]; 
    unsigned char index; 

    void parse(); 
    bool parseHexNibble(unsigned char &result); 
}; 

void Parser::parse() { 
    unsigned char result = 0; 
    if (!parseHexNibble(result)) { 
    return; 
    } 

    // do some work with result 
} 

bool Parser::parseHexNibble(unsigned char &result) { 
    unsigned char chr = buffer[index]; 
    if (chr >= '0' && chr <= '9') { 
    result = chr - '0'; 
    } 
    else if (chr >= 'A' && chr <= 'F') { 
    result = chr - 'A' + 10; 
    } 
    else { 
    return false; 
    } 

    index++; 
    return true; 
} 

這項工作?我不確定何時使用*以及何時使用&。有更好的解決方案嗎?

+0

看看'std :: pair'或'boost :: optional'。他們對此都很好。 – chris

+0

請重新閱讀我的第一段。這是一個基本的C++環境。 – Mot

+0

對不起,我沒有太好的讀過O_o – chris

回答

2

有幾個方法:

你做的就是其中之一,但我建議使用一個指針,而不是引用(的*代替&)因爲引用的方式,函數調用看起來像你傳遞一個值(p.parseHexNibble(c) )而指針版本更清晰,您可能需要存儲其中的內容(p.parseHexNibble(&c))。

另一種選擇,(這個人是我個人最喜歡的)是一樣的東西,getc不會:返回一個int,要麼包含char值(0 <= i < 256),或者是-1發出錯誤信號。在沒有錯誤的情況下,int可以安全地進行類型轉換和/或存儲到char。 (這裏假定它實際上是你想要返回的char。)

第三種方法是返回一個包含布爾值和字符的結構體(通過自己製作或使用std::pair等)。

在不相關的筆記上,您應該使用char而不是unsigned char來存儲實際的字符值。 unsigned char只能用於任意的原始數據。

+0

感謝您清楚解釋'&'和'*'之間的區別。我同意你的看法:'parseHexNibble(&c)'看起來更清晰。我已經有了使用'int'而不是'bool'和'unsigned char'的想法,但是在這種情況下,進一步的處理會爲每個變量保留這個愚蠢的額外字節,從而使每個普通操作更長... – Mot

+0

@MikeL 。你指的是哪個額外的字節? – Matt

+0

'unsigned char' = 1個字節,'int' = 2個字節,對吧?我的意思是'int'的高字節。 – Mot

3

是的,這應該可以工作,但請注意,這不包括小寫字符,但請注意,您忘記返回true獲得成功。

此外,默認情況下,您的方法和成員標記爲private

如果發生故障,您還應該初始化result,否則如果您忘記檢查返回類型,則冒着使用未初始化變量的風險。

+0

謝謝。我用這個小方法來解釋我想要達到的目標。 – Mot

+0

@MikeL。是的,有一個預感這不是實際的代碼。 –

1

首先,總是使用&,除非您需要*的特殊權力。在這種情況下,你不需要pResult ++指向另一個字符,所以你不需要*。一個引用是「像一個間接已經打開的指針」(帶有一長串細微的異常),所以如果你只說* pResult,就說結果。

接下來,我不想考慮引用在未賦值變量上的位置時會發生什麼。只需使用unsigned char result = 0;讓每個人都開心。健康的C++編碼風格總會有一些額外的冗長。

接着,像隱含的其他應答器,初始化結果內部 parseHexNibble(),(例如爲0),因此它具有健康非值,如果該方法沒有發現可分析的字符。

接下來,chr - '0'的結果是一個整數,然後您默默地向下轉換爲一個無符號的字符。在某些情況下,結果應該是整數,即使您確實從不使用其高位。

我懷疑你的最後一行應該返回true。

現在我一般建議A>學習單元測試現在,不晚,而B>也學一軟語,如紅寶石,所以你知道爲什麼 C++是那麼小氣,但有充分理由。

(順便說一句,即使你的平臺上可以例外,從未使用它們表示「這個方法返回一個錯誤或出帶外的結果。」這會帶來瘋狂...)

+0

謝謝。你有沒有單元測試Arduino程序? Ruby會幫助我編寫如此小的8位uC嗎? – Mot

+0

我不同意使用&代替*。 (請參閱我的回答以獲得解釋。) – Matt

+0

指針是危險的動物;你需要一些其他的約定來指示結果的方法改變。使用指針就可以說&結果是一個「可編輯的評論」。 – Phlip