Checksumme - oder: Ich bin kurz vorm Verzweifeln
-
Hi Leute,
ich habe von der Schule eine Aufgabe gestellt bekommen,die ich lösen muss.
Normalerweise bin ich nicht der Typ der viele Threads eröffnet,doch jetzt stecke ich fest und komme nicht mehr weiter(nach knapp 6 Stunden Probiererei verzage ich schon leicht).Und zwar geht es um ein Programm das die Checksumme kontrollieren soll.
Dazu hab ich mir folgende Gedanken gemacht:Zuerst wird die Hex Datei eingelesen und zeilenweise ausgegeben,anschließend wird die Länge des Strings ermittelt.
Dann erstellte ich eine for-Schleife die angefangen vom 2 Element aus dem String(der Erste ist ja der Doppelpunkt) bis zum Vorletzten zählt(Return wäre dann der Letzte).
Dann soll er schauen welchen ASCII Code der Buchstabe oder die Zahl besitzt und diesen umwandeln.
Zum Schluss wird dann der erste Wert mit 161 multipliziert und der zweite mit 160.Die beiden werden dann zusammenaddiert.
Soweit zu meiner Erklärung,aber schaut es euch bitte selber im Quellcode an.Mittlerweile bin ich mir nicht mal mehr sicher ob meine Überlegungen zur Berechnung der Checksumme überhaupt stimmen.
//Checksumme #include<iostream> using namespace std; int main() { FILE *datei; datei=fopen("/home/bernhard/schule/C++/r.hex","r"); //Hex-Datei char string[800],string2[800]; int speicher,speicher2,laenge,zahl; while(fgets(string,80,datei)!=0) { puts(string); //zeilenweise ausgeben } laenge=strlen(string); for(int x=1;laenge-=1;x+=2) { speicher=(int)string[x]; speicher2=(int)string[x+1]; if((speicher>48) && (speicher <65)) { speicher-=48; } else { speicher-=65; } if((speicher2>48) &&(speicher2<65)) { speicher2-=48; } else { speicher2-=65; } zahl=(speicher*16)+(speicher2); fclose(datei); datei=fopen("home/bernhard/schule/C++/abc.txt","a"); //Zieldatei fprintf(datei,"%d",zahl); fclose(datei); } }mfg und besten Dank Schluchti
-
Da ich gleich weg muss hier erstmal nur ein paar Anmerkungen:
1. Du bist im falschen Forum
2. Bis auf die ersten drei Zeilen ist das ein C-Programm, kein C++
3. Du benutzt laenge als Bedingung, eine Variable die nie einen Wert erhalten hat
4. Du liest die ganze Datei ein und verarbeitest nur die letzte Zeile (und das nur wenn sie ein Zeilenende-Zeichen hatte)
5. Du öffnest dieselbe Datei bei jedem for-Schleifendurchlauf neu (und schliesst sie nirgendwo)
-
Hi LordJaxom,
zu 1: Uups,könnte den bitte jemand verschieben? Danke!
bezüglich 3: Das ist wohl bei den vielen verschiedenen Versuchen untergegangen,ich hab es nun ergänzt.
zu 4: Könntest du das bitte näher erläutern,ich weiß nicht genau was du meinst.
zu 5: Ich habe nun Änderungen vorgenommen damit die einzelnen Dateien wieder geschlossen werden.
Die Änderungen sind im Quellcode oben editiert.
edit: Die Fehlermeldung beim Ausführen des Programmes lautet: "Segmentation fault".
-------------------------------------------------------------------------
Ich habe zu Testzwecken die Ausgabe des Programmes geändert und nun kommt beim Ausführen(beim Compilieren kommt komischerweise nichts..) dieser Fehler:*** glibc detected *** double free or corruption (top): 0x0804a008 ***
2Aborted//Checksumme #include<iostream> using namespace std; int main() { FILE *datei; datei=fopen("/home/bernhard/schule/C++/r.hex","r"); //Hex-Datei char string[800],string2[800]; int speicher,speicher2,laenge,zahl; while(fgets(string,80,datei)!=0) { puts(string); //zeilenweise ausgeben } laenge=strlen(string); for(int x=1;laenge-=1;x+=2) { speicher=(int)string[x]; speicher2=(int)string[x+1]; if((speicher>=48) && (speicher <65)) { speicher-=48; } else { speicher-=65; } if((speicher2>=48) &&(speicher2<65)) { speicher2-=48; } else { speicher2-=65; } fclose(datei); zahl=(speicher*16)+(speicher2); cout<<zahl; } }mfg Schluchti
-
zu 1: Uups,könnte den bitte jemand verschieben? Danke!
Klar

