# Was mache ich falsch?



## Crymes (28. April 2010)

Ich bin absoluter Programmieranfänger, kann mir jemand sagen, warum das Programm im Anhang nicht funzt?

(Ist mit Dev C++ geschrieben)

Habe alle Betas gelöscht, das fertige gibt es auf Anfrage per PN.


----------



## Crymes (28. April 2010)

Kommt Leute, ihr könnt mir doch bestimmt weiterhelfen!


----------



## Thomsn (28. April 2010)

Nur mal so als Anregung: Es ist viel besser, wenn du
- bei kurzen Quelltexten diese direkt hier postest (innehalb von code-Tags)
- bei langen Quelltexten diese mittels eines Pastebins postest (z.B: Pastie ).

Das würde deine Chancen auf eine brauchbare Antwort steigern.
Nicht jeder hat Lust, sich eine Zip-Datei aus ungeklärter Herkunft auf dem eigenen Rechner zu entpacken.


----------



## Puepue (28. April 2010)

Also ich hab die Datei mal mit einem Virenscanner gecheckt, trotzdem hättest du das schon posten können, ist ja nicht viel

Das hier ist dein Code:

```
#include <cstdlib>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int Summand1, Summand2 ;
    int Ergebnis ;
       >> Ergebnis = Summand1 + Summand2 ;
          cout << "Bitte geben sie die erste Zahl ein :" << endl ;
          cin >> Summand1 ;
          cout << "Bitte geben sie die zweite Zahl ein :" << endl ;
          cin >> Summand2 ;
          cout << " Ihr Ergebnis ist :" << Ergebnis << endl ;
}
```

Das hier willst du vermutlich haben:

```
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    int Summand1;
    int Summand2;
    int Ergebnis;
    
	cout << "Bitte geben sie die erste Zahl ein :" << endl ;
	cin >> Summand1 ;
	cout << "Bitte geben sie die zweite Zahl ein :" << endl ;
	cin >> Summand2 ;

	Ergebnis = Summand1 + Summand2 ;

	cout << " Ihr Ergebnis ist: " << Ergebnis << endl ;

    return 0;
}
```

1) Du brauchst dafür nur die <iostream> Bibliothek

2) ob int Summand1, Summand2 ; funmktioniert, habe ich noch nie ausprobiert aber 
int Summand1;
int Summand2;
ist auf jeden fall schöner. Außerdem hattest du ein Leerzeichen vorm Semikolon - das kann dir je nach Compiler bestimmt auch ein paar Probleme machen

3) Das Ergebnis kannst/solltest du zwar direkt am Anfang initialisieren, aber was genau es beinhaltet (definieren) kannst du eigentlich erst, wenn du schon weißt was in den Summanden drin steht.

4) Das was ganz vorne vor einer Funktion (in deinem Fall main) steht, definiert, was die Funktion zurück gibt. In deinem Fall steht da int - es muss also ein Integer zurück gegeben werden. Für den Anfang gibst du am besten 0 zurück - wofür man das später mal braucht lernst du dann noch früh genug.

5) So wird das Ergebnis nun angezeigt, aber das Programm schließt sich direkt du kannst noch ein getch(); in die Zeile vor dem return 0 schreiben. Dafür musst du dann noch diese Bibliothek einbinden:
#include <conio.h>
Das ist eigentlich unsauber aber durchaus üblich - bei Visual Studio kann man das weglassen und einfach anstelle von F5 mit Strg+F5 compilieren (bei Dev C++ glaube ich F9)

6) Wenn du Windows Xp+ oder höher hast, dann installier dir doch mal Visual Studio C++ Express das ist kostenlos und gibt meiner Meinung nach verständlichere Fehlermeldungen aus - ist aber Geschmackssache

Hilft dir das weiter?


----------



## bingo88 (28. April 2010)

int summand1, summand2; funktioniert. Man muss sich nur vor Konstrukten wie int* summand1, summand2 etc. hüten. Hier wäre nämlich nur summand1 ein Zeiger (daher auch besser int *summand1, summand2 schreiben, da sieht man dann eher, dass summand1 ein Zeiger ist)!


----------



## Crymes (29. April 2010)

Vielen Dank an alle.
Ich habe das C++ von Microsoft ( Visual Studio ), komm damit aber nicht zurecht ( Bin wahrscheinlich zu dämlich ).
Also wenn das jetzt bei mir klappt, dann probiere ich ein Programm für das errechnen von Wurzeln zu schreiben. 
Ich melde mich bald nochmal.


----------



## Bauer87 (29. April 2010)

