c++ programm Problem

Warum geht dieses Programm nicht?
Also es ist noch nicht ganz fertig, und für manche ist meine Art des geschriebenen Programmes auch ein wenig komisch^^
Aber eig. müsste das doch so gehen? Habe schon so was ähnliches geschrieben, das ging aber.

Code:
#include<iostream>
#include<fstream>
#include<string>
#include<conio.h>
#include<cstdlib>

using namespace std;

int main()
{
anfang:
       cout<<"Hallo! Ich bin ein Notizprogramm.\n";
       cout<<"In mich kannst du alle deine Notizen speichern und loeschen.\n";
       cout<<"Tippe \"HELP\" um Hilfe zu bekommen\n";
anfang2:
       string user;
       cin>>user;
       if (user=="exit" or user=="EXIT")
       {
                        cout<<"Sie haben das Programm beendet\n";
                        cout<<"Druecken sie eine Taste um das Fenster zu schliessen\n";
                        goto ende;
       }
       if (user=="help" or user=="HELP")
       {
                        cout<<"Du hast HELP eingegeben.\n\n";
                        cout<<"Gebe \"SAVE\" ein um eine neue Notiz zu speichern\n";
                        cout<<"Gebe \"OPEN\" ein um deine Notizen zu sehen\n";
                        cout<<"Gebe \"EDIT\" ein um deine Notizen zu bearbeiten\n";
                        cout<<"gebe \"EXIT\" ein um das Programm zu beenden\n";
                        user="";
                        goto anfang2;
       }
       if (user=="save" or user=="SAVE")
       {
                        goto save;
       }
       else
       {
                        cout<<"Falsche Eingabe\n";
                        user="";
                        goto anfang2;
       }
       
//ARBEITSSCHRITTE
       
save:
     cout<<"Sie haben SAVE eingegeben\n";
     cout<<"Geben sie nun eine Notiz ein\n";
save2:
      string type;
      cin>>type;


ende:
     getch();
}

Der Compiler sagt:

Code:
60  jump to label `ende' 
22    from here 
51    crosses initialization of `std::string type' 
55  label 'ende' used before containing binding contour
 
durch goto wird eben die definition von type übersprungen, da man ja zu ende geht.
empfehlung: string type vor goto definieren.

PS: goto ist nicht der beste stil und führt zu Fehlern wie du siehst. mach lieber funktionen statt sprünge.
 
Oke danke für Hilfe.

P.s.: Das wurde mir schon einmal gesagt, mit goto und labels, wars bis jetzt aber irgendwie einfacher^^

Ich werd mich ma an Funktionen setzen^^

Aber warum bringt nachdem ich etwas eingegeben habe dieses Programm einen Problembericht? Also sobald ich in der Konsole etwas eingebe, kommt Problembericht und es schließt sich

Code:
#include<iostream>
#include<fstream>
#include<string>
#include"conio.h"
#include<cstdlib>

using namespace std;

string area(string use)
{
       if (use=="help")
       {
                       cout<<"Sie haben help eingegeben\n";
       }
       else
       {
                       cout<<"Sie haben nicht help eingegeben\n";
       }
}


int main()
{
    cout<<"Geben sie etwas ein\n";
    string user;
    cin>>user;
    area(user);
}


edit: habs, so muss es sein, oder? Zumindest geht es so:

Code:
#include<iostream>
#include<fstream>
#include<string>
#include"conio.h"
#include<cstdlib>

using namespace std;

string area(string use)
{
       string result;
       if (use=="help")
       {
                       result="Sie haben help eingegeben\n";
       }
       else
       {
                       result="Sie haben nicht help eingegeben\n";
       }
       return result;
}


int main()
{
    cout<<"Geben sie etwas ein\n";
    string user;
    cin>>user;
    string result2;
    result2=area(user);
    cout<<result2;
    getch();
}
 
Ich kenn mich nicht so viel mit C++ nur bissl mit C aus, so wuerd' ich's schreiben.

Code:
#include<iostream>
#include<fstream>
#include<string>
#include"conio.h"
#include<cstdlib>

using namespace std;

string area(string use)  {

       static string result;
       if (use == "help")  {
       /* variable result eigentlich nicht noetig zeichenkette kann gleich zureuck gegeben werden */
                       result = "Sie haben help eingegeben\n";
       }  else  {
                       result = "Sie haben nicht help eingegeben\n";
       }
       return result;
}

int main(void)
{
  string user;

  cout << "Geben sie etwas ein\n";
  cin >> user;

  cout << area(user);

  getch();

  return EXIT_SUCCESS;
}
 
Jup, gotos sind endlos langsam und koennen Speicherzugriffsfehler verursachen.

EDIT: Ach, ich seh' grad die continues (zum Anfang der Schleife springen) kannst d' weglassen, die sind noch von anderen Ideen uebrig geblieben.

Code:
#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <cstdlib>

using namespace std;

