Frage

Ich bin eine Simulation für die Klasse zu schreiben, und einen Teil davon betrifft die Wiedergabe von Organismen. Meine Organismen sind in einer Anordnung gehalten, und ich brauche die Größe des Arrays zu erhöhen, wenn sie sich vermehren. Da ich mehrere Klassen für mehrere Organismen haben, habe ich eine Vorlage:

template <class orgType>
void expandarray(orgType* oldarray, int& numitems, int reproductioncount)
{
    orgType *newarray = new orgType[numitems+reproductioncount];

    for (int i=0; i<numitems; i++) {
        newarray[i] = oldarray[i];
    }

    numitems += reproductioncount;

    delete[] oldarray;
    oldarray = newarray;
    newarray = NULL;
}

Allerdings scheint diese Vorlage irgendwie werden meine Daten korrumpieren. Ich kann das Programm gut ohne Wiedergabe ausführen (kommentiert die Anrufe expandarray out), aber dem Aufruf dieser Funktion bewirkt, dass mein Programm zum Absturz bringen. Das Programm nicht während der expandarray Funktion zum Absturz bringen, sondern stürzt auf Zugriffsverletzung später.

Ich habe Funktionen geschrieben ein Array mehrere hundert Mal zu erweitern, und ich habe keine Ahnung, was ich diesmal vermasselt. Gibt es etwas in meiner Funktion eklatant falsch? Sieht es richtig für Sie?

EDIT: Vielen Dank für die Hilfe aller. Ich kann nicht glauben, dass ich etwas so offensichtlich verfehlt. Als Reaktion auf std::vector mit: Wir haben diskutierten es nicht in der Klasse noch nicht, und so dumm, wie es scheint, muß ich schreiben Code, um die Methoden uns gelehrt haben

.
War es hilfreich?

Lösung

Sie müssen als Referenz zu übergeben oldarray: orgType *& oldarray. Die Art und Weise es zur Zeit geschrieben, wird die Funktion des Anrufers Array löschen, aber es wird nicht die neu zugewiesenen einen geben, den Absturz verursacht.

Noch besser wäre es, die Verwendung std::vector anstatt es zu Neuimplementierung.

Andere Tipps

Die Standardbibliothek C ++ hat bereits Funktionalität geschrieben, dies zu tun.

Mit dem std::vector Container.

Sieht aus wie Sie den Zeiger oldarray zu Punkt auf das neue Array modifizieren, aber in der Funktion erinnern, das nur eine Kopie ist und keinen Einfluss auf die Variable, die Sie in übergeben. Sie haben wahrscheinlich einen Verweis auf einen Zeiger, wenn Sie übergeben müssen will es auf diese Art und Weise zu tun.

Und in der Tat, std :: vector tut dies für Sie sowieso

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top