PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [c++] 2dimensionale arrays initialisieren


amida maru
2007-01-30, 18:24:09
Guten Abend. Also ich wollte mal ein Programm zur Übung mit mehrdimensionalen arrays schreiben. Ich will ein Spielfeld machen.
z.b.:
char feld[5][5];
wie kann ich machen das alle werte von dem array das zeichen X erhalten? und dann ausgeben?

Danke im vorraus

MfG
amidamaru

DR.DEATH
2007-01-30, 18:38:17
Tipp: Du brauchst 2 ineinander geschachtelte Schleifen.

rotalever
2007-01-30, 18:47:09
int i,j;
char feld[5][5];

for (i=0;i<5;i+=1) {
for (j=0;j<5;j+=1) {
feld[i][j] = 'x';
}
}

Ausgeben geht so ähnlich!

amida maru
2007-01-30, 18:48:53
so ungefähr?


#include <iostream>
using namespace std;



void ausgeben();//ignorieren


int main()
{
//Variablen Deklarieren
bool belegt; //ignorieren^^
const int x = 5;
const int y = 5;
int spielfeld[x][y]; //array deklaration

for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
spielfeld[i][j]; // array x und y sollen den Wert von 0-5 erhalten
}
}



cout <<spielfeld[3][3]<<endl;


return NULL;
}



also irgendwie funzt das ja nicht

rotalever
2007-01-30, 18:52:21
spielfeld[i][j]; // array x und y sollen den Wert von 0-5 erhalten

wenn du einen Wert speichern, willst musst du eine Zuweisung schreiben. Z.B. spielfeld[i][j] = 3;
oder
spielfeld[i][j] = i;
oder
spielfeld[i][j] = j;

Ob die Ausgabe so korrekt ist, weiß ich nicht, da ich mich mit C++ nicht auskenne...

amida maru
2007-01-30, 19:16:08
hmm kann ich jetzt nicht das Feld voller X machen muss ich die alle selber manuell deklarieren?

nebenbei:
so schaut einer aus wenn er im assemblercode ein fehler hat :D
http://www.rofl.name/owned/owned_strangemouth.jpg

hmm wenn ich machen will das es ein Rechteck wird was muss ich dann machen?
also so:
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX

patermatrix
2007-01-30, 19:22:51
hmm kann ich jetzt nicht das Feld voller X machen muss ich die alle selber manuell deklarieren?
Sieh dir nochmals Post #3 an.

nebenbei:
so schaut einer aus wenn er im assemblercode ein fehler hat :D
http://www.rofl.name/owned/owned_strangemouth.jpg
Unlustig.

pestolicious
2007-01-30, 19:23:17
einfach spielfeld[i][j] = 'X'

IceLord
2007-01-30, 19:23:36
Man kann doch auch direkt bei der Deklaration Werte initialisieren.
char feld[5][5] = {{x,x,x,x,x}, {x,x,x,x,x}, {x,x,x,x,x}, {x,x,x,x,x}};

Marscel
2007-01-30, 19:25:49
Ist nicht memset() das einfachste dafür?

Ich hab mal gelernt, dass wenn man alle Felder auf einen Wert in einer bestimmten Reichweite haben will, memset() nutzen soll.

pestolicious
2007-01-30, 19:25:52
wenn du die x noch in 'x' änderts gehts, aber auch nicht wenn die felder dynamisch sind...

Gast
2007-01-30, 19:26:45
Ist nicht memset() das einfachste dafür?

Ich hab mal gelernt, dass wenn man alle Felder auf einen Wert in einer bestimmten Reichweite haben will, memset() nutzen soll.

dazu muss man das array eindimensional machen

Eruphus
2007-01-30, 19:33:50
Ich würde generell nicht auf die schleifen setzen, dass bräuchte mir zu lange...
eher sowas :

#include <iostream>
#include <memory.h>
using namespace std;



void ausgeben();//ignorieren


int main()
{
//Variablen Deklarieren
bool belegt; //ignorieren^^
const int x = 5;
const int y = 5;
int spielfeld[x][y]; //array deklaration


memset(spielfeld, (int)'X', sizeof(int) * x *y);

cout <<spielfeld[3][3]<<endl;


return NULL;
}

dazu muss man das array eindimensional machen

