2016-08-21 4 views
0

Ich versuche, ein Char * durch mehrere Funktionen zu analysieren (jeder extrahieren einen Teil der Nachricht) und habe Probleme beim Übergeben der Zeiger zwischen den Funktionen. In dem Teil der Nachricht, mit dem ich Probleme habe, gibt es eine Ganzzahl, gefolgt von einem Leerzeichen, gefolgt von einem Doppel.C: Übergabe und Rückgabe von Zeigern zu einem char *

Dies alles wird auf einem STM32F4 ausgeführt wird:

Hauptfunktion:

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* 

Funktionen:

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; 

} 

Der erste Funktionsaufruf eine ganze Zahl beginnend mit Zeichen 13 der Saite extrahieren soll . Das funktioniert gut, und wenn ich den Rückgabezeiger (nLink) nach dem Aufruf von strtol lese, zeigt er auf den richtigen Ort (an der Stelle rechts neben der Ganzzahl). Wenn ich jedoch eine Zeichenfolge aus dem Zeiger in meiner Hauptfunktion oder in der zweiten Funktion lese, zeigt sie nicht auf den richtigen Ort.

Was ich versuche zu tun, ist die Hauptfunktion übergeben einen Zeiger auf das Array, das von der ersten Funktion aktualisiert wird, dann die zweite Funktion nimmt diesen Zeiger und verwendet es.

Jede Hilfe wäre willkommen.

+0

'char ** ptr;' erstellt einen unitären Zeiger auf einen char-Zeiger. Wenn Sie es dereferenzieren, haben Sie einen ungültigen Zeiger. Dies verursacht wahrscheinlich Ihr Problem. – kaetzacoatl

+0

"*' real' * "? Hatten wir das in Turbo-C? – alk

+0

@kaetzacoatl: 'ptr' wird durch den Aufruf von' strtol() 'gesetzt. – alk

Antwort

0

Vollfestgelegten Code, stubbed sicher zu sein, es funktioniert:

#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); 
} 

Sie die meisten der Arten hatte falsch, speziell in der extract_gset_id Routine. Der erste Parameter ist der Nachrichtenzeiger, OK Der zweite Parameter ist ein Zeiger auf einen Zeiger auf ein Zeichen (gesetzt als Ausgabe), das der innere strtol setzt, wenn er die Ganzzahl analysiert, so dass Sie wissen, wo die Analyse fortgesetzt werden soll. Sie müssen den Zeiger als Zeiger übergeben, damit er den Wert in main ändern kann.

Sobald Sie die ganze Zahl analysiert haben, war der Rest fast in Ordnung. Beachte, dass ich nichts werfen muss. Wenn Sie char ** zu char * werfen, stimmt etwas nicht.

0

Versuchen Sie zu schreiben:

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

(Ich nehme an tablet_queue char *).

Wenn Sie eine Funktionsdeklaration f mit Parameter char * und einem Zeiger char * p haben, übergeben Sie f (p) und nicht f (& p), also müssen Sie vielleicht ptr ändern, auch wenn Sie strtol(message+13, &ptr,10) übergeben.

Verwandte Themen