PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Array Zuweisung ???


Einfachkrank
2002-10-13, 12:17:56
Hi,

ich hab ein klitze kleines Problem in C++ -> Ich möchte einem zweidimensionalen Array oder String einen kompletten Array zuweisen, ungefähr so:
float Matrix[2][3] = {..., ..., ..., ..., ..., ...};

typedef struct FIGUR
{
float Vertices[2][3];
float Position[3];
}FIGUR;

FIGUR Figur;

Figur.Vertices = Matrix;Ist es in der Art nicht möglich? Ich habe schon hin und her gebastelt, aber immer Fehlermeldungen bekommen wie "left value must be l-value" oder "cannon convert from const float to float[2][3]" ... ??? :eyes:

MFG Einfachkrank

Exxtreme
2002-10-13, 12:23:35
Arrays lassen sich in C nicht einfach so ohne Weiteres kopieren. Was meinst du warum es Funktionen ála strcpy gibt? Du wirst wohl oder übel jedes Element einzeln kopieren müssen. Am besten mach man es in einer for-Schleife:



float Array1[10]={1,2,3,4,5,6,7,8,9,10}, Array2[10];

for(int i=0;i<10;i++) {
Array2[i]=Array1[i];
}



Versuch's damit.

Gruß
Alex

Xmas
2002-10-13, 12:46:24
Jep, das ist so weil Arrays in C++ keine "wirklichen" Datentypen sind. Der Name eines Arrays entspricht einem Pointer auf das erste Element.
Einfach ist es natürlich, eine Klasse zu schreiben, die operator= (und evtl. auch operator[]) definiert.

Einfachkrank
2002-10-14, 14:54:00
Originally posted by Xmas
Einfach ist es natürlich, eine Klasse zu schreiben, die operator= (und evtl. auch operator[]) definiert.
Wie meinst du das jetzt? Ich komm nicht ganz mit :eyes:

Xmas
2002-10-14, 16:47:31
Originally posted by Einfachkrank

Wie meinst du das jetzt? Ich komm nicht ganz mit :eyes:
Nun, wenn du diese Art Array (float[2][3]) oft benötigst, dann sieht es vielleicht in deinem Code besser aus, eine Klasse dafür zu schreiben, die ein solches Array kapselt und das '=' Zeichen als Operator definiert.
Dann kannst du nämlich die Arrays so kopieren, wie du es in deinem Beispiel tust.

Einfachkrank
2002-10-14, 20:39:44
Originally posted by Xmas

Nun, wenn du diese Art Array (float[2][3]) oft benötigst, dann sieht es vielleicht in deinem Code besser aus, eine Klasse dafür zu schreiben, die ein solches Array kapselt und das '=' Zeichen als Operator definiert.
Dann kannst du nämlich die Arrays so kopieren, wie du es in deinem Beispiel tust.
Ja, das dachte ich mir auch schon dass du das so meinst, aber wie mache ich das denn, dass ich eine eigene Klasse schreibe die das '=' als eigenen Operater in dem Fall verwendet? ??? ??? ??? Da bin ich jetzt total neben der Spur :eyes:

MFG Einfachkrank

Xmas
2002-10-15, 00:19:53
Na z.B. so (nicht getestet)


class Matrix23
{
public:
Matrix23( const Matrix23 & rhs ) { *this = rhs; }
Matrix23() {}
~Matrix23() {}

const Matrix23 & operator= ( const Matrix23 & rhs )
{
if( this != &rhs )
for( int i = 0; i < 6; i++)
((float*)m)[i] = ((float*)rhs.m)[i];
return *this;
}

float m[2][3];
};

bendel
2002-10-15, 12:18:05
Wenn beim Kopieren der Daten nichts weiter beachtet werden muss, dann reicht es ja, das Array in eine Stuktur zur legen. Diese hat dann ja gleich einen geeigneten '=' operator (ist ja sinnlos ihn zu ueberladen, wenn er doch nichts anderes macht).

Xmas
2002-10-15, 12:30:37
Stimmt. Ich hab mir aber angewöhnt alles was ich brauche explizit zu deklarieren. Dann vergisst man das nicht so schnell, wenn dynamische Speicherverwaltung ins Spiel kommt.

Demirug
2002-10-15, 12:32:43
Wobei zum kopieren der Daten würde ich eher einen memcpy benutzen.

Einfachkrank
2002-10-16, 15:59:07
Hi,

Also nur um einen zweidimensionalen Array zu kopieren, ist dass ein bisschen heftig für mich da ich auch noch nicht ganz so gut bin. Ich werde dann wohl entweder memcpy nehmen oder einfach in ner Schleife, das ging auch ganz gut. Aber trotzdem danke

MFG Einfachkrank