void hilfe_aufrufen(void) {

	cout << "Du hast HELP eingegeben.\n\n"
	     << "Gebe \"SAVE\" ein um eine neue Notiz zu speichern\n"
	     << "Gebe \"OPEN\" ein um deine Notizen zu sehen\n"
	     << "Gebe \"EDIT\" ein um deine Notizen zu bearbeiten\n"
	     << "Gebe \"EXIT\" ein um das Programm zu beenden\n\n";
}

int main(void)
{

  string user;

  cout << "Hallo! Ich bin ein Notizprogramm.\n"
       << "In mich kannst du alle deine Notizen speichern und loeschen.\n"
       << "Tippe \"HELP\" um Hilfe zu bekommen\n\n";

  while (1)
  {
	cout << " > ";
	cin >> user;

	if(user == "exit" || user == "EXIT") {

		cout << "Sie haben das Programm beendet\n"
		     << "Druecken sie eine Taste um das Fenster zu schliessen\n";
		     getch();
		break;

	} else  if(user == "help" || user == "HELP") {

			hilfe_aufrufen();
			continue;

	} else  if(user == "save" || user == "SAVE") {

				cout << "Sie haben SAVE eingegeben\n"
				     << "Geben sie nun eine Notiz ein\n";
				/* TODO: write a notice */
				continue;

	} else  cout << "Falsche Eingabe\n";
  }

  return EXIT_SUCCESS;
}
 
ja, habs mir jetzt endgültig abgewöhnt :D

Aber ich hänge jetzt an einer anderen Stelle:

Code:
#include<iostream>
#include<fstream>
#include<string>
#include"conio.h"
#include<cstdlib>

using namespace std;

//SAVE FUNKTION
void save()
{
       cout<<"Sie haben SAVE eingegeben\n";
       cout<<"Sie koennen nun eine Notiz eingeben,\n";
       cout<<"oder mit \"back\" ins MENU zurueck gehen\n";
       string notiz;
       getline (cin, notiz);
       ofstream fout ("owner.txt",ios::app);
       fout<<notiz;
       fout<<"\t\t\t";
       fout<<"Nich Erledigt\n";
       fout.close();
}

//OPEN FUNKTION

void open()
{
     ifstream fin ("owner.txt");
     string zeilen[1000];
     char line[200];
     int i = 0;
     fin.getline(line,200);
     while (!fin.eof())
     {
           cout<<line<<"\n";
           zeilen[i++] = line;
           fin.getline(line,200);
     }
     
}


//MAIN PROGRAMM
int main()
{
    cout<<"Hallo! Ich bin ein Notizprogramm\n";
    cout<<"Gib \"HELP\" ein um zu sehen, was du machen kannst\n";
    string user;
    while (user!="exit")
    {
          cin>>user;
          if (user=="exit" or user=="EXIT")
          {
                           cout<<"Sie haben das Programm beendet\n";
                           cout<<"Druecken sie eine Taste um das Fenster zu schliessen\n";
          }
          else if (user=="help" or user=="HELP")
          {
                        cout<<"Sie haben HELP eingegeben.\n\n";
                        cout<<"Gebe \"SAVE\" ein um eine neue Notiz zu speichern\n";
                        cout<<"Gebe \"OPEN\" ein um deine Notizen zu sehen\n";
                        cout<<"Gebe \"EDIT\" ein um deine Notizen zu bearbeiten\n";
                        cout<<"gebe \"EXIT\" ein um das Programm zu beenden\n";
          }
          else if (user=="save" or user=="SAVE")
          {
                  save();
          }
          else if (user=="open" or user=="OPEN")
          {
                                open();
          }
          else
          {
                           cout<<"Sie haben sich vertippt\n";
          }
    }

getch(); 
}


Ich bin jetzt so weit, und das Problem liegt jetzt hier:

Code:
//SAVE FUNKTION
void save()
{
       cout<<"Sie haben SAVE eingegeben\n";
       cout<<"Sie koennen nun eine Notiz eingeben,\n";
       cout<<"oder mit \"back\" ins MENU zurueck gehen\n";
       string notiz;
       getline (cin, notiz);
       ofstream fout ("owner.txt");
       fout<<notiz;
       fout.close();
}


Er lässt mich in notiz nichts eingeben, er springt einfach wieder in die main Funktion zurück, wenn ich es nur mit cin mache, also so:

Code:
//SAVE FUNKTION
void save()
{
       cout<<"Sie haben SAVE eingegeben\n";
       cout<<"Sie koennen nun eine Notiz eingeben,\n";
       cout<<"oder mit \"back\" ins MENU zurueck gehen\n";
       string notiz;
       cin>>notiz;
       ofstream fout ("owner.txt");
       fout<<notiz;
       fout.close();
}


Dann geht zwar alles einwandfrei. Aber wenn ich es so nutze, kann er ja nur ein Wort speichern, und nicht einen vollständigen Satz.

Was mache ich falsch?
 
gotos sind zwar wirklich schlechter stil und in c++ fast ein tabu aber sind keinstenfalls unpraktisch.

richtig eingesetzt sind sprünge ne nette sache und im asm code hinterher wird eh gesprungen^^
 
Zurück
Oben