2012-04-10 8 views
0

Mein Problem ist, dass die strcmp() Funktionen die folgenden Probleme macht:strcmp() geben Segmentation fault: 11 und Zeiger von Ganzzahl Warnung

main.c:35: warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast 

Beim Kompilieren und die folgende, während das Programm ausgeführt wird:

Segmentation fault: 11 

Ich weiß, was die Fehler bedeutet, ich weiß einfach keine andere Möglichkeit, es zu tun ... Habe über die Verwendung von itoa() oder sprintf() nachgedacht, aber ich brauche die Prüfsumme in hex, so kann nicht sehen wie kann ich das erreichen?

Der Code ist wie folgt:

#include "checksum.h" 
#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 
    char nmea[] ="$GPRMC,131637.000,A,5820.0658,N,00834.5652,E,0.00,,090911,,,A*7E"; 
    unsigned char checksum[] = "00"; 
    char data[82]; 
    int length = strlen(nmea); 
    int k = 0; 
    int i; 
    unsigned char XOR; 

    checksum[0] = nmea[(length-2)]; 
    checksum[1] = nmea[(length-1)]; 

    for(i=1;i < (length-3);i++){ 
     data[(i-1)] = nmea[i]; 
    } 
    int dataLength = strlen(data); 

    for (XOR = 0, i = 0; i < dataLength; i++) //XORer for å finne checksum 
     XOR ^= (unsigned char)data[i]; 

    printf("*******************************************************\n"); 
    printf("Calculating checksum...\n"); 

    printf("Read checksum: %s\n",checksum); 
    printf("Read data: %s\n",data); 
    printf("Calculated checksum: %X \n",XOR); 

    if(strcmp(XOR,checksum) == 0){   //sammenligner checksumer. 
     printf("Checksum: OK!\n"); 
     //return 1; 
    } 
    else{ 
     printf("Checksum: Mismatch!\n"); 
     //return 0; 
    } 

    printf("*******************************************************\n"); 
    //nmeachecksum(buf); 
    return 0; 
} 

Jede Hilfe wird sehr geschätzt!

Antwort

2
char XOR[2] = { 0, 0 }; 

Und dann benutzen Sie einfach XOR[0] überall.

Das obige ist nur meine No-segfault Neuschreiben, was Ihr Code war eigentlich versucht zu tun.

Was es tun sollte. . . Die strcmp() vergleicht binären Text mit einer formatierten Version desselben Werts, so dass es nicht funktioniert. Ihr unsigned char XOR; (oder vielleicht ein 8-Bit <stdint.h> Typ) ist ungefähr richtig. Aber vergleichen Sie dies mit == als Skalar statt mit strcmp().

Was vergleichen Sie mit. . . Sie müssen Ihr NMEA-druckbares Hex in einen skalaren Operanden umwandeln, der für == geeignet ist, also verwenden Sie sscanf() oder öffnen Sie einfach die hexadezimale Konvertierung.


1. Hex Eingangskonvertierungscodebeispiele sind in vielen Antworten Stackoverflow zur Verfügung.

+0

Beendet mit einer Hex-to-Integer-Funktion finden Sie hier: http://johnsantic.com/comp/htoi.html und konvertiert die NMEA druckbare Hex. Und dann habe ich einfach einen if-Test durchgeführt, wie du es vorgeschlagen hast. Vielen Dank! – StianL

0

Es erscheint (von einem kurzen Blick auf den Code), dass Sie die richtige Prüfsumme erwarten 0 zu sein Wenn ja, dann vergleichen Sie nur gegen Null:

if (XOR == 0) 
    printf("OK\n"); 
0

strcmp erwartet eine nullterminierte C-Zeichenfolge. Ihre XOR Variable ist nicht einmal ein Array. Es ist ein einzelner unsigned char Wert. (Ich bin ein bisschen überrascht, dass dies sogar kompiliert, ohne Sie zu warnen.) Jedenfalls ist es vorzuziehen, memcmp zu verwenden, wenn Sie binäre Daten vergleichen.

0

XOR ist ein einzelnes Byte. Checksumme ist ein Array von Zeichen ohne Vorzeichen. Wenn der Compiler den Code mit einer Warnung (*) durchlässt, würde ich ihn löschen.

(*): Ja, ich weiß technisch, dass dies eine "Diagnose" ist.