Nein, ein mehrdimensionales Array wird vom compiler als Pseudo Array in ein eindimensionales "entfaltet".
gucksu :


#include <iostream>

using namespace std;
#define MAX_ROWS 2
#define MAX_COLS 2

int main() {
char c[ MAX_ROWS ][ MAX_COLS ] = { { 'a', 'b' }, { 'c', 'd' } };
for ( int i = 0; i < MAX_ROWS; i++ )
for ( int j = 0; j < MAX_COLS; j++ )
cout << c[ i ][ j ] << endl;

for ( int i = 0; i < MAX_ROWS*MAX_COLS; i++ )
cout << ((char*)c)[ i ] << endl;

}

Entnommen und erweitert aus M$ MSDN
C++ Language Reference
Subscript Operator: []


Ist nicht memset() das einfachste dafür?

Ich hab mal gelernt, dass wenn man alle Felder auf einen Wert in einer bestimmten Reichweite haben will, memset() nutzen soll.

Sorry Marcel; ich hatte deinen ersten Post überlesen und möchte dich hier nicht einfach so übergehen :biggrin:

Marscel
2007-01-30, 19:40:36
dazu muss man das array eindimensional machen

Da sagt mein Testprogramm aber was anderes...

Gast
2007-01-30, 19:54:13
mach mal ein 2d-array dynamisch mit new und zeigs mir nochmal

Eruphus
2007-01-30, 19:55:48
Einen Fehler gibt es da noch :

memset (void *, const int, size) schreibt einen Byte pattern.

Und da "amida maru" sein Spielfeld als int Matrize definiert hat, wird in diesem Fall

0x5858, 0x5858, .... in die Speicherzellen und nicht
0x0058, 0x0058, ....

Das lässt sich einfach lösen, indem man den typen des spielfelds auf "unsigned char" ändert.

amida maru
2007-01-30, 19:59:34
ich will einfach nur ein Feld...Ist das zuviel verlangt?
Es soll am bildschirm einfach nur folgendes rauskommen:
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
also 5X höhe und 5X breite....

rotalever
2007-01-30, 20:06:28
Dann mach es so wie in meinem 1. Post, und dupliziere den schleifenblock, und schreibt statt der zuweisung {ZEICHENAUSGEBEN feld[i][j]} hin und nach der inneren Schleife gibts du jeweils ein '\n' aus. Ich hoffe das klappt so in C++.

C Syntax wäre das Program so, c++ sollte ähnlich sein:

int i,j;
char feld[5][5];
//init
for (i=0;i<5;i+=1) {
for (j=0;j<5;j+=1) {
feld[i][j] = 'x';
}
}
//ausgabe
for (i=0;i<5;i+=1) {
for (j=0;j<5;j+=1) {
printf("%c ",feld[i][j]);
}
printf("\n");
}



Anmerkung: Zumindest im Visual C++ kompiliert das einwandfrei und ja, es wird x x x x x statt xxxxx gedruckt, das ist Absicht...

Eruphus
2007-01-30, 20:08:18
mach mal ein 2d-array dynamisch mit new und zeigs mir nochmal


#include <iostream>

using namespace std;
#define MAX_ROWS 2
#define MAX_COLS 2

#define MAX_ROWS_NEW 5

int main() {
UINT iterator = 0;
char (*pchar)[MAX_COLS] = new char[MAX_ROWS][MAX_COLS];

do {
((char*)pchar)[iterator] = 'a' +iterator;
} while (++iterator < MAX_ROWS*MAX_COLS);

for ( int i = 0; i < MAX_ROWS; i++ )
for ( int j = 0; j < MAX_COLS; j++ )
cout << pchar[ i ][ j ] << endl;

delete [] pchar;

pchar = new char[MAX_ROWS_NEW][MAX_COLS];

iterator = 0;
do {
((char*)pchar)[iterator] = 'a' +iterator;
} while (++iterator < MAX_ROWS_NEW*MAX_COLS);

for ( int i = 0; i < MAX_ROWS_NEW; i++ )
for ( int j = 0; j < MAX_COLS; j++ )
cout << pchar[ i ][ j ] << endl;
}

Bitteschön

rotalever
2007-01-31, 14:01:11
Hat es denn jetzt wenigsten funktioniert?

amida maru
2007-02-01, 17:47:24
jop hab ne lösung gefunden danke