2016-08-21 5 views
0

Я пытаюсь разобрать char * через несколько функций (каждый из них извлекает часть сообщения), и мне трудно передать указатели между функциями. В части сообщения, с которым у меня возникают проблемы, есть целое число, за которым следует пробельный символ, за которым следует двойной.C: Передача и возврат указателей на символ *

Все это работает на 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

"*' real' * "? Если бы у нас это было в Turbo-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); 

(я полагаю, tablet_queue это символ *).

Если у вас есть объявление функции f с параметром char * и указателем char * p, то вы передаете f (p), а не f (& p), поэтому, возможно, вам нужно изменить ptr также, когда вы проходите strtol(message+13, &ptr,10).

Смежные вопросы