Exxtreme
2002-10-16, 19:35:02
Tja, das ist halt C. Wenn du noch nichts mit Pointern oder Zeigern zu tun gehabt hast, dann wünsche ich dir viel Spass. Nur relativ wenige Leute verstehen, wie Pointer funktionieren. Bei uns damals in der Schule sind ca. 3/4 der Leute in der Klasse beim Thema Pointer ausgestiegen.

Gruß
Alex

Einfachkrank
2002-10-17, 20:27:13
Hi,

also wenn man von normalem Umgang mit Pointern redet, dann hab ich damit auch schon jeden Tag zu tun gehabt. Benutze ja auch verkettete Listen und ähnliches, also von daher weiß ich schon wie die funktionieren. Nur eben nicht so komplex, und auch noch kein this- Pointer, von dem hab ich auch null Plan.

MFG Einfachkrank

Xmas
2002-10-17, 20:55:19
Besonders kompliziert ist das eigentlich nicht.

Und auch der this-Pointer ist simpel. Methoden kann man ja nur in Verbindung mit einer Instanz der Klasse aufrufen. Wenn man eine String-Klasse hat und eine Length()-Methode, so muss sich diese ja auf eine Instanz beziehen. Also z.B.

int laenge = DiesIstEinString.Length();

Innerhalb der Length-Methode ist dann der this-Pointer ein Pointer auf DiesIstEinString.

Unregistered
2002-11-16, 10:28:26
Wenn ich mich recht entsinne - aus meiner C-Time - dann sind Matrizen Pointer. Ausdrücke der Form A.b sind aber keine.
Deine Zuweisung müßte die Form A->b = M haben.

Wobei

float M[x][y] = { w1, w2, ...};

struct {
a ...
b ...
.
.
.
}A;

gilt.

Aber denke daran: Die Änderungen von A.b sind auch Änderungen von M!
Du überträgst ja nur die Adress-Daten. Also nach A->b = M gilt
&A.b = M. Soweit meine Erinnerungen.

Guß Metusalix

Xmas
2002-11-16, 20:11:56
Originally posted by Unregistered
Wenn ich mich recht entsinne - aus meiner C-Time - dann sind Matrizen Pointer. Ausdrücke der Form A.b sind aber keine.
Deine Zuweisung müßte die Form A->b = M haben.

Das stimmt nicht. Wenn der Typ von A eine Struktur mit dem Member b ist, dann ist der Ausdruck (A.b) genau das, als was b in der Strukturdeklaration definiert wurde.

struct { int * b; } A;
// bedeutet: (A.b) ist vom Typ (int *)

Die Form A->b macht nur dann Sinn wenn A ein Pointer auf eine Struktur mit einem Member b ist.



Wobei

float M[x][y] = { w1, w2, ...};

struct {
a ...
b ...
.
.
.
}A;

gilt.

Aber denke daran: Die Änderungen von A.b sind auch Änderungen von M!
Du überträgst ja nur die Adress-Daten. Also nach A->b = M gilt
&A.b = M. Soweit meine Erinnerungen.

Guß Metusalix
Zu -> und . siehe oben. Und er will ja offensichtlich das Array kopieren, nicht nur den Pointer. Da reicht die normale C/C++ Zuweisung nicht aus.

Unregistered
2002-11-19, 22:31:27
Originally posted by Xmas

Die Form A->b macht nur dann Sinn wenn A ein Pointer auf eine Struktur mit einem Member b ist.
SIZE]

Wer braucht schon den Pfeiloperator:
(*A).b

Sieht doch viel hübscher aus ;)

mfG
Elemental

Vedek Bareil
2002-11-28, 02:41:37
Originally posted by bendel
Wenn beim Kopieren der Daten nichts weiter beachtet werden muss, dann reicht es ja, das Array in eine Stuktur zur legen. versteh ich jetzt nicht. Hat er denn nicht genau das mit der Anweisung

typedef struct FIGUR
{
float Vertices[2][3];
float Position[3];
}FIGUR;

gemacht? ???

Edit: Halt Stop, noch einmal raten! ;)
Meintest du mit Array in eine Struktur legen vielleicht so was:

typedef struct FIGUR
{ struct Vertices
{ struct Vertices1
{ float Vertex11;
float Vertex12;
float Vertex13;
};
struct Vertices2
{ float Vertex21;
float Vertex22;
float Vertex23;
};
};
struct Position
{ float Position1;
float Position2;
float Position3;
};
} FIGUR;
?

Edit2: nein, Halt, Stop! Noch ein weiteres Mal raten ;)
Vielleicht so:

struct Struktur_fuer_Matrix{
float Matrix[2][3];};

typedef struct FIGUR{
struct Struktur_fuer_Vertices{
float Vertices[2][3];};
float Position[3];}FIGUR;

FIGUR Figur;

Figur.Struktur_fuer_Vertices:=Struktur_fuer_Matrix;

?
Bitte antworte mir, bevor ich hier noch irgendwelchen Blödsinn zusammenschreibe ;)