Problem mit Konvertierung eines Parameters
-
Für ein Uniprojekt habe ich aus einer ISO Norm Code übernommen, der mir den Wert von CRC Bytes berechnen soll.
Beim Kompilieren allerdings erhalte ich folgende Fehlermeldung:
error C2664: 'ComputeCrc': Konvertierung des Parameters 1 von 'unsigned char [10]' in 'char *' nicht möglich
Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.Ich bin Programmieranfänger und weiß nicht, in wie fern das Problem von mir oder dem Code ausgeht. Offensichtlich ist es C-Code. Kann das Problem daran liegen. dass ich mit Visual C++ kompiliere (weil ich an der Uni nichts anderes zur Verfügung habe)?
Hier der Code:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define BYTE unsigned char #define USHORT unsigned short unsigned short UpdateCrc(BYTE ch, USHORT *lpwCrc) { ch = (ch^(BYTE)((*lpwCrc) & 0x00FF)); ch = (ch^(ch<<4)); *lpwCrc = (*lpwCrc >> 8)^((USHORT)ch << 8)^((USHORT)ch<<3)^((USHORT)ch>>4); return(*lpwCrc); } void ComputeCrc(char *Data, int Length, BYTE *TransmitFirst, BYTE *TransmitSecond) { BYTE chBlock; USHORT wCrc; wCrc = 0xFFFF; // ISO 3309 do { chBlock = *Data++; UpdateCrc(chBlock, &wCrc); } while (--Length); wCrc = ~wCrc; // ISO 3309 *TransmitFirst = (BYTE) (wCrc & 0xFF); *TransmitSecond = (BYTE) ((wCrc >> 8) & 0xFF); return; } int main(void) { BYTE BuffCRC_B[10] = {0x0A, 0x12, 0x34, 0x56}, First, Second, i; printf("Crc-16 G(x) = x^16 + x^12 + x^5 + 1"); printf("CRC_B of [ "); for(i=0; i<4; i++) printf("%02X ",BuffCRC_B[i]); ComputeCrc(BuffCRC_B, 4, &First, &Second); printf("] Transmitted: %02X then %02X.", First, Second); return(0); }
Anmerkung: In der Norm (ISO 14443 B, Anhang
steht der Code in leicht abgewandelter Form, diesen Code habe ich aus einem Bauteildatenblatt, der nur etwas spezifischer auf meine Anwendung abgestimmt ist. Der Code aus der Norm liefert mir jedoch exakt die gleich Fehlermeldung. Ich bin mir also ziemlich sicher, dass es sich nicht um einen trivialen Abtippfehler handelt.
Gruß, Etze
-
Etze schrieb:
Ich bin Programmieranfänger und weiß nicht, in wie fern das Problem von mir oder dem Code ausgeht. Offensichtlich ist es C-Code. Kann das Problem daran liegen. dass ich mit Visual C++ kompiliere (weil ich an der Uni nichts anderes zur Verfügung habe)?
Dein Problem liegt daran, daß der Standard nicht festlegt, ob char (ohne Zusatzkennungen) vom Compiler als "signed char" oder "unsigned char" behandelt werden soll - beim Visual Studio lässt sich das übrigens mit dem Compilerschalter /J umstellen.
Aber für dich wäre wohl die einfachste Lösung:
void ComputeCrc(BYTE *Data, int Length, BYTE *TransmitFirst, BYTE *TransmitSecond) // ^ hier "BYTE" verwenden ...
-
CStoll (off) schrieb:
Dein Problem liegt daran, daß der Standard nicht festlegt, ob char (ohne Zusatzkennungen) vom Compiler als "signed char" oder "unsigned char" behandelt werden soll
Anm.:
char wird _niemals_ als signed char oder unsigned char behandelt, da es ein eigenständiger Typ ist. Es ist lediglich implementationsspezifisch, ob char den gleichen Wertebereich wie signed char oder unsigned char hat.
-
Hi, danke für die Hilfe.
Mit Deiner Änderung wurde der Fehler behoben.
-
Jetzt habe ich noch ein allerletztes Problem. Ich habe den Code dahingehend geändert, dass ich die für die CRC Berechnung verwendeten Bytes über die Konsole eingeben kann.
Um mir das Ergebnis der Berechnung anzuschauen, habe ich am Ende eine Zeile mit getchar() eingebaut.
Wenn ich starte ohne Debuggen klappt auch alles, beim Starten mit Debuggen (und beim Ausführen einer erstellten Anwendung) bricht das Programm allerdings mit der Meldung
Das Programm "[1732] CRC_Calc.exe: Systemeigen" wurde mit Code 0 (0x0) beendet.
ab.
Hier der Code, wobei der von mir geänderte Code nur in der Main Funktion vorkommt:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define BYTE unsigned char #define USHORT unsigned short unsigned short UpdateCrc(BYTE ch, USHORT *lpwCrc) { ch = (ch^(BYTE)((*lpwCrc) & 0x00FF)); ch = (ch^(ch<<4)); *lpwCrc = (*lpwCrc >> 8)^((USHORT)ch << 8)^((USHORT)ch<<3)^((USHORT)ch>>4); return(*lpwCrc); } void ComputeCrc(BYTE *Data, int Length, BYTE *TransmitFirst, BYTE *TransmitSecond) { BYTE chBlock; USHORT wCrc; wCrc = 0xFFFF; // ISO 3309 do { chBlock = *Data++; UpdateCrc(chBlock, &wCrc); } while (--Length); wCrc = ~wCrc; // ISO 3309 *TransmitFirst = (BYTE) (wCrc & 0xFF); *TransmitSecond = (BYTE) ((wCrc >> 8) & 0xFF); return; } int main(void) { int x1, x2, x3, x4; printf("Enter first Byte: "); scanf("%x", &x1); printf("Enter second Byte: "); scanf("%x", &x2); printf("Enter third Byte: "); scanf("%x", &x3); printf("Enter fourth Byte: "); scanf("%x", &x4); BYTE BuffCRC_B[10] = {x1, x2, x3, x4}, First, Second, i; printf("CRC-16 G(x) = x^16 + x^12 + x^5 + 1\n\n"); printf("CRC_B of [ "); for(i=0; i<4; i++) printf("%02X ",BuffCRC_B[i]); ComputeCrc(BuffCRC_B, 4, &First, &Second); printf("]\nTransmitted: %02X then %02X.\n\n", First, Second); getchar(); return(0); }
-
Ist es für Dich ein unvorhergesehenes Ereignis, wenn sich ein Programm nach getaner Arbeit beendet?
-
Ja.
Zumindest, wenn ich die Eingabe, auf die getchar() wartet, nicht getätigt habe.
-
Etze schrieb:
Zumindest, wenn ich die Eingabe, auf die getchar() wartet, nicht getätigt habe.
In dem Fall solltest du wohl vor dem getch() mal den Tastatur-Puffer auskippen - dort dürfte immer noch das ENTER von der letzten Eingabe liegen und auf Verarbeitung warten.
(PS: Nein, "fflush(stdin);" ist der falsche Weg)
-
Danke, mit dem Hinweis konnte ich es beheben