Hilfe beim arbeiten mit Feldern
-
Davon abgesehen funktioniert mein Code nicht einmal.
Statt Zeile 10 muß sowas hin:regex r = regex("[01]{8}"); if (regex_match(in, r))
Warum auch immer. C++ ist eben seltsam. Oder ich bin zu doof dafür.
-
@RBS2 sagte in Hilfe beim arbeiten mit Feldern:
@manni66 sagte in Hilfe beim arbeiten mit Feldern:
std::string input;
Besser
char input[8];
Wenn du "besser" durch "gefährlicher" ersetzt... An den @Fischbrezel: halte dich an @manni66 s Vorschlag
-
@wob sagte in Hilfe beim arbeiten mit Feldern:
Wenn du "besser" durch "gefährlicher" ersetzt...
Schreibt dann 'cin' über die Arraygrenze hinaus?
-
Zwar war das nicht mein Plan, ich musste aus Zeitgründen, den Code so simple und dennoch umständlich wie möglich gestalten, da die Aufgabe zu meinen Einsendeaufgaben gehört und ich bereits an den drei Aufgaben (Diese hier ist die dritte) seit drei Wochen dran hänge. ^^
Ich habe es jetzt so gemacht, dass ich jede Ziffer der Binärzahl einzeln und nacheinander eintippen muss. Die Ziffern werden direkt überprüft ob diese größer ist als 2.
Gerechnet habe ich:input = input*pow(a,b)
und die einzelnen Input(1-8) habe ich dann addiert.
Ich bleibe dennoch an dieser Aufgabe dran, da ich sie nicht auf diese weise lösen wollte. Ab jetzt ist es halt nicht für meine Lehre, sondern für mein Ego. ^^
-
@RBS2 Ja.
Außerdem: warumchar[x]
benutzen, wenn es mit String auch geht?Und
char[8]
reicht für 7 Zeichen + '\0', nicht für 8 Zeichen.
-
@wob sagte in Hilfe beim arbeiten mit Feldern:
@RBS2 Ja.
Außerdem: warumchar[x]
benutzen, wenn es mit String auch geht?Und
char[8]
reicht für 7 Zeichen + '\0', nicht für 8 Zeichen.Jammerschade; ich glaubte 'cin' würde die Array-Länge kennen. Habe lange kein C++ mehr gemacht, die Hälfte vergessen. Bin eben Java-verwöhnt.
Immerhin freut mich, dass C++ inzwischen Regexe hat. Vielleicht kannst du mir erklären, warum meine erste Version nicht geht, aber die mit der Variablen tut's dann. Seltsam, oder?
-
@Fischbrezel sagte in Hilfe beim arbeiten mit Feldern:
den Code so simple ... wie möglich gestalten,
Das ist C:
int myBinaryTtoI(char *str) { int ergebnis = 0; for (int i = 0; str[i] != '\0'; ++i) ergebnis = ergebnis * 2 + str[i] - '0'; return ergebnis ; } int main() { char str[] = "1001"; int val = myBinaryTtoI(str); printf ("%d ", val); return 0; }
-
@RBS2 sagte in Hilfe beim arbeiten mit Feldern:
Jammerschade; ich glaubte 'cin' würde die Array-Länge kennen. Habe lange kein C++ mehr gemacht, die Hälfte vergessen. Bin eben Java-verwöhnt.
Verwendest du in Java auch
char[] c = new char[8]
, wenn du eigentlich einen String lesen willst? Vermeidest dujava.lang.String
? Nein? Dann nimm in C++ auch einfachstd::string
!Immerhin freut mich, dass C++ inzwischen Regexe hat. Vielleicht kannst du mir erklären, warum meine erste Version nicht geht, aber die mit der Variablen tut's dann. Seltsam, oder?
Beide Varianten sind entweder false, weil der String zu kurz ist und somit nicht passt - oder aber du hast in beiden Varianten undefiniertes Verhalten, weil du 8 (oder mehr) Zeichen eingegeben hast und somit mindestens ein Zeichen hinter den Puffer geschrieben hast. Es sind also beide Varianten von dir falsch. Nimm
std::string
!
-
@wob sagte in Hilfe beim arbeiten mit Feldern:
Beide Varianten sind entweder false, weil der String zu kurz ist und somit nicht passt - oder aber du hast in beiden Varianten undefiniertes Verhalten, weil du 8 (oder mehr) Zeichen eingegeben hast und somit mindestens ein Zeichen hinter den Puffer geschrieben hast. Es sind also beide Varianten von dir falsch.
Danke für die Erklärung. Mit 'string' geht auch die erste Variante.
-
@wob sagte in Hilfe beim arbeiten mit Feldern:
Verwendest du in Java auch char[] c = new char[8], wenn du eigentlich einen String lesen willst?
Das habe ich bestimmt auch mal versucht, aber die ArrayIndexOutOfBoundsException hat mich eines Besseren belehrt.
-
@RBS2 ...dann kompiliere in C++ doch mit
g++/clang++ -fsanitize=address ...
oder vermeide einfach C-style Arrays.
-
@Fischbrezel sagte in Hilfe beim arbeiten mit Feldern
Ich bleibe dennoch an dieser Aufgabe dran, da ich sie nicht auf diese weise lösen wollte. Ab jetzt ist es halt nicht für meine Lehre, sondern für mein Ego. ^^
Als Anregung hilft dir vielleicht auch dieser Kollege hier weiter, der immer sehr gute Erklärungen zu verschiedenen Grundlagenthemen gibt. Für den umgekehrten Fall (Dezimal in Binär) gibt's hier z.B. ein Video von ihm:
https://www.youtube.com/watch?v=u6nYYCJ7ZuoOder zum Nachschlagen find ich auch diese Reihe hier gut:
https://www.youtube.com/watch?v=nFM0SuPSxnc&list=PLfthkO_8dYCqARBKnZQm6Ck614Td9Vmz7
-
So würde ich das lösen, wenn die Aufgabenstellung wäre:
Verwende nur den iostream:#include <iostream> using namespace std; int main() { char Binaer[7]; int Dezimal; int E0,E1,E2,E3,E4,E5,E6,E7; do{ cout<<"8 Bits eingeben: "; cin>>Binaer; cout<<Binaer[0]<<Binaer[1]<<Binaer[2]<<Binaer[3] <<Binaer[4]<<Binaer[5]<<Binaer[6]<<Binaer[7]<<endl; }while((Binaer[0] != '0' && Binaer[0] != '1') ||(Binaer[1] != '0' && Binaer[1] != '1') ||(Binaer[2] != '0' && Binaer[2] != '1') ||(Binaer[3] != '0' && Binaer[3] != '1') ||(Binaer[4] != '0' && Binaer[4] != '1') ||(Binaer[5] != '0' && Binaer[5] != '1') ||(Binaer[6] != '0' && Binaer[6] != '1') ||(Binaer[7] != '0' && Binaer[7] != '1')); if (Binaer[7] == '1') E7 = 1; else E7 = 0; if (Binaer[6] == '1') E6 = 2; else E6 = 0; if (Binaer[5] == '1') E5 = 4; else E5 = 0; if (Binaer[4] == '1') E4 = 8; else E4 = 0; if (Binaer[3] == '1') E3 = 16; else E3 = 0; if (Binaer[2] == '1') E2 = 32; else E2 = 0; if (Binaer[1] == '1') E1 = 64; else E1 = 0; if (Binaer[0] == '1') E0 = 128; else E0 = 0; Dezimal = E7+E6+E5+E4+E3+E2+E1+E0; cout<<"Die Dezimalzahl ist: "<<Dezimal<<endl; return 0; }
-
@theAnfänger77
Du weißt wie man Schleifen benutzt?
Die ganze Kaskade kann man ohne Hilfsvariablen in einer einzigen Schleife lösen.- Initialisiere das Ergebnis mit 0
- für jedes Zeichen im String:
- Schiebe Ergebnis 1 bit nach links
- setze Bit 0 im Ergebnis, falls das aktuelle Zeichen eine '1' ist
-
@theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:
char Binaer[7];
Das ist ja noch schlimmer als die Lösung von @RBS2.
-
An die Anfänger/Neulinge:
bitte kompiliert euren Code immer mit eingeschalteten Warnungen!Wenn ich den Code von @theAnfänger77 kompiliere, ergibt sich:
$ clang++-7 -Wall -Wextra forum.cpp forum.cpp:14:48: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds] <<Binaer[4]<<Binaer[5]<<Binaer[6]<<Binaer[7]<<endl; ^ ~ forum.cpp:7:5: note: array 'Binaer' declared here char Binaer[7]; ^ forum.cpp:22:16: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds] ||(Binaer[7] != '0' && Binaer[7] != '1')); ^ ~ forum.cpp:7:5: note: array 'Binaer' declared here char Binaer[7]; ^ forum.cpp:22:36: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds] ||(Binaer[7] != '0' && Binaer[7] != '1')); ^ ~ forum.cpp:7:5: note: array 'Binaer' declared here char Binaer[7]; ^ forum.cpp:24:9: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds] if (Binaer[7] == '1') ^ ~ forum.cpp:7:5: note: array 'Binaer' declared here char Binaer[7]; ^ 4 warnings generated.
Also - so funktioniert es nicht. Vergesst
am Anfang erst einmaldie Arrays und nehmt stattdessenstd::string
für Char-Arrays undstd::vector
für alle anderen Array-Typen. Ich verwende in C++ praktisch überhaupt keine C-Style-Arrays.
-
@manni66 sagte in Hilfe beim arbeiten mit Feldern:
@theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:
char Binaer[7];
Das ist ja noch schlimmer als die Lösung von @RBS2.
Was sagt der große Meister dazu?
char Binaer[8]; cin >> setw(8) >> Binaer;
Immer noch Buffer Overflow?
-
@RBS2 sagte in Hilfe beim arbeiten mit Feldern:
@manni66 sagte in Hilfe beim arbeiten mit Feldern:
@theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:
char Binaer[7];
Das ist ja noch schlimmer als die Lösung von @RBS2.
Was sagt der große Meister dazu?
char Binaer[8]; cin >> setw(8) >> Binaer;
Immer noch Buffer Overflow?
Herrgott noch mal...
std::string ScheissEgalWievieleZeichenVerdammtNochMal = ""; std::cin >> ScheissEgalWievieleZeichenVerdammtNochMal;
Ich schwöre, ich poste hier gleich die fertige Lösung, damit hier endlich Ruhe ist....
-
@RBS2 sagte in Hilfe beim arbeiten mit Feldern:
Was sagt der große Meister dazu?
char Binaer[8]; cin >> setw(8) >> Binaer;
Immer noch Buffer Overflow?
Wieviele Bits kann man da jetzt eingeben?
Aber warum sollte man eine einfache Lösung verwenden, wenn man sich doch mit char-Arrays auf unendlich vielen Wegen in den Fuß schießen kann?
-
@manni66 sagte in Hilfe beim arbeiten mit Feldern:
Wieviele Bits kann man da jetzt eingeben?
Ich seh's schon. Es wird wieder eine überflüssige Null angehängt.