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.

Speicherzugriffsfehler bei dynamischen Array

Empfohlene Antworten

Veröffentlicht

Hallo,

Ich benötige für ein Tabellenprogramm mehrere QTableWidgetItems in einem 2-Dimensionalen Array, wobei die erste Dimension nicht festgelegt ist. Ich habe dazu in der Header-Datei folgendes deklariert:

QTableWidgetItem *items[][5];
Später werden die benötigten items in zwei for-Schleifen erzeugt und dem TableWidget zugeordnet:
items[i1][i2] = new QTableWidgetItem;

TableWidget1->setItem( i2, i1, items[i1][i2] );
Leider erhalte ich dabei immer einen Speicherzugriffsfehler beim Starten unter Linux. Wenn ich in der Header-Datei die größe des Arrays festlege, funktioniert es, nur ist das natürlich nicht Sinn der Sache. Hier der Quellcode, das Relevante spielt sich in MainWindow.cpp und MainWindow.h ab. main.cpp MainWindow.h MainWindow.cpp FindDialog.h FindDialog.cpp Wahrscheinlich gibt es ein Problem mit dieser Funktion:
void MainWindow::createTable(){


	int i1, i2;


	twidget1 = new QTableWidget( 5, 5, this );


	QStringList horizontal;

	horizontal << "A" << "B" << "C" << "D" << "E";


	twidget1->setHorizontalHeaderLabels( horizontal );

	twidget1->setSortingEnabled( TRUE );



	for( i1=0; i1<=4; i1++ ){

		for( i2=0; i2<=4; i2++ ){


			items[i1][i2] = new QTableWidgetItem;

			items[i1][i2]->setText( "foo" );

			twidget1->setItem( i2, i1, items[i1][i2] );

		}

	}


	this->setCentralWidget( twidget1 );


}

Danke im Voraus.

QTableWidgetItem *items[][5];
Laut Standard ist das ein unvollständiger Typ. Viele Compiler bieten allerdings eine Erweiterung, die diese Deklaration als Array der Größe 0 interpretieren, wenn es Member eine Klasse oder Struktur ist. Das sollte aber eigentlich nur dann funktionieren, wenn dieses Array der letzte Member ist.

Wie auch immer, diese Deklaration bedeutet nicht, dass du hier ein dynamisches Array hast, das sich bei Bedarf selbst anlegt oder gar automatisch vergrößert.

Das musst du entweder von Hand machen, oder einen geeigneten Container benutzen.

Achso, ich hatte das von den Funktionsparametern übernommen, dort kann man einfach etwas wie array[][5] als Parameter nehmen. Da es der Compiler akzeptierte, ging ich davon aus, das könnte man als Member so wie beim Parameter nutzen.

Danke, ich habs umgeschrieben und jetzt geht's: (Als Beispiels ein 5x5-Array)

/* MainWindow.h */

QTableWidgetItem ***items;


/* MainWindow.cpp */

items = new QTableWidgetItem**[5];

for( i1=0; i1<=4; i1++ ){

    items[i1] = new QTableWidgetItem*[5];	

}

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

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.