Problem mit Array



  • Hallo;

    habe heute mit dem Thema Arrays angefangen und bin da jetzt am Üben!

    #include <iostream.h>
    
    int eigabe(int Teilnehmer, int i, int Startnummer[])
    {
     i = 0;
     cout << "Wie viele Laeufer haben teilgenommen: ";
     cin  >> Teilnehmer;
     for (i=0; i < Teilnehmer; i++)
     {
      cout << "Startnummer des Teilnehmers eigeben: ";
      cin  >> Startnummer[Teilnehmer];
     }
    }
    
    int ausgabe(int Teilnehmer, int i, int Startnummer[])
    {
      for (i=0; i < Teilnehmer; i++)
     {
      cout << Startnummer[Teilnehmer];
     }
     getchar();
    }
    
    int main()
    {
     int Teilnehmer, i;
     int *Startnummer;
     string *Namen;
     int *gZeit;
     eigabe(Teilnehmer, i, Startnummer);
     ausgabe(Teilnehmer, i, Startnummer);
     Startnummer = new int [Teilnehmer];
    
     getchar();
     return 0;
    }
    

    Wo ist da mein Fehler ?

    LG David


  • Mod

    Davidlocke13 schrieb:

    Wo ist da mein Fehler ?

    Bei der Wahl deines Lehrbuchs. Offensichtlich aus prähistorischen Zeiten (iostream.h gibt es seit über 15 Jahren nicht mehr!) und voller C/C++-Mischmasch.

    Gute, aktuelle Bücher findest du, wenn du den Links in meiner Signatur folgst. Dies ist ganz offensichtlich nicht empfehlenswert und sollte schleunigst entsorgt werden. Was ist das für ein Buch?



  • In Zeile 32 erzeugst du dein Array, brauchst es aber bereits in Zeile 30, dort uebergibst du es ja an die Methode.
    Du musst dein Array erzeugen bevor du es brauchst 😉

    *Edit
    Aber da hats noch mehr Fehler drin.



  • Wenn ich das Array vorher erzeuge geht die Konsole gleich wieder zu !

    Ich verwende da so ein billig geschriebenes Programm, was ich aus der Berufsschule hab, deshalb #include <iostream.h> !

    Übrigens danke für den Buch Tipp 😉



  • Davidlocke13 schrieb:

    Wenn ich das Array vorher erzeuge geht die Konsole gleich wieder zu !

    Kein Wunder:
    Du erzeugst dann ein Wert der Größe teilnehmer. Wie groß ist teilnehmer.



  • Na das soll ja vom Benutzer eingegeben werden



  • Davidlocke13 schrieb:

    habe heute mit dem Thema Arrays angefangen und bin da jetzt am Üben!

    #include <iostream.h>
    
    int eigabe(int Teilnehmer, int i, int Startnummer[])
    {
     i = 0;
     cout << "Wie viele Laeufer haben teilgenommen: ";
     cin  >> Teilnehmer;
     for (i=0; i < Teilnehmer; i++)
     {
      cout << "Startnummer des Teilnehmers eigeben: ";
      cin  >> Startnummer[Teilnehmer];
     }
    }
    
    int ausgabe(int Teilnehmer, int i, int Startnummer[])
    {
      for (i=0; i < Teilnehmer; i++)
     {
      cout << Startnummer[Teilnehmer];
     }
     getchar();
    }
    
    int main()
    {
     int Teilnehmer, i;
     int *Startnummer;
     string *Namen;
     int *gZeit;
     eigabe(Teilnehmer, i, Startnummer);
     ausgabe(Teilnehmer, i, Startnummer);
     Startnummer = new int [Teilnehmer];
    
     
     getchar();
     return 0;
    }
    

    Wo ist da mein Fehler ?

    Hmm, da sind so viele Fehler. Anstatt direkt auf dein Progrämmchen einzugehen, zeig ich dir lieber, wie man es gleich besser machen kann:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    vector<unsigned> eingabe()
    {
    	cout << "Wie viele Laeufer haben teilgenommen: ";
    	unsigned teilnehmer;
    	cin >> teilnehmer;
    
    	vector<unsigned> startnummern( teilnehmer );
    	for(unsigned i=0; i!=teilnehmer; ++i)
    	{
    		cout << "Startnummer des " << i+1 << ". Teilnehmers eingeben: ";
    		cin  >> startnummern[i];
    	}
    	return startnummern;
    }
    
    void ausgabe( const vector<unsigned>& startnummern )
    {
    	for(unsigned i=0; i!=startnummern.size(); ++i)
    		cout << "Die Startnummer des " << i+1 << ". Teilnehmers lautet: " << startnummern[i] << '\n';
    }
    
    int main()
    {
    	ausgabe( eingabe() );
    
    	// Anscheinend willst du hier warten
    	cin.ignore(100,'\n');
    	cin.get();
    }
    

    Versuch mal alles, das du nicht verstehst, zu googeln. Und dann kommentiere das Programm, und poste deine Kommentare.



  • Davidlocke13 schrieb:

    Na das soll ja vom Benutzer eingegeben werden

    Nein, ich meine:
    Welchen Wert hat teilnehmer, wenn du das Array direkt in Zeile 27 erzeugst?
    Aber, wie out schon sagte, da sind so viele Fehler drin, du solltest dir ein gutes Buch anschauen.
    Für jetzt kannst du mal versuchen ein lauffähiges Programm zu schreiben ohne Funktionen zu verwenden, da ist das einfacher.



  • #include <vector> habe ich noch nicht gehabt!
    Ich soll für das Programm nur Sachen verwenden die ich schon hatte.

    Es soll eine Funktion für die Eingabe, Ausgabe und später auch noch für die Sortierung der Werte haben.

    Und vom Benutzer soll festgelegt werden wie viel werte er eingibt, deshalb soll ich ein Dynamisches Array verwenden!



  • Davidlocke13 schrieb:

    #include <vector> habe ich noch nicht gehabt!
    Ich soll für das Programm nur Sachen verwenden die ich schon hatte.

    Es soll eine Funktion für die Eingabe, Ausgabe und später auch noch für die Sortierung der Werte haben.

    Und vom Benutzer soll festgelegt werden wie viel werte er eingibt, deshalb soll ich ein Dynamisches Array verwenden!

    Ist ja alles schön und gut.
    Aber schreib erst einmal ein Programm ohne Funktionen, dann ist schon über die Hälfte der Fehler weg.
    Wenn das Programm läuft, zeigst du uns den Sourcecode und versuchst das mit den Funktionen dann nochmal.



  • #include <iostream>
    using namespace std;
    int main()   
    { 
     int Teilnehmer, i;
     int *Startnummer;
     string *Namen;
     cout << "Wie viele Laeufer haben teilgenommen: ";
     cin  >> Teilnehmer;
     Startnummer = new int [Teilnehmer];
     for (i=0; i < Teilnehmer; i++)
     {
      cout << "Startnummer: ";
      cin  >> Startnummer[i];
      cout << "Name: ";
      cin  >> Namen[i];
     }
     for (i=0; i < Teilnehmer; i++)
     {
      cout << "Startnummer des Teilnehmers : " << Startnummer[i] << endl;
      cout << "Name des Teilnehmers : " << Namen[i] << endl;
     }
      getchar();
      return 0; 
    }
    

    Jetzt stürzt es nach der 1. Eingabe ab !



  • Dein Array für die Namen hast du ja auch noch nicht erzeugt.
    Evtl. solltest du die Arrays für Startnummern und Namen zum Schluß auch wieder löschen.



  • Jo stimmt ! Jetzt habe ich aber echt ein Brett vorm Kopf !



  • hmm nunja da du auf "Namen" mit dem index operator zugreifst, muss man annehmen, dass die teilnehmer alle nur einen namen mit der länge von einem buchstaben haben.

    und wenn du versuchst einen zeiger zu dereferenzieren ohne ihn vorhin auf einen reservierten speicherbereich zeigen zu lassen, hast du zu 99.9999% access violation.



  • weitere kritikpunkte (sorry für doppelpost, wtb edit funktion):

    erstell instanzen immer erst wenn du sie benötigst und dann so lokal wie möglich.

    wenn du mit new arbeitest, musst du den speicher auch wieder freigeben.

    arbeite nicht mit new. manuelle speicherverwaltung ist unnötig aufwendig.

    weisst du überhaupt was std::endl macht oder übernimmst du es einfach stumpf?



  • Davidlocke13 schrieb:

    #include <vector> habe ich noch nicht gehabt!
    Ich soll für das Programm nur Sachen verwenden die ich schon hatte.

    Hattet Ihr schon 'struct'? Falls ja, solltest Du das hier in jedem Fall nutzen.
    Es macht IMHO wenig Sinn new zu lernen und struct nicht zu kennnen.



  • endl sagt doch das selbe wie \n und sorgt für ein Zeilenumbruch.

    struct hatte ich auch noch nicht.



  • Schade, dass du kein gutes C++ machen darfst. Naja, denn musst du es wohl so machen:

    int main()
    {
    	cout << "Wie viele Laeufer haben teilgenommen: ";
    	int Teilnehmer;
    	cin >> Teilnehmer;
    
    	string* Namen     = new string[Teilnehmer];
    	int* Startnummern = new int[Teilnehmer];
    
    	for(int i=0; i<Teilnehmer; ++i)
    	{
    		cout << "Startnummer: ";
    		cin  >> Startnummern[i];
    		cout << "Name: ";
    		cin  >> Namen[i];
    	}
    
    	for(int i=0; i<Teilnehmer; ++i)
    	{
    		cout << "Startnummer des Teilnehmers: " << Startnummern[i] << endl;
    		cout << "Name des Teilnehmers       : " << Namen[i]        << endl;
    	}
    
    	// Aufräumen
    	delete[] Namen;
    	delete[] Startnummern;
    
    	// Warten
    	cin.ignore(100,'\n'); // Sonst wird das mit dem Warten nichts.
    	getchar();
    
    	// Ende - return 0 wird bei der main übrigens automatisch gemacht. Musst du also nicht extra hinschreiben.
    	return 0;
    }
    

    Und nun versuch das Ganze mal in Funktionen auszulagern und den Quellcode zu kommentieren.



  • Davidlocke13 schrieb:

    endl sagt doch das selbe wie \n und sorgt für ein Zeilenumbruch.

    Eben nicht. (Mach dir nichts draus, das denken viele)


  • Mod

    Davidlocke13 schrieb:

    endl sagt doch das selbe wie \n und sorgt für ein Zeilenumbruch.

    Nein. Es ist ein Zeilenumbruch mit anschließendem flush (das heißt die Ausgabe wird mit dem tatsächlichen physischem Ausgabemedium synchronisiert). Das ist sehr oft nicht das, was man möchte, da dies normalerweise eine sehr aufwändige Operation ist. Bei Bildschirmausgaben ist es noch recht egal, da diese in der Regel ohnehin mit jedem Zeilenumbruch synchronisiert werden, aber bei Dateien (und man kann nie wissen, ob cout nicht vielleicht in eine Datei führt) ist das ein riesiger Performancekiller.

    Also endl nur benutzen, wenn man wirklich flushen möchte. Was für Anfänger so gut wie nie sein sollte. Nicht einmal vor Benutzereingaben, wie man denken könnte (damit eine vorherige Frage auch auf dem Bidschirm erscheint): Da cin und cout ge-tie-ed sind, wird cout automatisch geflusht, bevor auf cin eine Eingabeoperation durchgeführt wird.


Log in to reply