Ich schieb dich mal nach c++, in der hoffung das du vor hast was aus dem iostream auch noch irgendwo zu verwenden *g*
-
Dieser Thread wurde von Moderator/in CMatt aus dem Forum C# und .NET in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Da sind so vieeele Fehler drinn (laenge-=1), schreib das erstmal ins reine (C++ ;)).
grüße
-
David_pb schrieb:
Da sind so vieeele Fehler drinn (laenge-=1), schreib das erstmal ins reine (C++ ;)).
grüße
Hi David,
ich muss zu meiner Schande gestehen,dass ich weder C++ noch C richtig kann(wird man ohnehin in meinen Posts merken).In der Schule werden uns sowohl C Fragmente als auch C++ Befehle beigebracht. Gewisse Sachen kann ich nur in C,andere wiederrum nur in C++ lösen....
In der Freizeit versuche ich mithilfe eines Buches reines C++ zu lernen,doch der Schweinehund(in diesem Fall: C ) schlägt doch noch durch.
Falls sich doch jemand in dem Sprachgewirr auskennt und helfen kann,dann bitte ich ihn mir zu helfen.
Hier der Quellcode(habe heute nochmals einige Sachen geändert),eigentlich muss es fehlerfrei laufen,doch das macht es nicht.
Als Fehlermeldung kommt bei der Ausführung: "Speicherzugriffsfehler"
//Checksumme #include<iostream> using namespace std; int main() { FILE *datei; datei=fopen("/home/bernhard/schule/C++/r.hex","r"); //Hex-Datei char string[800],string2[800]; int speicher,speicher2,laenge; int checksum =0; while(fgets(string,80,datei)!=0) { puts(string); //zeilenweise ausgeben } laenge=strlen(string); laenge-=1; for(int x=1;x<laenge;x+=2) { speicher=(int)string[x]; speicher2=(int)string[x+1]; if((speicher>=48) && (speicher <55)) { speicher-=48; } else { speicher-=55; } if((speicher2>=48) &&(speicher2<55)) { speicher2-=48; } else { speicher2-=55; } checksum+=(speicher*16)+(speicher2); } cout<<checksum; }
-
for(int x=1;laenge;x+=2)terminiert nicht da laenge=strlen(string)-1 ist.
was du willst ist:
for(int x=1;x<laenge;x+=2)
-
Hi,
schon langsam geniere ich mich wirklich was ich teilweise für Flüchtigkeitsfehler mache.
Als ich das Programm das erste mal ausgeführt habe ging es,und es zeigte den richtigen Wert an,anschließend hab ich den Hex-Code in der Quelldatei umgeändert,und jetzt kommt keine Ausgabe mehr.Auch nicht mit dem ersten Wert...
Die Quelldatei besitzt Root-Recht,das heißt ich kann sie nur mit Root Rechten bearbeiten. Das kann ja keine Auswirkungen auf die Funktionaliät des Programmes haben,da sie ja nur gelesen wird - oder?
mfg Schluchti
-
Mich würd zum testen mal der Inhalt von r.hex interessieren. Evtl mal wo hochladen.
grüße
-
David_pb schrieb:
Mich würd zum testen mal der Inhalt von r.hex interessieren. Evtl mal wo hochladen.
grüße
Hi David,
der Inhalt der Datei beschränkt sich derzeit auf eine Zeile(später werden es dann mal mehr,aber zum Testen wird es sonst zu unübersichtlich.
Folgendes steht in r.hex
:0200000080324C
mfg Schluchti
-
Schluchti schrieb:
...
zu 4: Könntest du das bitte näher erläutern,ich weiß nicht genau was du meinst....Bin zwar nicht der Lord, aber ich denke, er meint folgende Stelle:
...... char string[800],string2[800]; while(fgets(string,80,datei)!=0) // bei jedem fgets wird string neu überschrieben { ... } laenge=strlen(string); // ab hier arbeitest Du mit string ... // und da ist NUR das drin, was Du beim LETZTEN fgets() // reingeschrieben hast - evtl. sogar gar nichts, // je nachdem, was fgets() mit string macht, wenn es nichts mehr // zu lesen hatte (und deswegen 0 zurückgibt ...Gruß,
Simon2.
-
Hi Simon2,
das war es wirklich.
Nun funktioniert das Programm einwandfrei.
Vielen Dank an alle Helfenden!
mfg Schluchti