Wo liegt in meinem Programm der Fehler?



  • Hallo!

    Ich habe versucht ein Programm zu schreiben, das alle möglichen Byte-Reihenfolgen von 1, 2 und 3 aufeinanderfolgenden Bytes in einen String speichert. Leider stürzt das Programm schon immer direkt am Start ab. Der Kompiler hat weder Fehler noch Warnungen ausgegeben. Wo liegt mein Fehler?

    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    int main(int argc, char *argv[ ])
    {
    
       string data;
       string s;
       char c;
       bool next;
    
       data = char(0);
       s = string(char(0));
    
       while (s.length() < 3)
       {
    
          next = 0;
    
          for (int i=0; i<s.length(); i++)
          {
             if (s[i] != char(255))
             {  
                s[i]++;
                for (int n=0; n<s.length(); n++)
                {
                   data += s[n];                
                }
                break;
             }
    
             if ((i == s.length()-1) && (s[i] == char(255)))
             {
                next == 1;
             }
    
          }         
    
          if (next == 1)
          {
             for (int i=0; i<s.length(); i++)
             {
                s[i] = char(0);
                data += s[i];
             }
    
             s += char(0);
             data += char(0);        
          }
    
       }
    
       ofstream ausgabe("C:\\Dokumente und Einstellungen\\Martin\\Desktop\\test.hex",ios::binary);
       ausgabe.write(data.c_str(),data.length());   
    
       getchar();
    
       return 0;
    
    }
    


  • beim ersten kurzen draufschaun versteh ich

    next == 1;
    

    in der ifverzweigung nicht.



  • imho crasht es schon dort, wo du den string-Zuweisungsoperator mit einem Nullpointer aufrufst:

    data = char(0);
    


  • Ist doch gar kein Pointer.

    Hm, kommt man da nicht viel schneller ans Ziel, indem man einfach einen unsigned hochzählen lässt und die jeweils interessanten Teile in den Stream speichert? Man müsste sich nur Gedanken um die endian-ness machen (vielleicht eine union nehmen und einmal char[4] und unsigned long reintun).



  • Ich habe den Quelltext jetzt geändert. Das Programm rechnet nun bis der String "s" 2 Bytes groß ist und "data" 1278 Bytes groß ist. Ab dann bleibt das Programm einfach stehen und macht nicht mehr weiter. Ich habe aber keine Ahnung warum.

    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    int main(int argc, char *argv[ ])
    {
    
       string data;
       string s;
       char c;
       bool next;
    
       data = (char)0;
       s = (char)0;
    
       while (s.length() < 3)
       {
    
          cout << s.length() << " - " << data.length() << endl;
          next = 0;
    
          for (int i=0; i<s.length(); i++)
          {
             if (s[ i ] != (char)255)
             {  
                s[ i ]++;
                for (int n=0; n<s.length(); n++)
                {
                   data += s[n];                
                }
                break;
             }
    
             if ((i == s.length()-1) && (s[ i ] == (char)255))
             {
                next = 1;
             }
    
          }        
    
          if (next == 1)
          {
             for (int i=0; i<s.length(); i++)
             {
                s[ i ] = (char)0;
                data += s[ i ];
             }
    
             s += (char)0;
             data += (char)0;        
          }
    
       }
    
       ofstream ausgabe("C:\\Dokumente und Einstellungen\\Martin\\Desktop\\test.hex",ios::binary);
       ausgabe.write(data.c_str(),data.length());  
    
       getchar();
    
       return 0;
    
    }
    


  • operator void schrieb:

    Ist doch gar kein Pointer.

    oops. hab nur gesehen, dass es keinen ctor für char gibt, nicht, dass es einen operator= für char gibt.



  • Ich habe noch ein paar Logik-Fehler behoben. Aber das Ergebnis stimmt immer noch nicht. Die 1-Byte Ausgaben stimmen. Bei der 2-Byte Ausgabe stimmen die Werte von "00 01" - "00 FF" auch noch. Ab dann gibt es nur noch "01 FF", "02 FF", "03 FF" usw.. Ich verstehe nicht warum diese Schleife das nicht verhindert.

    for (int n=i+1; n<s.length(); n++) { s[n] = (char)0; }
    
    #include <iostream>
    #include <string>
    #include <fstream>
    
    using namespace std;
    
    int main(int argc, char *argv[ ])
    {
    
       string data;
       string s;
       char c;
       bool abbruch=0;
    
       data = (char)0;
       s = (char)0;
    
       while (abbruch == 0)
       {
    
          cout << s.length() << " - " << data.length() << endl;
    
          for (int i=0; i<s.length(); i++)
          {
             if (s[i] != (char)255)
             {  
                s[i]++;
    
                for (int n=i+1; n<s.length(); n++)
                {
                   s[n] = (char)0;                
                }
    
                for (int n=0; n<s.length(); n++)
                {
                   data += s[n];                
                }
    
                break;
             }
    
             if ((i == s.length()-1) && (s[i] == (char)255) && (s.length() < 2))
             {
                for (int n=0; n<s.length(); n++)
                {
                   s[n] = (char)0;
                   data += s[n];
                }
    
                s += (char)0;
                data += (char)0;        
             }
             else if ((i == s.length()-1) && (s[i] == (char)255)) { abbruch = 1; }
    
          }         
    
       }
    
       cout << "SPEICHER" << endl;
    
       ofstream ausgabe("C:\\Dokumente und Einstellungen\\Martin\\Desktop\\test.hex",ios::binary);
       ausgabe.write(data.c_str(),data.length());   
    
       getchar();
    
       return 0;
    
    }
    


  • Das sieht nicht so optimal aus:

    for (int n=i+1; n<s.length(); n++) { s[n] = (char)0; }
    

    Die Länge eines Strings ist immer die Position des ersten Null-Zeichens. Wenn du aber s[n] auf char(0) setzt, hat der String nur noch eine Länge von n.
    Bei manchen Implementierungen wird der Speicher danach vielleicht schon freigegeben.
    Auf jeden Fall kannst du im nächsten Schleifendurchlauf nicht mehr auf das nächste s[n] zugreifen, da das hinter dem Ende des Strings liegt.

    Achso:
    Ein string eignet sich nicht wirklich gut zum Speichern von Binärdaten, in denen das Null-Zeichen vorkommt.
    Du könntest einen vector<char> nehmen.
    Oder ein Array von unsigned char.
    Oder die Zeichen direkt speichern.



  • Thx! Das Programm läuft jetzt.


Anmelden zum Antworten