Fehlersuche in kleinem Programm
-
Er kennt Klassen glaub ich noch nicht ;). Vorläufig geht das auch ohne, in ein paar Monaten kann er ja immer noch einen Klassen-Taschenrechner programmieren.
Das war mir klar, darum meinte ich ja, dass er lieber auch einfach mal weitermachen soll, dann kommt das von alleine.
Also ehrlichgesagt, das was Drakon vorhin geschrieben hat, dass ich selber nicht mehr so recht weiss was der Code macht, das stimmt nicht ganz

Bei diesem Quelltext wusste ich so ziemlich alles was wo ist und was es macht, deshalb vertand ich den Fehler nicht.
Kommentieren tu ich meist auch, gestern habe ich Funktionen aber zum ersten Mal im "grossen" Stil angewendet, ich wusste zuerst noch gar nicht was genau passiert, dies sah ich erst wirklich bei der Ausführung, die Kommentare kann ich jetzt immer noch schreiben...

Scheint so, als ob ich doch Recht hatte.
Es war auch kein Vorwurf. Das passiert schonmal, dass man meint, dass man etwas richtig überlegt hat und überzeugt ist, dass es so funktionieren muss, aber man dann beim ausführen merkt, dass es doch nicht so ganz das ist, was man wollte.Du solltest deinen Code einfach so weit im Kopf haben, dass du, wenn etwas passiert du sofort weisst, wo du in etwa suchen musst. Sprich, wenn du siehts, dass irgend etwas mit der Eingabe nicht funktioniert du genau an eine Stelle gehen musst (wo die Eingabe statt findet) und dann an dieser Stelle gezielt (mit dem Debugger) schauen kannst, was da anderst läuft, als du dir das vorstellst. Dann überlegst du dir einfach jeden Schritt ganz genau, was du erwartest, dass gemacht wird und dann schaust du, WAS gemacht wird. Wenn deine Behauptunt und der Fall, der Eintritt unterschiedlich sind, bist du schon fast am Ziel und hast den Fehler gefunden.
-
Der Debugger macht mich langsam neugierig

Nächste oder übernächste Woche werde ich zu ihm kommen, wenn ich mich jeden Tag reinhänge

