Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

C-Programm liefert falsche Ausgabe

Nobody666 / 4 Antworten / Baumansicht Nickles

Hallo, hab ein C-Programm mit dem GCC-Compiler geschrieben und es funktioniert. Selbes Programm mit dem QC2 compiliert, auch ohne fehler, aber falsche Ausgabe. Denke dass GCC ja ein C++ Compiler ist und der andere ein reiner Compiler, aber .exe ist doch eigentlich .exe aber amscheinend nicht. Kann mir jemand helfen?


Anbei ein kleiner Auszug, der mir beim GCC das gewünschte bringt und mit dem QC2 was falsches


 sprintf(schreibe,"S308%08lX%06lX",Adress,SerialNumber); //in Form -om als String in schreibe gespeichert
 //aufspalten des Strings in 2er hex Zahlen(zur pruefsummenberechnung):
 for (i=0; i<=8;i++) {
  sscanf(schreibe+i*2,"%2X",&aufspaltung[i]);
  }
 //summieren der hexzahlen(i=1, da S3 nicht mitberechnet):
 for(i=1;i<=8;i++) {
  pruefsumme+=aufspaltung[i];
  }
 // Umwandlung in einen String zum Verändern(nur letzten 2 Stellen sollen angezeigt werden):
 sprintf(pruefende,"%016X", 0XFF - pruefsumme); //geraetespezifisch von FF abgezogen
 //trennen des Strings in 2er hex Zahlen(die letzte ist entscheident):
 for (i=0; i<=7;i++) {
  sscanf(pruefende+i*2,"%2X",&trenne[i]);
  }
 if(Darstellung==2){
 //schreiben der Hexnummern in Form -oi(123456->563412):
 fprintf(fp,"S308%08X%02X%02X%02X",Adress,aufspaltung[8],aufspaltung[7],aufspaltung[6]);}

bei Antwort benachrichtigen
mr.escape Nobody666 „C-Programm liefert falsche Ausgabe“
Optionen

Das erste sprinf und die ersten zwei for schleifen würde ich durch:

for(i=0, pruefsumme=0;i>(i*8))&0xff;
for(i=0;i>(i*8))&0xff;

ersetzen (sprinf und sscanf sind overkill, einfache mathematik reicht).
Ob "sprintf(pruefende,"%016X", 0XFF - pruefsumme);" tatsächlich eine 16 stellige hex zahl ausgibt halte ich für sehr fraglich, speziell wenn "pruefsumme" nur eine normale int variable ist.

Das zweite sprintf und die folgende for schleife würden dann zu:
for(i=0;i>(i*8))&0xff;

Schlussendlich das fprintf:
fprintf(fp,"S308%08X%02X%02X%02X",Adress, SerialNumber&0xff, (SerialNumber>>8)&0xff, (SerialNumber>>16)&0xff);
oder vielleicht so:
fprintf(fp,"S308%08X%02X%02X%02X",Adress, ((unsigned char *)&SerialNumber)[0], ((unsigned char *)&SerialNumber)[1], ((unsigned char *)&SerialNumber)[2]);

also alles zusammen:
for(i=0, pruefsumme=0;i>(i*8))&0xff;
for(i=0;i>(i*8))&0xff;

for(i=0;i>(i*8))&0xff;

if(Darstellung==2){
//schreiben der Hexnummern in Form -oi(123456->563412):
fprintf(fp,"S308%08X%02X%02X%02X",Adress, SerialNumber&0xff, (SerialNumber>>8)&0xff, (SerialNumber>>16)&0xff);
}

mr.escape

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen
Nobody666 mr.escape „Das erste sprinf und die ersten zwei for schleifen würde ich durch: for i 0,...“
Optionen

Danke, probier ich gleich mal aus.
Hab schon Bücher gewälzt, kapier aber einfach nicht, was du mit dem
Adress>>(i*8)&0xff machst, bzw was das genau bedeutet. Kannst du mir das bitte erklären?

bei Antwort benachrichtigen
Dreamforger Nobody666 „C-Programm liefert falsche Ausgabe“
Optionen

Erstmal die Reihenfolge:

>> wird vor & ausgeführt

A>>B schiebt das Bitmuster in A um B Bits nach rechts. Jede Stelle die nach rechts geschoben wird ergibt eine division durch 2, aber das wird hier garnicht verwendet. Hier geht es nicht darum das das Bitmuster verschoben wird. z.B 1100111 >> 2 = 0011001

C & D setzt im Ergebniss alle Bits die sowohl in A als auch in B gesetzt sind. Z.B 1100111 & 0011001 = 0000001

Zur Anwendung in diesem Fall:

adress wird um vielfache von 8 Bit nach rechts geschoben. 8 Bit = 1 Byte = Zahl zwischen 0 und 255 = Zahl zwischen 0 und 0xff

Die verschobene Zahl wird jetzt mit 0xff maskiert (ge-&-ed). Das ergebniss dieser Übung ist also jeweils ein byte nach dem anderen der adresse.

Wenn Adresse = 0x356a4b7c4 dann werden mit zunehmendem i der Reihe nach 0xc4, 0xb7, 0x6a und 0x35 zurüchgegeben

bei Antwort benachrichtigen
Nobody666 Dreamforger „Erstmal die Reihenfolge: wird vor ausgeführt A B schiebt das Bitmuster in A um...“
Optionen

Alles klar,
ein großes Danke an mr.escape und dreamforger!!!!!!!!!

bei Antwort benachrichtigen