Checksumme - oder: Ich bin kurz vorm Verzweifeln



  • 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


Anmelden zum Antworten