otacon Geschrieben 28. Dezember 2001 Geschrieben 28. Dezember 2001 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 Zitieren
Klotzkopp Geschrieben 28. Dezember 2001 Geschrieben 28. Dezember 2001 Du solltest erst die Struktur füllen und danach den Index inkrementieren. Zitieren
Dorothea Geschrieben 28. Dezember 2001 Geschrieben 28. Dezember 2001 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 Zitieren
Klotzkopp Geschrieben 29. Dezember 2001 Geschrieben 29. Dezember 2001 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. Zitieren
Dorothea Geschrieben 29. Dezember 2001 Geschrieben 29. Dezember 2001 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? Zitieren
Klotzkopp Geschrieben 29. Dezember 2001 Geschrieben 29. Dezember 2001 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. Zitieren
Dorothea Geschrieben 29. Dezember 2001 Geschrieben 29. Dezember 2001 oh, das ist ja echt peinlich. man sollte wirklich genauer lesen, bevor man irgendwas hier reinschreibt. Zitieren
BurdRe Geschrieben 2. Januar 2002 Geschrieben 2. Januar 2002 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 ! Zitieren
Crush Geschrieben 7. Januar 2002 Geschrieben 7. Januar 2002 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 Zitieren
vinc Geschrieben 14. Januar 2002 Geschrieben 14. Januar 2002 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!!! Zitieren
Empfohlene Beiträge
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.