2016-08-21 10 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)を読み込むと、正しい位置(整数の直後のスペース)を指しています。しかし、私は私のメイン関数または2番目の関数でポインタから文字列を読むとき、それは正しい場所を指していません。

私がしようとしているのは、main関数に最初の関数で更新された配列へのポインタを渡し、次に2番目の関数がそのポインタを受け取り、それを使用することです。

ご協力いただければ幸いです。

+0

'char ** ptr;'は、charポインタへのユニット化されたポインタを作成します。逆参照すると、無効なポインタがあります。これはおそらくあなたの問題を引き起こします。 – kaetzacoatl

+0

"*' real' * "?ターボ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ルーチンでは、間違った種類のほとんどを持っていました。

最初のパラメータはメッセージポインタです. 2番目のパラメータは、整数の解析が終了したときに内部のstrtolが設定するchar(出力として設定)のポインタ上のポインタであるため、解析の再開場所を知ることができます。 mainの値を変更できるようにポインタをポインタとして渡す必要があります。

整数を解析すると、残りはほぼOKです。私は何かをキャストする必要はないことに注意してください。 char **char *にキャストしているときに何か問題があります。

0

は書くようにしてください:

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

(私は* tablet_queueがcha​​rであると仮定します)。

パラメータchar *およびポインタchar * pを持つ関数宣言fを持つ場合、f(& p)ではなくf(p)を渡すので、strtol(message+13, &ptr,10)を渡すときにもptrを変更する必要があります。

関連する問題