Was macht der Schiebeopperator in Zeile 10? Ich würde den mal als den Fehler sehen, den du da hast. Und dann Fehlt noch das Newline am Ende der Textdatei, aber darüber sehen ja die meisten Compiler hinweg.

PS: Du solltest die Summanden vielleicht addieren, wenn du ihnen Werte zugewiesen hast. Momentan summierst du irgendetwas und nicht das, was der Nutzer eingibt. Aber zumindest funktioniert es genau so, wie du es laut Programmcode wolltest. XD


----------



## Thomsn (29. April 2010)

Falls dir Visual Studio für den Anfang zu viel ist, bietet Dev-C++ eine Alternative: Get Dev-C++ at SourceForge.net

Das ist leider nicht mehr ganz aktuell (2005), aber es hat sich bei Anfängern eigentlich bewährt.


----------



## Puepue (29. April 2010)

Das hat er doch schon


----------



## Thomsn (29. April 2010)

... stimmt. Sorry.


----------



## Crymes (14. Mai 2010)

Leute ich brauche euch nochmal.
Ich will ein Zahlenraten-Spiel schreiben.
Nur bekomme ich keine Schleife integriert.
Hier mein bisheriger Code:

#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <cstdlib>
#include <string.h>
#include <stdlib.h>
#include <ctime>

using namespace std;

int main(int argc, char *argv[])
{
    //Variablen

    string frage;
    int zufallszahl, ratezahl;


    //Haupt-Programm

    cout << " Dies ist ein Spiel, wo Zahlen erraten werden muessen" << endl;
    cout << " Wollen sie die Anleitung lesen?  (ja/nein) " << endl;
    cin >> frage;

    //Bedingung

    if ( frage == "ja")
{ 
    cout << "Anleitung" << endl;
    getch();
}    

    else if ( frage == "nein" )

            { 
                cout << "Das Spiel startet jetzt ........" << endl ;
                srand(time(NULL));
                zufallszahl = rand() %100;
                cout << "Geben sie ihre geratene Zahl ein:" << endl;
                cin >> ratezahl;


                    if (ratezahl < zufallszahl)
                 {  cout << "Ihre Zahl ist zu klein";
                    getch();
                 }

                    else if (ratezahl > zufallszahl)
                 {  cout << "Ihre Zahl ist zu gross";
                    getch();
                 }
                    else if (ratezahl = zufallszahl)
                 {  cout << "Sie liegen richtig, Glückwunsch";
                 getch();      







} 

    else

{
    cout << "Du Idiot, kannst du nicht lesen!?" << endl;
    getch();    
}       

}
}

Wäre schön wenn ihr mir nochmal helfen würdet.


----------



## Thomsn (14. Mai 2010)

Langsamfalter schrieb:


> Nur bekomme ich keine Schleife integriert.
> Hier mein bisheriger Code:
> [...]
> Wäre schön wenn ihr mir nochmal helfen würdet.



Was genau ist denn nun das Problem? Was funktioniert nicht oder was verstehst du nicht? Du musst schon richtig beschreiben was du willst.
In dem Code sehe ich keinen Versuch einer Schleife, nur if-Statements. Schleifen macht man mit for oder while.


----------



## Crymes (14. Mai 2010)

Genau das ist mein Problem, ich weiß nicht, wo ich die Schleife hinschreiben soll, da alle meine Versuche nicht erfolgreich waren.


----------



## Thomsn (14. Mai 2010)

Langsamfalter schrieb:


> Genau das ist mein Problem, ich weiß nicht, wo ich die Schleife hinschreiben soll, da alle meine Versuche nicht erfolgreich waren.


Das klingt so, als wäre dir noch nicht klar, wie Schleifen funktionieren.

Die wichtigere Frage wäre: Was soll in die Schleife rein?
Die Antwort: Alles was wiederholt werden soll.

Du musst also die Interaktion mit dem Benutzer, die Eingabe und das Prüfen der Eingabe so oft wiederholen, bis die Eingabe gleich der gesuchten Zahl ist. Dazu schreibst du diese Anweisungen einfach in den Rumpf der Schleife. Als Abbruchbedingung kannst du z.B. den Test verwenden, ob Eingabe ungleich gesuchter Zahl ist.


----------



## Crymes (14. Mai 2010)

