Zum Inhalt springen

Anfängerfehler: dynamische Arrays


otacon

Empfohlene Beiträge

Hallo,

Entschuldigung für das lange Posting.

ich bin gerade dabei mir C++ beizubringen und jetzt bei dem Punkt "Dynamischer Speicher für Vektoren" angelangt. Zu Testzwecken habe ich hierfür nachfolgendes Programm geschrieben, bei dem ein Array im Programmablauf dynamisch vergrößert wird.

Als ich das ganze in ähnlicher Weise mit einem int-Array gemacht habe, hat alles bestens funktioniert. "Nur so zum Spaß" versuche ich nun schon seit Heiligabend ein struct-Array dynamisch zu vergrößern. Egal woran ich drehe, ich erhalte einen Fehlen in der Art: "Im Projekt xyz ist eine ExceptopnViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse XXXXXXXXXXXX'...".

Hier der Code (bzw. ein Versuch):

#include <iostream>

#include <iomanip>

#include <string>

using namespace std;

struct T_Anlage {

string strForm;

string strInstitut;

double dWert;

};

void main(void)

{

int iIndex=0, iSize=0, iStep=10, i;

T_Anlage *pAnlagen=NULL;

string strForm, strInstitut;

double dWert;

char cEnde='j';

do {

cout << left << setw(15) << "Anlageform:";

cin >> strForm;

cout << left << setw(15) << "Institut:";

cin >> strInstitut;

cout << left << setw(15) << "Wert:";

cin >> dWert;

if (iIndex >= iSize)

{

T_Anlage *pDummy=new T_Anlage [iSize+iStep];

for (i=0; i < iSize; i++)

pDummy=pAnlagen;

delete [] pAnlagen;

pAnlagen=pDummy;

iSize+=iStep;

}

cout << ">>> Weiteren Datensatz eingeben? ";

cin >> cEnde;

iIndex++;

pAnlagen[iIndex].strForm = strForm;

pAnlagen[iIndex].strInstitut = strInstitut;

pAnlagen[iIndex].dWert=dWert;

cout << iSize << iIndex << endl;

} while (cEnde=='j' || cEnde=='J');

delete [] pAnlagen;

}

DANKE!

Otacon

Link zu diesem Kommentar
Auf anderen Seiten teilen

hallo,

ich kenne mich zwar "nur" mit c recht gut aus, aber ich glaube, ich kann dir helfen.

du hast deine struktur pAnlagen mit NULL initialisiert, sie hat also keinen speicherplatz. wenn du später beim ersten durchlaufen der schleife sagst, pDummy[0] = pAnlagen[0], wird pDummy auch NULL. und wenn du darauf zugreifen willst, erhältst du die sattsam bekannte meldung "access violation at XXXX". ausserdem könnte ich mir vorstellen, dass der versuch, delete auf einen NULL-Zeiger anzuwenden, ebenfalls einen absturz verursacht.

ich hoffe, ich habe keinen mist verzapft

(war mein erster beitrag)

viel erfolg

Link zu diesem Kommentar
Auf anderen Seiten teilen

wenn du später beim ersten durchlaufen der schleife sagst, pDummy[0] = pAnlagen[0], wird pDummy auch NULL. und wenn du darauf zugreifen willst, erhältst du die sattsam bekannte meldung "access violation at XXXX".
Diese Schleife wird beim ersten Mal gar nicht durchlaufen, weil iSize 0 ist, und die Schleifenbedingung i<iSize lautet.

ausserdem könnte ich mir vorstellen, dass der versuch, delete auf einen NULL-Zeiger anzuwenden, ebenfalls einen absturz verursacht.
Nein, das ist kein Problem, ein delete auf einen NULL-Zeiger bewirkt gar nichts.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Diese Schleife wird beim ersten Mal gar nicht durchlaufen, weil iSize 0 ist, und die Schleifenbedingung i<iSize lautet.