Hmmm.. da hab ich mich doch vorher tatsächlich im selben Satz widersprochen
, naja wenigstens grösstenteils wars verstanden 
-
naja so wie du das bis jetzt gemacht hast ist das eig schon relativ gut für einen anfänger
aber eine sache hätte ich noch:
du hast noch nicht ganz verstanden wozu funktionen eigendlich da sind
Skyese schrieb:
double ErsteZahl() { double Zahl; cout << endl << endl << "Geben Sie nun eine Zahl ein: "; cin >> Zahl; return Zahl; } double ZweiteZahl() { double Zahl; cout << endl << endl << "Geben Sie nun eine weitere Zahl ein: "; cin >> Zahl; return Zahl; }was fällt dir an diesen beiden funktionen auf?
richtig, sie machen im prinzip dasselbe
sie fragen beide anch einer zahl und returnen diese dann...an deiner stelle würde ich das dann zu folgendem zusammensetzen
double ZahlAbfragen() { double Zahl; cout << endl; cout << "Gib eine Zahl ein: "; cin >> Zahl; return Zahl; }dann könntest du in der main funktion folgendes schreiben
int main() { // ... double zahl1, zahl2; zahl1 = ZahlAbfragen(); zahl2 = ZahlAbfragen(); }das alles in eine funktion zu packen hat folgende vorteile:
- weniger schreibarbeit, und damit weniger syntaktische fehler
- weniger logische fehler weil alles ja nur einmal geschrieben werden muss
- kleinere programme, sowohl vom quellcode als auch vom späteren mashcinencode her
- bessere lesbarkeit, man muss beim durchgehen nur eine funktion im kopf haben und sich halt nur eine funktion kurz angucken, anstatt 2du hast die funktionen alle als textersetzung geschrieben
nach dem motto: 5 zeilen hauptprogramm, aber noch 80 zeilen funktionenalso denk dran:
-schreibe funktionen immer so dass du sie möglichst oft wieder verwenden kannst
-lass eine funktion absolut nur das machen was sie soll (im späteren verlauf beeinhaltet dass sogar dass du in einer funktion soger für eine "einfache" ausgabe schon eine andere funktion wieder aufrufst -> stichwort: streamumleitung)mfg mosho
PS: du hast ja in beiden funktionen 2 verschiedene text anchrichten an den benutzer eingebunden, sowas kann man dann realisieren wenn man eben die gewünschte nachricht an die funktion übergibt, aber das sollte dir bald auch klar werden...
-
Da geb ich dir völlig recht, das war wohl ein Denkfehler. Mir ging es nämlich - wie du gesagt hast - darum, dass die Sätze gleich sind. Dass hätt ich anders lösen können, das stimmt, werd ich mir merken

Skym0sh0 schrieb:
du hast die funktionen alle als textersetzung geschrieben
nach dem motto: 5 zeilen hauptprogramm, aber noch 80 zeilen funktionenEben, wie ich bereits gesagt hab ist der Aufbau ein völliger blödsinn :p aber eben ich wollte damit lediglich den Aufbau von Funktionen lernen und dass war nur möglich wenn ich möglichst viel Funktionen mache auch wenns keinen Sinn hat.

Dafür sieht der Code unterhalb der Main() recht übersichtlich aus

-
jop da haste recht^^
naja viel spass und erfolg noch in der (C++)-Programmierung...
Und ich denke dass du erfolg haben wirst...
-
Danke, das hoff ich auch (und glaube das kann ich auch, was ich mir in den Kopf gesezt habe will ich!
)Gerade Pointer, Arrays durchgemacht und jetzt bei den Strings

ziemlich happig, aber das kommt gut
-
also die strings sind einfach
also ich meine die klasse damit
ist quasi wie im (noob)-java
relativ einfach...pointer sidn an sich auch nicht schwer aber man muss irgendwie immer etwas um die ecke denken
und da muss man sich etwas dran gewöhnenarrays sind ganz einfach, aber nach kurzer zeit sind das eig auch schon nur noch pointer auf sonstwas...
-
Für was sind die Arrays eigentlich, der wirkliche Nutzen wird in meinem Buch nicht erklärt, auch im Internet ist auf die schnelle kein konkretes Beispiel zu finden...

Ist es für Grafikberechnungen??

Morgen ist ja eh wiedermal ein repeat-day^^
-
Arrays sind quasi starre Container für beliebige Datentypen. Du kannst also zum Beispiel die monatlichen Umsätze von einem Unternehmen als long speichern ohne das du 12 Variablen anlegen musst und wenn du dann zum Beispiel den Umsatz vom Februar willst kannst du über den Index 1 darauf zugreifen (weil ja bei 0 angefangen wird zu zählen).
MfG
-
OK danke für deine Antwort, ist mir jetzt schon klarer

-
arrays sind auf gut deutsch ein speicher für einen datentyp mit einer bestimmten grösse
für manche probleme (primzahlberechnung per brute force oder wahrscheinlichkeiten bzw mittelwerte) braucht man halt 10000 zahlen um es zu lösen
ja und man könnte jetzt 10000 variablen einzeln erstellen
oder eben arrays benutzen:int a1, a2, a3, a4, ..., a10000; // 10000 einzelne variablen int a[10000]; // ein array mit 10000 speicherplätzen
-
Noch ne kleine Frage:
#include <iostream> #include <cstring> char String1[12]; char String2[6]; using namespace std; int main(void) { strcpy(String1, "Hello World"); cout << String1 << '\n'; strcpy(String2, String1); cout << String2 << endl; }Ich find da im Buch & Google keine Antwort, wieso kann String2 den Wert "Hello World" aufnehmen obwohl ich ihn mit 6 definiert habe

Wird da der Wert gleich mitkopiert? Kann man also nicht so direkt das Programm zwingen nur "Hello" auszugeben?
-
Du hast einfach Glück gehabt.
String2bietet nur für 6 Zeichen Platz (inklusive abschliessendem '\0'). Das heisst, du schreibst in irgendeinen Speicherbereich. Das Verhalten davon ist undefiniert, deshalb kann es funktionieren, aber auch nicht. Gewöhn dir jedoch an, das nicht so zu machen.Um die 5 Zeichen (fünf, wegen Nullterminierung) zu erzwingen, kannst du die Funktion
strstr(), die einen Teil des Strings zurückgibt, verwenden.In diesem Zusammenhang möchte ich dich aber gerade auf die C++-Klasse
std::stringaufmerksam machen, die einiges vereinfacht und dir die Speicherverwaltung abnimmt.
-
Hab doch gedacht dass ich sowas schon gelesen habe

Zufall heisst wohl, dass diese Speicheradresse nicht von anderen Programmen besetzt ist

Werds mir jedenfalls nicht angewöhnen - danke

-
Skyese schrieb:
Zufall heisst wohl, dass diese Speicheradresse nicht von anderen Programmen besetzt ist ;))
Nein, normalerweise haben andere Programme auf 32-Bit-Systemen dank virtuellem Adressraum keinen Zugriff auf den Arbeitsspeicher für das Programm.
Es kommt eben drauf an, möglicherweise steht an der Stelle bereits ein Wert, oder die Adresse kann nicht beschrieben werden, oder sie ist einfach ungültig. Speicher, den du nicht reserviert hast, solltest du niemals beschreiben.Hauptsache, du merkst dir
std::string