0

私の問題は、strcmp()関数が次の問題を引き起こすことです。

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

コンパイル中およびプログラムの実行中は次のようになります。

Segmentation fault: 11

エラーの意味はわかっていますが、他の方法はわかりません... itoa()またはsprintf()の使用を検討しましたが、16進数のチェックサムが必要なため、どのように実行できるかわかりません。それ。

コードは次のとおりです。

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

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

4

4 に答える 4

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

そして、XOR[0]どこでも使用できます。

上記は、コードが実際に実行しようとしていたことを、セグメンテーション違反なしで書き直したものです。

それが何をすべきか。。。は、strcmp()バイナリテキストを同じ値のフォーマットされたバージョンと比較しているため、機能しません。あなたunsigned char XOR;(またはおそらく8ビット<stdint.h>タイプ)はほぼ正しいです。ただし、これを。==ではなくスカラーとして比較してくださいstrcmp()

あなたがそれを比較するもの。。。NMEAの印刷可能な16進数を適切なスカラーオペランドに変換する必要がある==ため、sscanf()を使用するか、16進数変換のコードを開いてください。1


1. 16進入力変換コードの例は、多くのスタックオーバーフローの回答で利用できます。

于 2012-04-10T18:40:02.353 に答える
0

(コードを簡単に見て)正しいチェックサムが0であると期待しているように見えます。そうである場合は、ゼロと比較してください。

if ( XOR == 0 )
    printf( "OK\n" );
于 2012-04-10T18:37:49.810 に答える
0

strcmpnullで終了するC文字列が必要です。あなたのXOR変数は配列でさえありません。これは単一のunsigned char値です。(これが警告なしにコンパイルされることに少し驚いています。)とにかく、memcmpバイナリデータを比較するときに使用することをお勧めします。

于 2012-04-10T18:40:31.883 に答える
0

XORは1バイトです。チェックサムは、符号なし文字の配列です。コンパイラが警告(*)を付けてコードを通過させた場合、私はそれをダンプします。

(*):はい、技術的にはこれが「診断」であることを知っています。

于 2012-04-10T18:40:52.847 に答える