ja, das hab ich übersehen.

aber das problem ist trotzdem dasselbe. wenn im unteren teil steht:

pAnlagen[iIndex].strForm = strForm;

kann das nicht gehen, da pAnlagen NULL ist. ich denke, für pAnlagen müsste vorher auch mit new speicher angefordert werden.

zu der for-schleife: wie kommt man jemals da rein, wenn iSize erst innerhalb dieser Schleife erhöht wird?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original geschrieben von Dorothea

aber das problem ist trotzdem dasselbe. wenn im unteren teil steht:

pAnlagen[iIndex].strForm = strForm;

kann das nicht gehen, da pAnlagen NULL ist. ich denke, für pAnlagen müsste vorher auch mit new speicher angefordert werden.

Wird ja auch. Der neu allokierte Speicher wird aber zuerst dem Zeiger pDummy zugewiesen, damit der bestehende Array kopiert werden kann.

zu der for-schleife: wie kommt man jemals da rein, wenn iSize erst innerhalb dieser Schleife erhöht wird?
Der Schleifenkörper besteht nur aus einer einzigen Anweisung:

pDummy=pAnlagen;

Der Rest des if-Blocks, und damit auch die Erhöhung von iSize, steht außerhalb der Schleife. Das for hat keine geschweiften Klammern, dadurch geht der Schleifenkörper nur bis zum nächsten Semikolon.

Link zu diesem Kommentar
Auf anderen Seiten teilen

struct T_Anlage {

string strForm;

string strInstitut;

double dWert; <-------------- hier willst du eine double Zahl haben !!!!!!!!

};

dein Programm stürzt nur ab wenn du als WERT einen String eingibts bzw einen anderen Datentyp als DOUBLE

konnte zunächst keinen Fehler entdecken und habs deshalb mal compiliert - und es lief prächtig !

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich finde da sind schon ein paar Fehlerchen drin, weshalb es mich wundert, warum nur der Double-Zugriff zu einem Fehler geführt haben soll. Aber nur wegen der Speicherfummelei: Man kann so immer den Überblick über vorhandene und nicht-releasede (gibt´s das Wort überhaupt?) Speicher-Allocs behalten.

Schreib oben rein:

#define new DEBUG_NEW

Dadurch wird überall wo new verwendet wird der Debug_new aufgerufen, der alle Speicheranforderungen protokolliert und bei Bedarf ausspuckt mit CMemoryState::DumpAllObjectsSince()

Außerdem sollte der Tracer, bzw. Debugger des Programmierers bester Freund werden, weil man ohne den meist nicht allzu weit bei harten Nüssen kommt! Damit würdest Du die meisten Fehler bestimmt gleich auf den ersten Blick finden.

Nur weil etwas scheinbar absturzfrei läuft ist es noch lange nicht fehlerfrei.

Fehler sind dazu da um gefunden zu werden! Aber wenn es nicht läuft und man nicht selber dahinter kommt ist einem ja nicht klar was da noch alles zusammenspielen kann. Wer fehlerfrei programmieren kann, der soll den ersten Stein werfen! Bei der Softwareentwicklung und -Planung sind Fehler eine statistisch erfaßte und einkalkulierte Konstante!!! Und die ist teilweise verdammt hoch. Ich frage mich warum die Chefs nicht die anzahl der Pro-Kopf-programmierten Zeilen durch die Fehlerquote des Programmierers teilen um so Boni zu verteilen. Gewinner ist der, der die Fehler am besten versteckt. (8-D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

Du solltest mal folgendes machen:

Erhöhe den iIndex erst nach der Zuweisung der Eingaben an die Struktur!

Ein Array der Größe x hat bekanntlich den Indexbereich 0 - (x-1). Da Du aber den Index vor der Zuweisung erhöhst sprichst du den Bereich 1 - x an. Index x ist nicht definiert! Also: Fehler!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...