Programm bricht bei neuer Variable ab



  • Hallo Zusammen,

    ich hab da ein für mich unverständliches Problem mit einem Feld.
    Wenn ich

    int nummer
    int Alter_[nummer]
    string vorname_[nummer]
    string nachname_[nummer]

    bereitstellen lasse, und diese werte dann in einer schleife (in der 'nummer' gleich dem aktuellen schleifendurchlauf entspricht) jeweils einzeln beschreibe klappt alles noch.
    sobald ich aber zusätzlich 'string wohnort_[nummer]' einfüge, und da nun auch jeweils einen wert pro schleifendurchlauf zuordnen will, bricht das programm ab..

    woran kann das liegen?
    MfG



  • Was ist denn das? - bestimmt kein funktionsfähiger Quelltext.

    Kannst du mal etwas mehr Code posten, bei dem der Fehler auftritt?



  • #include <iostream>
    #include <stdio.h>

    using namespace std;

    int main()
    {

    int nummer;
    int schleife1;
    int schleife2;
    int zaehler;
    int schleifebeenden;
    int alter_[nummer];

    char abbrechen;

    string vorname_[nummer];
    string nachname_[nummer];

    zaehler=0;

    for(schleife1=0;schleife1<1000;schleife1=schleife1+1)
    {
    nummer=schleife1;

    cout << " Bitte Vornamen eingeben: ";
    cin >> vorname_[nummer];
    cout << "" << endl;

    cout << " Bitte Nachnamen eingeben: ";
    cin >> nachname_[nummer];
    cout << "" << endl;

    cout << " Bitte Alter eingeben: ";
    cin >> alter_[nummer];
    cout << "" << endl;

    zaehler=zaehler+1;

    cout << " Schleife abbrechen (j/n)? ";
    cin >> schleifebeenden;

    if(schleifebeenden='j')
    {
    schleife1=2000;
    }
    }

    nummer=0;

    for(schleife2=0;schleife2<zaehler;schleife2=schleife2+1)
    {

    nummer=schleife2;

    cout << " Vorname: " << vorname_[nummer];
    cout << "" << endl;

    cout << " Nachname: " << nachname_[nummer];
    cout << "" << endl;

    cout << " Alter: " << alter_[nummer];
    cout << "" << endl;

    }

    }



  • Sag mal, compiliert das wirklich? Wenn ja, was für einen Compiler verwendest du?

    a)

    int nummer;
    int alter_[nummer];
    

    erzeugt ein Array undefinierter Größe (da 'nummer' nicht initialisiert wurde)

    b)

    for(int schleife1=0;schleife1<1000;schleife1=schleife1+1) 
    { 
      nummer=schleife1; 
      //...
    }
    

    Also auf so eine Idee für die Schleifenkonstruktion muß man erst einmal kommen 😃
    (btw, die Schleife verlässt du am schnellsten mit "break")

    c)

    nummer=schleife1; 
    cout << " Bitte Vornamen eingeben: "; 
    cin >> vorname_[nummer];
    

    Selbst wenn die obige Konstruktion (siehe a) ein Array der variablen Größe 'nummer' anlegen würde, wäre das da eine Katastrophe, da die Indizes nur von 0 bis nummer-1 gültig sind.

    PS: Lern erstmal ordentlich C++ programmieren, bevor du dich über solche Fehler wunderst :xmas1:



  • ich sag es mal so:
    es klappt, und dass ich mich wundern kann liegt wohl eher daran, dass bei mir solche fehler auftreten können
    will heißen: stures programmieren wirst du gut können... und was soll das eigentlich, ich bin hier, um neues zu erfahren, nicht um zu erfahren, dass du ein angeber bist

    und das array hat zwar unbestimmte größe, wird aber nur mit einer bestimmten anzahl von bestandteilen gefüllt, was soll da verwerflich sein?

    das int in der schleife ist ein tippfehler, darfst ihn aber behalten



  • nosocks schrieb:

    ich sag es mal so:
    es klappt, und dass ich mich wundern kann liegt wohl eher daran, dass bei mir solche fehler auftreten können

    Was mich wundert, ist eher die Tatsache, daß es klappt bzw. compiliert wird (laut Standard dürfte das überhaupt nicht erlaubt sein - und wenn du dich nicht an den Standard hältst, kann alles passieren).

    will heißen: stures programmieren wirst du gut können... und was soll das eigentlich, ich bin hier, um neues zu erfahren, nicht um zu erfahren, dass du ein angeber bist

    Also beleidigen lasse ich mich schon gar nicht - wenn du also in der Schiene weitermachen willst, such dir eine andere Plattform.

    und das array hat zwar unbestimmte größe, wird aber nur mit einer bestimmten anzahl von bestandteilen gefüllt, was soll da verwerflich sein?

    Das Array hat eine unbestimmte Größe, aber die wird einmal bei der Definition festgelegt und ist dann konstant. Das heißt, du hast keine Ahnung, wieviel Platz du nun wirklich zur Verfügung hast
    Im günstigsten Fall schreibst du damit in Bereiche, die mit irgendwelchem Datenmüll belegt sind (oder dein Array ist zufällig groß genug für deine Zwecke), im ungünstigsten Fall zerlegst du dir deine eigenen Daten beim Versuch, über die Arraygrenzen hinauszuschreiben.

    Kleiner Tip: Wenn du wirklich die Größe zur Laufzeit ändern willst, nimm lieber std::vector.

    das int in der schleife ist ein tippfehler, darfst ihn aber behalten

    Was soll ich denn mit deinen Tipfehlern? (btw, das int war auch gar nicht das Problem bei der Konstruktion - vielmehr ist es imho unsinnig, den Schleifenindex parallel in zwei (*nachguckt* nein drei) Variablen mitzuschleifen.



  • Hallo,
    in c++ musst du wie in c oder java jeden speicher den du benützt vorher explizit anfordern. das geht entweder über ein

    int array[15]; // platz für 15 elemente von array[0] bis array[14]
    

    oder über ein

    int anzahl = 15;
    int *array = new int [anzahl];
    // mach irgnwas damit
    
    delete [] array; // wichtig: mit new angeforderter speicher muss freigegeben werden!
    

    die erste methode ist nur mit im voraus bekannter größe möglich, die zweite mit beliebiger. wenn du in jedem schleifendurchlauf ein feld mehr brauchst kannst du als einfache methode so machen:

    int *anzahl = new int [1];
    anzahl[0] = 0;
    for (int i = 1; i < 123; ++i)
    {
        int *tmp = new int [i+1]; // neues feld 1 grösser
        std::memcpy(anzahl, tmp, i*sizeof(int)); // rüberkopieren
        tmp[i] = neuerwert;
        delete [] anzahl; // altes array läöschen
        anzahl = tmp; // zeiger umbieten
    }
    

    in der faq und auch im forum "magazin" stehen ein paar gute einträge zum thema array und speicherverwaltung.

    ach ja: und bitte code-tags verwenden: sfds

    @cstoll: bitte ball flach halten, du bist nicht ganz unschuldig an der reaktion mit deinem ersten post



  • danke euch beiden, ich wollte ja wirklich nur eine antwort, umso besser dass ich gleich mehrere bekommen hab

    aber leider kann ich auch mit den verbesserungen keinen dritten string einbauen, wobei ich wieder beim anfangsproblem wäre



  • thx!

    ich hab einfach einmal 250 statt 1000 plätze bereitgestellt und nun klappt es (was ich trotzdem ein wenig verwunderlich finde)



  • zeig doch nochmal deinen ganzen code. vielleicht hast du noch einen fehler drin!



  • Solange du wirklich weißt, wieviel Platz du hast (und dich an dieses Wissen hältst), ist das alles kein Problem 😉 Problematisch wird dein Programm erst, wenn du dich nicht mehr an deine selbst vorgegebenen Grenzen hältst - das nennt sich dann "undefined behaviour" (im Klartext: Dein Programm kann machen, was es will, vom simplen Absturz bis zum Formatieren deiner Festplatte ;))

    Deswegen solltest du auch besser auf einen vector wechseln, der ist in der Lage, seine Elemente zu organisieren:

    struct Datensatz
    {
      string vorname,nachname;
      int alter;
    }
    
    vector<Datensatz> Daten;
    char ende='n';
    while(tolower(ende)!='j')
    {
      Datensatz d0;
      cout<<"Bitte Name angeben:";
      cin>>d0.vorname>>d0.nachname;
      cout<<"Bitte Alter angeben:";
      cin>>d0.alter;
      Daten.push_back(d0);
      cout<<"Noch ein Datensatz?";
      cin>>ende;
    }
    
    for(int i=0;i<Daten.size();++i)
      cout<<i+1<<". "<<Daten[i].vorname<<" "<<Daten[i].nachname<<" ("<<Daten[i].alter<<" Jahre)\n";
    


  • Vielen Dank!

    Klappt alles jetzt fehlerfrei! Werde nun auch generell solche Dinge mit Vektoren angehen.

    Und auf diesem Wege wünsch ich allen ein frohes Weihnachtsfest!


Anmelden zum Antworten