2016-08-21 2 views
0

여러 함수 (각 함수는 메시지의 일부를 추출 함)를 통해 char *를 구문 분석하려고하며 함수간에 포인터를 전달하는 데 문제가 있습니다. 문제가있는 메시지 부분에는 공백 문자와 그 뒤에 이중 문자가 오는 정수가 있습니다. C : char에 대한 포인터 전달 및 반환 *

모두는 STM32F4에서 실행 :

주요 기능 :

char* myMsg = NULL; 
char* nLink = NULL; 

SerialQueue_pop(&myMsg, &tablet_queue); //Extract a char* from a buffer 
uint8_t id = extract_gset_id(myMsg, (char*)&nLink); //Extract the integer from the char* 
real value = extract_gset_value((char*)&nLink); //Extract the real (float) from the char* 

기능 :

int8_t extract_gset_id(char* message, char* pEnd) 
{ 
    char** ptr; 
    if ((strlen(message)-13)>0){ 
     int8_t val = (int8_t)(0xFF & strtol(message+13, &ptr,10)); 
     *pEnd = ptr; 
     return val; 
    } 
    return -1; 
} 

real extract_gset_value(char* message) 
{ 

    if ((strlen(message))>0){ 
     char arr[8]; 
     real val = strtod(message, NULL); 
     snprintf(arr, 8, "%2.4f", val); 
     return val; 
    } 
    return -1; 

} 

첫 번째 함수 호출이 정수를 추출한다을 문자열의 문자 (13)에서 시작 . 이 잘 작동하고 strtol 호출 후 반환 포인터 (nLink) 읽을 경우 정확한 위치 (정수 바로 뒤에있는 공간)를 가리키고 있습니다. 그러나, 내 주요 함수 또는 두 번째 함수에서 포인터를 문자열을 읽을 때 올바른 위치를 가리키는 지 않습니다.

내가 뭘하려는 건 주요 함수가 첫 번째 함수에 의해 업데이 트 가져옵니다 배열에 대한 포인터를 전달하는 다음 두 번째 함수는 그 포인터를 사용하고 그것을 사용합니다.

도움을 주시면 감사하겠습니다.

+0

'char ** ptr;'char 포인터에 대한 단위화된 포인터를 생성합니다. 역 참조 할 때 잘못된 포인터가 있습니다. 아마도 문제가 발생할 수 있습니다. – kaetzacoatl

+0

"*'진짜'*"? 터보 -C에서 이걸 가지고 있었나요? – alk

+0

@kaetzacoatl :'ptr'은'strtol()'호출에 의해 설정됩니다. – alk

답변

0

전체 고정 코드가 작동하는지 것으로 스텁 :

#include <stdio.h> 
#include <stdlib.h> 
#include <strings.h> 
typedef unsigned char int8_t; // I had to guess 
typedef double real; 

int8_t extract_gset_id(const char* message, char** pEnd) 
{ 

    if ((strlen(message)-13)>0){ 
     int8_t val = (int8_t)(0xFF & strtol(message+13, pEnd,10)); 
     return val; 
    } 
    return -1; 
} 

real extract_gset_value(const char* message) 
{ 

    if ((strlen(message))>0){ 
     //char arr[8]; 
     real val = strtod(message, NULL); 
     //snprintf(arr, 8, "%2.4f", val); // this line is useless 
     return val; 
    } 
    return -1; 

} 
int main() 
{ 
char* myMsg = NULL; 
char* nLink = NULL; 


//SerialQueue_pop(&myMsg, &tablet_queue); //Extract a char* from a buffer 
myMsg = "abcdefghijklm129 5678.0"; 
int8_t id = extract_gset_id(myMsg, &nLink); //Extract the integer from the char* 
real value = extract_gset_value(nLink); //Extract the real (float) from the char* 
printf("%d, %lf\n",(int)id,value); 
} 

당신은 특별히 extract_gset_id 루틴에서, 잘못된 유형의 대부분을했습니다.

첫 번째 매개 변수는 메시지 포인터, OK 두 번째 매개 변수는 내부 strtol 세트는 정수를 구문 분석을 완료하는 문자에 대한 포인터에 대한 포인터 (출력으로 설정)입니다, 그래서 당신은 어디에서 분석을 재개하는 것을 알고있다. main의 값을 변경할 수 있도록 포인터를 포인터로 전달해야합니다.

일단 정수를 파싱하면 나머지는 거의 괜찮습니다. 아무 것도 던질 필요가 없음을 주목하십시오. char **char *으로 전송할 때 문제가 발생했습니다.

0

쓰기보십시오 :

SerialQueue_pop(myMsg, tablet_queue); 
uint8_t id = extract_gset_id(myMsg,nLink); 
real value = extract_gset_value(nLink); 

(I *이 tablet_queue는 문자입니다 가정).

매개 변수 char * 및 포인터 char * p가있는 함수 선언 f가있는 경우 f (&p)가 아닌 f (p)를 전달하므로 strtol(message+13, &ptr,10)을 전달할 때 ptr도 변경해야 할 수 있습니다.