Ich wollte eine do-while schleife verwenden (bis die generierte Zahl gleich die eingegebene ist.
Nur bin ich zu dumm sie zu implementieren, deshalb dachte ich, dass mir jemand bei meinem Beispiel so eine Schleife reinschreibt.


----------



## bingo88 (14. Mai 2010)

Mal ganz quick & dirty:

```
#include <iostream>
#include <ctime>
using namespace std;

int main(int argc, char *argv[])
{
    cout << "Dies ist ein Spiel, bei dem Zahlen erraten werden sollen" << endl;

    bool bolExit = false;
    string antwort;

    int zahl, eingabe;
    srand(time(NULL));
    zahl = rand() % 100;

    cout << "Okay, ich habe eine Zahl! Raten Sie mal!" << endl;

    do
    {
        cin >> eingabe;
        if (eingabe < zahl)
        {
            cout << "Zu klein!" << endl;
        }
        else if (eingabe > zahl)
        {
            cout << "Zu gross!" << endl;
        }
        else
        {
            cout << "Erraten!" << endl;
            bolExit = true;
        }
    }
    while (!bolExit);

    return 0;
}
```


----------



## Crymes (14. Mai 2010)

Danke erstmal, werde das, wenn ich den Rechner wieder wechsle mal ausprobieren!


----------



## Crymes (14. Mai 2010)

Juhuuuuuu, es klappt.
Noch mal Danke!!!!!!


----------



## Crymes (15. Mai 2010)

Leute, ich hab noch mal die Verständnisfrage:
Was bedeutet das !bolexit im while-Teil?
Warum funktioniert while(bolexit=true) nicht?


----------



## Bauer87 (15. Mai 2010)

Langsamfalter schrieb:


> Leute, ich hab noch mal die Verständnisfrage:
> Was bedeutet das !bolexit im while-Teil?
> Warum funktioniert while(bolexit=true) nicht?


Das funktioniert nicht, weil du mit deinem Statement (bolexit=true) den Wert von „bolexit“ auf „true“ setzt. Mit „while(bolexit == true)“ wird es klappen. (Merke: Zuweisungsoperator nicht mit Vergleichsoperator verwechseln.)


----------



## Thomsn (15. Mai 2010)

Und das ! ist der Negationsoperator. Das heißt, er negiert den hinter ihm stehenden Ausdruck.
Aus !true wird false, aus !false wird true.


----------



## Crymes (16. Mai 2010)

Vielen Dank an euch, habe das Projekt noch mal überarbeitet.
Könnt ihr mir sagen, was in der funktion modulu nicht funktioniert?
(Bei der Umwandlung des Strings).


----------



## boerigard (16. Mai 2010)

atoi erwartet einen Zeiger auf char, also das was man in C einen String nennt. Du übergibst aber einen std::string (eine Instanz einer C++-Klasse).
std::string hat eine Memberfunktion c_str die du aufrufen musst. Also ratezahl2 = atoi(ratezahl.c_str());

Es sind auch noch ein paar Fehler im Programm, zb. wird ratezahl nirgendswo ein Wert zu gewiesen. Und alles über globale Variablen abzuwickeln ist auch nicht so schön.


----------



## Crymes (17. Mai 2010)

Ich habe noch mal die Datei übersrbeitet, jetzt funktioniert meine Funktion Hauptspiel nicht mehr, wie sie soll.
Hat nochn mal einer ne lösung?
Ist die Lösung der Stringumwandlung(diese moduluzeilen) sinvoll?


----------



## boerigard (17. Mai 2010)

Langsamfalter schrieb:


> Ist die Lösung der Stringumwandlung(diese moduluzeilen) sinvoll?


Ich muss sagen, dass ich gar nicht weiß, was die Funktion überhaupt machen soll .
Aber jetzt wo du was von Stringumwandlung schreibst, wird es mir denke ich klarer. Die C-Library-Funktion atoi wandelt deine Stringeingabe in einen int um. Macht damit atoi nicht schon genau das, was du willst?


----------



## Crymes (17. Mai 2010)

Nein, entschuldigung.
Ich meinte  darunter, die Zeilen mit der Berechung zu einem der String-Zahl entsprechenden Integer.
Wenn ich bei einem String 9 eingebe, gibt er nach der Umwandlung dem ASCII Code entsprechend 39 zurück.
das wollte ich nicht, denn dan müsste man ja bei einer Zufallszahlenspanne von 1-100 (wenn die Zufallszahl genau 100 entspricht) etwas mehr eingeben.


----------



## Crymes (17. Mai 2010)

Das Problem mit dem Integer zu String Weretübereinstimmung habe ich immer noch nicht gelöst, hab aber auf Visual C++ express gewechselt.
Würde mich über viele Vorschläge freuen.

PS: Das Programm gibt es jetzt komplett mit ausführbarer exe und allen abderen Dateien.

Das Problem liegt in den Funktionen stringumw und ausrechnung, die müssen dafür verantwortlich sein, dass der Wert nicht übereinstimmt.

Die Struktur wird noch mal leicht überarbeitet, die globalen Variablen sollen aber so bleiben, ausser ihr bringt ein K.O. Argument dagegen.

Ansonsten würde ich sagen: Beta 0.55 ist fertig!!!!!!!!!!


----------



## boerigard (17. Mai 2010)

Langsamfalter schrieb:


> Das Problem liegt in den Funktionen stringumw und ausrechnung, die müssen dafür verantwortlich sein, dass der Wert nicht übereinstimmt.


Ja, da liegt der Fehler. Hast du die Funktionen mal seperat mit verschiedenen Werten getestet oder auf einem Stück Papier durchgerechnet?

Mir ist auch nicht ganz klar, warum du überhaupt eine String->Int-Umwandlung im Programm hast, anstatt direkt in einen int einzulesen. Genauso wie es dir bingo88 schon vorgeschrieben hatte:
http://extreme.pcgameshardware.de/1815201-post16.html

Und jetzt gehen wir mal durch, was du in der Funktion stringumw bzw. ausrechnung geschrieben hast:
1. Der User gibt in den std::string ratezahl seine geratene Zahl ein (zb. "123").
2. in ausrechnung wandelt atoi den String "123" in einen int um und in int ratezahl2 steht jetzt der Wert 123.
Ist 123 in ratezahl2 nicht genau der Wert, den du haben wolltest?
Die ganzen Berechnungen, die du dann noch ausführst, sind mir nicht klar.

Es sind auch sonst noch ein paar kleine Fehler drin, wie hier: while (exit=true);
Schau noch mal nach, wie bingo88 das in seinem Programm geschrieben hat.



> Die Struktur wird noch mal leicht überarbeitet, die globalen Variablen sollen aber so bleiben, ausser ihr bringt ein K.O. Argument dagegen.


Also ein K.O. Argument gegen globale Variablen in deinem jetzigen Programm nicht unbedingt.
Aber wenn Programmieren mal mehr werden soll als ein Zeitvertreib, dann solltest du so früh wie möglich damit anfangen, dir einen guten Stil anzueignen. Und eine Regel guten Stils ist es, eine Variable so lokal wie möglich zu definieren.
Globale Variablen bringen mehr Ärger als Nutzen.


----------



## Crymes (18. Mai 2010)

Also das mit dem Integer-Einlesen habe ich gemacht, weil er sonst bei einem Buchstaben abstürzt.
Steht aber im Integer nicht bei z.B.   31303030 (bei 1000 im String?), wegen dem ASCII-Code?


----------



## Crymes (18. Mai 2010)

Mist, hab gerade festgestellt, das die Funktion meine Berechnungen schon inbegriffen hat.
hab mir 2 Tage umsonst den Kopf zerbrochen-für umsonst.
Werde den fertigen Built hier für ein paar Tage reinstellen.


----------



## Crymes (18. Mai 2010)

Son das Programm ist fertig, könnt es per PN bei mir holen.
Ich wollte es mir jetzt anschaulicher machen. (mit buttons und so).

Jetzt hab ich ein paar Fragen:
1. 
Wenn ich auf einen Button nen doppelklick mach und dann " listBox1 -> Text = "Hallo"  "
hinschreibe, kommt beim Ausprobieren kein Text.

2.
Gibt es so was wie die "main" Funktion in der Konsole?

3.
Wo kann ich meine funktionen deklarieren? (Bei konsole under "using namespace std").

Freue mich über Antworten.


----------



## Crymes (6. Juni 2010)

Leute, ich würde mich sehr freuen, wenn ihr mir sagt, warum das Programm ikm Anhang nicht funzt.
Irgendwo in der Laden-Funktion muss ein Fehler sein.


----------



## boerigard (6. Juni 2010)

Das erste Problem ist eine falsche Klammersetzung. Es fehlt eine }-Klammer am Ende von main und am Programmende ist eine }-Klammer zu viel. Schau da noch mal genau rüber.

Und dann bei deinen Funktionsrümpfen (ich denke damit wird auch deine dritte Frage beantwortet):

```
int prspeichern(); //<- Da muss das Semikolon weg
{
    string text;
...
```
Das sollte erstmal reichen, damit es überhaupt compiliert. Dann solltest du auch die restlichen Fehler in deinem Programm finden können.

Aber noch was: Rufe nicht main auf. Wenn du laden/speichern mehrmals aufrufen willst, dann mach das über eine Schleife in main.

Deine zweite Frage "Gibt es so was wie die "main" Funktion in der Konsole?", verstehe ich nicht, was du meinst. Kannst du das noch mal genauer erklären?


----------



## Crymes (7. Juni 2010)

Mit dem main meinte ich einen Hauptthread in der objektorientierten Programmierung mit c++.


----------

