Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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

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.
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?

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.

oh, das ist ja echt peinlich. man sollte wirklich genauer lesen, bevor man irgendwas hier reinschreibt. :(

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 !

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

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!!!

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.