Forum: Mikrocontroller und Digitale Elektronik Fehler bei scanf_s


von Bruno (Gast)


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.

von Teplotaxl X. (t3plot4x1)


Lesenswert?

Falsches Forum?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Bruno (Gast)


Lesenswert?

Habe das ein wenig umdeklariert und jetzt läuft die Sache. Habe einfach 
Integer genommen. Danke.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.