0

我正在尝试通过多个函数(每个函数提取消息的一部分)解析一个 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),它指向正确的位置(在整数后面的空格处)。但是,当我从主函数或第二个函数中的指针读取字符串时,它并没有指向正确的位置。

我要做的是让主函数将指针传递给由第一个函数更新的数组,然后第二个函数获取该指针并使用它。

任何帮助,将不胜感激。

4

2 回答 2

0

试着写:

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

(我想 tablet_queue 是 char * )。

当您有一个带有参数 char* 和指针 char* p 的函数声明 f 时,您传递的是 f(p) 而不是 f(&p) ,所以也许您在传递时也需要更改 ptr strtol(message+13, &ptr,10)

于 2016-08-21T19:26:09.693 回答
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 第二个参数是一个 char 上的指针(设置为输出),内部strtol在完成解析整数时设置,因此您知道从哪里恢复解析。您必须将指针作为指针传递,以便它可以更改main.

一旦你解析了整数,剩下的就差不多了。请注意,我不需要投射任何东西。当你投射char **char *某事是错误的。

于 2016-08-21T20:39:27.090 回答