2016-10-18 3 views
-2

내가 다음변환 플로트

  float temperature = getTemperature(); 

     char array[15]; 
     sprintf(array, "temperature %f", temperature); 

     int length = strlen(array); 
     protocol_WriteMessage(length,(unsigned char*)&array); 

로, 내가 sprintf를 사용 문자의 문자열을 부동 소수점으로 변환하기 위해 노력하고있어 sprintf를 할 수 있지만, protocol_WriteMessage 서명되지 않은 숯불 *을 받아, 그래서 그것을 주조하지만, 프로그램이 충돌. 우선

void protocol_WriteMessage(UINT16 wLen, UINT8 *pbData) 
{ 
    UINT16 crc_calc; 

    // Calculate transmitt CRC16 
    crc_calc = calc_crc16(&pbData[COMM_POS_COMMAND1], wLen-COMM_POS_COMMAND1); 

    comm_states.TxActive = true;   // signal that the Tx_UART is working 

    // write data without further checks 
    hal_uart_WriteBuffer(wLen, pbData); 
} 
+0

'15 '가 너무 짧다고 생각하지 않습니까? –

+2

누군가 위의 설명에 대해 나쁜 말장난을 만들 수 있습니까? 그리고 네, 더 큰 배열이 필요합니다. – Treycos

+0

안녕하세요, 제발 잘해주세요! –

답변

0

snprintf() 같은 안전한 대안을 사용하고 호출에서 연산자의 & 주소를 제거합니다. A와 그렇게 통과 할 때

배열이 이미 유형 char 다음 유형은의이다 자신의 첫 번째 요소에 대한 포인터이기 때문에이

int result; 
char array[32]; // This should be big enough 

result = snprintf(array, sizeof(array), "temperature %f", temperature); 
if ((result == -1) || (result >= sizeof(array))) { 
    // It means that array is too small, or some other error 
    // occurred such that `snprintf' has returned -1 
} 

protocol_WriteMessage(length, (unsigned char *) array); 

같은 것을 할 필요가 snprintf() 사용하려면 char *입니다 포인터, & 연산자를 사용하는 것은 분명히 잘못되었으며 캐스팅은 실수 한 사실 만 숨 깁니다.

+1

동의하지 않습니다. (프로토콜의 배열, sizeof 배열, "온도 % f", getTemperature() snprintf() "와 같은 더 안전한 대안을 사용하고 그것을 사용하는 방법을 보여주지 않습니다. 'snprintf (array, sizeof array, ...) '를 사용하고 결과를 확인하지 않으면, OP는 단순히 "온도 25.000000"의 이상적인 결과를 "온도 25"'로 절단합니다. 'temperature = 125'의 결과는''temperature 12''입니다. 이것은''temperature = 12''와 같은 결과이기 때문에 잘못되었습니다. (그래서 임베디드 컨트롤러는 난방을 계속하고, 너무 추워!) 나는 앞으로 소송을 보게됩니다. – chux

+0

이것은 snprintf()를 사용하는 방법을 자세히 설명하지 않고 제안하는 것이 좋지 않은 대답 인 이유의 좋은 예입니다. 다른 방법으로 코드는 더 큰 버퍼와'sprintf()'를 사용할 수 있었고 다른 문제는 있었지만이 문제는 발생하지 않았습니다. 함수가 근본적인 약점을 가지고 있기 때문에'snprintf()'를 적절히 사용하는 것을 자세히 설명하는 것이 좋습니다 - 부분 문자열 결과를 생성 할 수 있습니다. – chux

+0

@chux OP가 읽을 수 있도록 문서에 대한 링크를 추가했습니다. 질문은'snprintf()'에 관한 것이 아니라 내가 제안하는 것이 좋은 원래 코드를 개선 한 것입니다. –