Fehler bei scanf_s

Gast #982185
Lesenswert?

Hallo zusammen

habe wie oben gesagt ein Problem mit der scanf_s. Ich möchte die CRC16 
für eine Modbuscom berechnen. Wenn ich die Werte fest vergebe ist das 
auch kein Problem. Nur wenn ich sie über scanf_s einlese, bekomme ich 
fehler in der Berechnung. Bzw ein Array wird nicht mit Daten gefüllt. 
Jemand ne Idee? Anbei der Code
1
#include <stdio.h>
2

3
// Berechnung CRC16
4
// ----------------
5
unsigned int CRC16(unsigned int crc, unsigned int data)
6
{
7
const unsigned int Poly16=0xA001;  //Generatorpolynom
8
unsigned int LSB, i;
9
crc = ((crc^data) | 0xFF00) & (crc | 0x00FF);
10
for (i=0; i<8; i++)
11
{
12
LSB=(crc & 0x0001);
13
crc=crc/2;
14
if (LSB)
15
crc=crc^Poly16;
16
}
17
return(crc);
18
}
19

20
int main()
21
{
22

23
/*unsigned*/ char NumData;  
24
/*unsigned*/ char InputByte; 
25
/*unsigned*/ char i,data[255]/*={01,43,14,01,00}*/; // Telegrammbuffer
26
unsigned char Crc_HByte,Crc_LByte; //
27
unsigned int Crc;
28

29
/*Einlesen des Wortes Problemzone*/
30
printf("Anzahl der Bytes: ");
31
scanf_s("%d",&NumData);
32
printf("Anzahl der Bytes = %d\n",NumData);
33

34
for (i=0; i<NumData;i++)
35
{
36
  printf("Wert Byte:" );
37
  scanf_s("%d",&InputByte);   
38
  data[i]= InputByte;
39
}
40
printf("Wert data: %d\n %d\n %d\n %d\n %d\n" ,data[0],data[1],data[2],data[3],data[4]);
41

42
/*keine Probleme*/
43
Crc=0xFFFF;
44
for (i=0; i<NumData; i++) 
45
{
46
Crc = CRC16 (Crc, data[i] );
47
}
48
Crc_LByte = (Crc & 0x00FF); // Low-Byte bestimmen
49
Crc_HByte = (Crc & 0xFF00) / 256; // High-Byte bestimmen
50

51
printf("LByte %d\n",Crc_LByte);
52
printf("HByte %d\n",Crc_HByte);
53
while (1)
54
{;
55
;}
56
}

Alles auf der Basis von Visual c++ 2005.
Persönliche Seite #982230
Lesenswert?

1
/*unsigned*/ char NumData;  
2
...
3
scanf_s("%d",&NumData);

Das geht schief. "%d" instruiert scanf, einen int-Pointer zu verwenden.

sizeof int != sizeof char

Damit wird also nicht nur der Speicher beschrieben, der für "NumData" 
reserviert ist, sondern auch noch andere Dinge, die in der gleichen 
Gegend abgelegt sind, hier also potentiell noch "InputByte" und/oder 
"i".

Du solltest einen passenderen Formatspezifizierer verwenden, allein, der 
C-Standard sieht keinen für diesen Fall passenden vor.
Also musst Du in einen int einlesen und danach umkopieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren