Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Wo liegt in meinem Programm der Fehler?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
18.08.2003, 17:44 Uhr
~pmw
Gast


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?


C++:
#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;
  
}



--edit: Pablo. Smilies entfernt --

Dieser Post wurde am 19.08.2003 um 13:00 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.08.2003, 18:16 Uhr
typecast
aka loddab
(Operator)


Es liegt an der Stelle

C++:
  s = string(char(0));



Wenn du dir das char(0) mal ausgeben lässt, dann wirst du feststellen, dass char(0) nichts zurückgibt. Dann wird versucht nichts in einen String umzuwandeln. Das kann natürlich nicht funktionieren.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.08.2003, 19:37 Uhr
~pmw
Gast


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.


C++:
#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;
  
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.08.2003, 20:18 Uhr
pmw



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.


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




C++:
#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;
  
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.08.2003, 21:31 Uhr
~wissender
Gast


Hm, meiner Meinung nach dürfen auch die Ein-Byte-Ausgaben nicht stimmen, will heißen, du dürftest nur eine korrekt Ausgabe bis 127 bekommen.
Dann nämlich gibt es bei signed bytes einen Überlauf und nach 127 kommt
-128.
Damit wäre deine Permutation kaputt.
Versuche eventuell vector<unsigned char> zu verwenden, string verwendet signed chars, da hast dann statt 8 bit nur 7.

Scheinen auch noch Logikfehler drin zu sein, aber mach erstmal das mit den unsigned chars.

Viel Glück!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.08.2003, 21:34 Uhr
~wissender
Gast


Es sei denn, du sagst dem Compiler er soll chars standardmäßig als unsigned ansehen, aber das habe ich noch nie getestet...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
19.08.2003, 08:33 Uhr
0xdeadbeef
Gott
(Operator)


Du permutierst nicht, sondern zählst erst hoch und bappst dann ein Zeichen dran. Warum machst dus eigentlich nicht so:

C++:
#include <stdio.h>

int main() {
  int i, j, k;
  FILE *fd = fopen("bla.hex");

  for(i = 0; i < 256; ++i) {
    fprintf(fd, "%c", i); /* 1-bit */
    for(j = 0; j < 256; ++j) {
      fprintf(fd, "%c%c", i, j); /* 2 bit */
      for(k = 0; k < 256; ++k)
        fprintf(fd, "%c%c%c", i, j, k); /* 3 bit */
    }
  }
  fclose(fd);

  return 0;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 19.08.2003 um 08:33 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.08.2003, 11:24 Uhr
~wissender
Gast


Jo, so ists richtig...
Allerdings hat er jetzt keinen Spass mehr mit dem selber ausprobieren.
Eines Sache wäre noch zu tun, nämlich die Ausgaben sortieren nach Größe, jetzt haste Ausgaben der Reihenfolge 0, 00, 000, 001, 002 , ... , 10 , 010, 011, etc.

@0xdeadbeef
Permutation:
Anordung von n verschiedenen Elementen in irgendeiner Reihenfolge ohne Wiederholung eine Elementes [...]
"Neue Enzyklopädie des Wissens, S.2596"

Will heißen: auch eine Aufzählung ist eine Permutation, da eine Reihenfolge halt auch irgendeine Reihenfolge ist :-)
1, 2, 3 ist also eine Permutation und eine Aufzählung (Permutation ist halt die Basisklasse einer Aufzählung)

Jede Aufzählung ist eine Permutation, aber nicht jede Permutation ist eine Aufzählung (kommt ein wenig darauf an, was man unter "Aufzählung" versteht).

Gruß
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.08.2003, 11:28 Uhr
~wissender
Gast


@0xdeadbeef
Dein Algorithmus ist übrigens der Standard nicht rekursive Algorithmus zum Erstellen einer Permutaion.
Wobei man für n Stellen auch n for-Schleifen braucht, ist also nicht fexibel, aber das war ja auch nicht gefragt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.08.2003, 20:32 Uhr
pmw



Thx wissender! Das Programm läuft jetzt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: