0

複数の関数 (それぞれがメッセージの一部を抽出する) を使用して char* を解析しようとしていますが、関数間でポインターを渡すのに問題があります。私が問題を抱えているメッセージの部分には、整数の後にスペース文字が続き、その後に double が続きます。

これはすべて 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) を読み取ると、正しい場所 (整数の直後のスペース) を指しています。ただし、メイン関数または 2 番目の関数でポインターから文字列を読み取ると、正しい場所を指していません。

私がやろうとしているのは、メイン関数が最初の関数によって更新される配列へのポインターを渡してから、2 番目の関数がそのポインターを取得して使用することです。

どんな助けでも大歓迎です。

4

2 に答える 2

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 2 番目のパラメーターは、整数の解析が終了したときに内部が設定する char (出力として設定) のポインター上のポインターであるstrtolため、解析を再開する場所がわかります。の値を変更できるように、ポインターをポインターとして渡す必要がありますmain

整数を解析したら、残りはほとんど問題ありませんでした。何もキャストする必要がないことに注意してください。何かにキャストchar **してchar *いるときは間違っています。

于 2016-08-21T20:39:27.090 に答える