2012-05-31 2 views
0

저는 제한된 Arduino 환경에서 C++를 코딩하려고하는 Java 개발자입니다. 예외 및 동적 객체를 사용할 수 없거나 메모리 제한 때문에 피할 필요가 없습니다.여러 값 반환

내 작업에서는 문자 버퍼 (16 진수 니블)를 구문 분석하고 실제 결과뿐만 아니라 성공을 나타내는 부울 값을 반환하는 메서드를 만듭니다. 지금까지 시도한 내용 (관련없는 항목은 회피 됨) :

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

이 있습니다 (플랫폼 활성화 예외 결코는 "이 방법은 허위 또는 대역 외 결과를 반환"을 의미하는 데 사용할 BTW 경우에도 마찬가지입니다. 그런 식으로 ... 광기있다) 몇 가지 방법 : 당신이 값을 전달하는 것처럼

당신은 내가 (* 대신 &을의) 때문에 참조가 아니라 레퍼런스보다 포인터를 사용하는 것이 좋습니다 있지만 그것은 그들 중 하나입니다했던 방법은 함수 호출 보인다 (p.parseHexNibble(c)) 포인터 버전이 더 명확한 반면 뭔가가 그 안에 저장되기를 원할 수도 있습니다 (p.parseHexNibble(&c)).중 하나 char 값 (0 <= i < 256)를 포함하거나 오류 신호를 -1을 인 int를 돌려 :

또 다른 옵션은 (이 사람이 내 개인 좋아하는) getc는 않는 것과 같은 것입니다. 오류가없는 경우 int은 안전하게에 유형을 지정하거나 저장할 수 있습니다. (이 그것을 반환 할 사실에 char 있다고 가정합니다.)

세 번째 방법은 부울 및 문자를 포함하는 구조를 반환하는 것입니다 (중 자신을하거나 std::pair 등을 사용하여).

관련없는 메모에서 실제 문자 값을 저장하려면 unsigned char 대신 char을 사용해야합니다. unsigned char은 임의의 원시 데이터에만 사용해야합니다.

+0

'&'와'*'의 차이점을 명확히 설명해 주셔서 감사합니다. 'parseHexNibble (& c)'이 더 분명해진다는 것에 동의합니다. 나는 이미'bool'과'unsigned char' 대신'int'를 사용하는 아이디어를 가지고있었습니다. 그러나이 경우 추가 처리는 각 변수에 대해이 바보 같은 여분의 바이트를 유지하면서 각각의 일반적인 연산을 더 길게 만듭니다. – Mot

+0

@MikeL . 어떤 여분의 바이트를 언급하고 있습니까? – Matt

+0

'unsigned char' = 1 바이트,'int' = 2 바이트, 맞습니까? 나는 int의 상위 바이트를 의미한다. – Mot

3

예, 그래도 작동하지만이 경우 소문자는 고려하지 않지만 성공하려면 true을 반송하는 것을 잊어 버렸습니다.

또한 메소드 및 멤버는 기본적으로 private으로 표시됩니다.

실패한 경우 result도 초기화해야합니다. 그렇지 않으면 반환 유형을 확인하는 것을 잊어 버린 경우 초기화되지 않은 변수를 사용할 위험이 있습니다.

+0

감사합니다. 나는이 작은 방법을 단지 내가 성취하려는 것을 설명하기 위해 사용했다. – Mot

+0

@MikeL. 실제로, 이것은 실제 코드가 아니라는 직감을 가졌습니다. –

1

먼저 특수 문자가 필요하지 않으면 항상 &을 사용하십시오. 이 경우 다른 문자를 가리 키기 위해 pResult ++를 사용할 필요가 없으므로 * 필요가 없습니다. 참조는 "간접적 인 예외가있는 포인터와 같습니다"(미묘한 예외의 긴 목록이 있음)이므로 * pResult 만 말할 경우 결과를 말하십시오.

다음으로, 할당되지 않은 변수에 참조가 자리 잡으면 어떻게 될지 생각하고 싶지 않습니다. 그냥 서명되지 않은 char result = 0; 모두를 행복하게 해줍니다. 건강한 C++ 코딩 스타일은 항상 약간의 자세한 표시가됩니다. 묵시적 다른 응답기 등

다음, (예 : 0 등) parseHexNibble() 안에 결과 초기화되므로있어서 더 해석 가능한 문자를 찾지 못하면는 건강한 아닌 값을 갖는다.

다음으로 chr - '0'의 결과는 정수이며, 그 다음에 부호없는 char으로 자동 다운 캐스트됩니다. 경우에 따라서는 더 높은 비트를 사용하지 않아도 결과는 정수 여야합니다.

그리고 마지막 라인이 참이어야한다고 생각합니다.

지금 내 일반적인 조언 A>는 C++ 그렇게 까다로울 왜 당신이 을 알 수 있도록, 루비 등 지금이 아닌 이상 및 B> 또한 부드러운 언어를 배우는 단위 테스트를 배우고,하지만 좋은 이유.

+0

감사합니다. Arduino 프로그램을 유닛 테스트 해 본 적이 있습니까? Ruby가 작은 8 비트 UC 코딩에 도움이 될까요? – Mot

+0

나는 * 대신에 &를 사용하는 것에 동의하지 않습니다. (설명은 내 대답을 참조하십시오.) – Matt

+0

포인터는 위험한 짐승입니다. 그 결과로 나타나는 메소드 변경을 나타내는 다른 규칙이 필요합니다. 포인터를 사용하면 & 결과는 "편집 가능한 주석"이라고 말할 수 있습니다. – Phlip