C++ 2D-Array mit neuen Werten füllen (Hardcoded, keine Konsoleneingabe)

qupfer

Cadet 4th Year
Registriert
Apr. 2011
Beiträge
76
Hi,

ich habe ein Progrämmchen, wo ein Array mittels Konsoleneingabe gefüllt wird. Da ich für meine Verwendung jedoch ein relativ großes Array haben werde (wird dann voraussichtlich 22x22) und somit das eintippen mittels Konsole sehr aufwendig wird (zumal sich das Array für meine Verwendung nicht ändern wird, dachte ich mir die Füllung reinzuprogrammieren. Nur leichter gesagt, wenn man keine Ahnung hat.

Im Header habe ich
Code:
class Dijkstra{
    private:
		int adjMatrix[30][30];

Ich möchte die jetzt (teilweise) füllen, indem ich einfach die Zeilen abgebe, also gewissermaßen ähnlich der fehlerhaften Syntax:
Code:
	adjMatrix[6][6]=
                {
		{0,4,2,999,999,999},
		{4,0,1,5,999,999},
		{2,1,0,8,10,999},
		{999,5,8,0,2,6},
		{999,999,10,2,0,3},
		{999,999,999,6,3,0}
                };

Wie machte ich das am einfachsten?
 
Die Syntax sieht doch soweit richtig aus.
Ich würde mal behaupten, dass es aufgrund der Dimensionen nicht funktioniert.
 
qupfer schrieb:
Hi,

Wie machte ich das am einfachsten?

Du kannst auch initialisieren, wenn die Matrix nicht
vollständig gefüllt wird:
Code:
int adjMatrix[22][22] = {
  {0,4,2,999,999,999},
  {4,0,1,5,999,999},
  {2,1,0,8,10,999},
  {999,5,8,0,2,6},
  {999,999,10,2,0,3},
  {999,999,999,6,3,0}
};

Ansonsten, wenn die Daten später eingefügt werden sollen, so:

Code:
#include <cstring>

#define N_ROWS 22
#define N_COLS N_ROWS

int MeineDaten[N_ROWS][N_COLS] = {
  {0,4,2,999,999,999},
  {4,0,1,5,999,999},
  {2,1,0,8,10,999},
  {999,5,8,0,2,6},
  {999,999,10,2,0,3},
  {999,999,999,6,3,0}
};

class Dijkstra {
private:
   int adjMatrix[N_ROWS][N_COLS];

   // ...

   void setup_matrix() {  memmove(adjMatrix, MeineDaten, sizeof(adjMatrix)); }
};
 
Danke mit einen einfachen "int" davor klappt es. Ich dachte, das darf ich nicht, weil das Array ja schon als int deklariert ist.

Interessanterweise ist das Array dann korrekt "gefüllt", aber der Rest funktioniert nicht mehr korrekt. Der Dijkstra findet dann keinen Pfad mehr. Mal schauen, woran das liegen könnte. Aber das ist wie gesagt ein anderes Problem. Das mit dem Array funktioniert nun. Danke
 
qupfer schrieb:
Interessanterweise ist das Array dann korrekt "gefüllt", aber der Rest funktioniert nicht mehr korrekt. Der Dijkstra findet dann keinen Pfad mehr. Mal schauen, woran das liegen könnte.

Du hast ein zweites Array mit dem selben Namen erzeugt, aber Dein Algorithmus benötigt das erste Array, in welchem keine Daten sind.
 
probier mal folgendes zum füllen des Array

Code:
adjMatrix = {{0,4,2,999,999,999},
		     {4,0,1,5,999,999},
		     {2,1,0,8,10,999},
		     {999,5,8,0,2,6},
		     {999,999,10,2,0,3},
		     {999,999,999,6,3,0}};

Den wie blöderidiot schon sagte deklarierst du sonst zweimal.

Deine erste Variante mit adjMatrix[6][6] funktioniert nicht, da du hier auf eine Zelle verweist, aber Tupel zuweisen möchtest.
Achja und du solltest die Restlichen werte eigentlich auch initialisieren, den nicht initialisierte Werte sind immer unschön, vor allem wenn man später debuggen muss/möchte
 
Also, wenn die Daten in deiner Matrix sich wirklich nie verändern, dann kannst du sie ja const und static machen. Mit static bewirkst du, daß sich sämtliche Instanzen deiner Dijkstra-Klasse die selbe Matrix teilen, was ja ok ist, wenn die Daten so wie so konstant sind. In diesem Falle kannst du dann folgende Syntax anwenden (ich habe der Einfachheit halber mal die Größe der Matrix reduziert):

Code:
#include <iostream>

class Dijkstra
{
public:
	static void printMatrix( std::ostream& toHere )
	{
		for ( std::size_t i = 0; i < 4; ++i )
		{
			for ( std::size_t k = 0; k < 4; ++k )
			{
				toHere << adjMatrix[ i ][ k ] << " ";
			}

			toHere << "\n";
		}
	}

private:
	static const int adjMatrix[ 4 ][ 4 ];
};

const int Dijkstra::adjMatrix[ 4 ][ 4 ] = {
	{ 0, 1 , 2, 3, },
	{ 4, 5 , 6, 7, },
	{ 8, 9 , 10, 11, },
	{ 12, 13 , 14, 3, }
};

int main()
{
	Dijkstra::printMatrix( std::cout );
}

Das geht allerdings nur, wenn die Matrix static sein darf. Brauchst du wirklich eine Matrix pro Dijkstra-Instanz, dann kann adjMatrix nicht static sein, und du mußt die Matrix stattdessen über den Konstruktor von Dijkstra befüllen. Es ist möglich, daß die neue Initialisierungslisten-Syntax in C++11 es dir erlaubt, hier eine ähnliche Syntax anzuwenden, aber C++11 habe ich leider noch nicht so ganz verinnerlicht.
Ergänzung ()

Aha, wer sucht, der findet! :)

http://www.informit.com/articles/article.aspx?p=1852519

C++11 class member initializers are mostly a matter of convenience. They provide an overt and simplified form of initializing data members. But class member initializers also let you perform a few tricks that have hitherto been impossible. For example, you can use a class member initializer to initialize a member array:

class C
{
int y[5] {1,2,3,4};
public:
C();
};
 
Zurück
Oben