Forum: Mikrocontroller und Digitale Elektronik 2d int feld in einer struktur


von Cedric D. (cedricdunsch)


Lesenswert?

Hallo, ich möchte ein Feld in einem struct erstellen. nun funktioniert 
dies leider nicht. kann mir jemad helfen oder hat ne Idee wie es 
funktionieren könnte ?
MFG Cedric
1
typedef struct
2
{
3
  int spielfeld[3][3];
4
}tic_tac_toe;
5
6
int main()
7
{
8
  tic_tac_toe feld1;
9
  feld1.spielfeld= { {1,1,1},{0,0,0},{2,1,0} };  
10
}

von OMG (Gast)


Lesenswert?

Cedric D. schrieb:
> nun funktioniert dies leider nicht.

Was funktioniert denn nicht?

von leo (Gast)


Lesenswert?

Cedric D. schrieb:
> Hallo, ich möchte ein Feld in einem struct erstellen. nun funktioniert
> dies leider nicht.

Danke fuer die ausfuehrliche Fehlermeldung "funktioniert nicht".
Du hast die Fehlermeldng "error: assigning to an array from an 
initializer list" sicher bei Google eingeworfen. Da kommt als erstes: 
"You cannot assign directly to an array after its declaration." - noch 
in der Uberschrift.

Also
1
#include <stdio.h>
2
  int spielfeld[3][3]= { {1,1,1},{0,0,0},{2,1,0} };  ;
3
4
int main()
5
{
6
  printf("2,1=%d\n", spielfeld[2][1]);
7
}

Init in der Deklaration und gut ist.

leo

von Dirk B. (dirkb2)


Lesenswert?

Cedric D. schrieb:
> feld1.spielfeld= { {1,1,1},{0,0,0},{2,1,0} };

Das ist eine Zuweisung eines Arrays und hat noch nie in C funktioniert.

leo schrieb:
> Init in der Deklaration und gut ist.

Das ist die Definition (mit impliziter Deklaration)
Bei der (reinen) Deklaration gibt es noch keinen Speicher, in den 
irgendwas abgelegt werden kann.

von Bernd K. (prof7bit)


Lesenswert?

Array kann man nicht zuweisen, es darf nicht auf der linken Seite von = 
stehen, alles andere darf dort stehen, das ist so weil... Gründe.

Probiers mal so:
1
    memcpy(feld1.spielfeld, (int[3][3]){{1,1,1},{0,0,0},{2,1,0}}, sizeof(int[3][3]));

Oder wenn Du das ganze struct in einem Rutsch mit Werten füllen willst 
dann geht das sehr elegant mit einem compound literal für das ganze 
struct, denn ein struct darf durchaus mit = zugewiesen werden:
1
    feld1 = (tic_tac_toe){
2
        .spielfeld = {{1,1,1},{0,0,0},{2,1,0}}
3
    };

von Bernd K. (prof7bit)


Lesenswert?

Dirk B. schrieb:
> Bei der (reinen) Deklaration gibt es noch keinen Speicher, in den
> irgendwas abgelegt werden kann.

Er hat nirgendwo in dem Beispiel eine reine Deklaration, also verwirr 
ihn damit jetzt (noch) nicht. mit der Zeile

1
tic_tac_toe feld1;

ist der Speicher angelegt, denn das ist eine Definition, und er kann 
jetzt was reinschreiben.

von zitter_ned_aso (Gast)


Lesenswert?

typedef ist eine Deklaration ;-)

von Dirk B. (dirkb2)


Lesenswert?

Bernd K. schrieb:
> Er hat nirgendwo in dem Beispiel eine reine Deklaration, also verwirr
> ihn damit jetzt (noch) nicht.

Reiß doch meine Antworten nicht aus dem Zusammenhang. Ich hatte extra 
die Behauptung von leo zitiert.

von Cedric Dunsch (Gast)


Lesenswert?

Hallo, vielen Dank für die Hilfe, einen Arrey so zu deklarieren 
funktioniert bei mir auch, ich habe nur ein Problem damit dies in einer 
Struktur in diesem Fall tickdackto zu tun.

von Teo D. (teoderix)


Lesenswert?

Cedric D. schrieb:
> typedef struct
> {
>   int spielfeld[3][3];
> }tic_tac_toe;
>
> int main()
> {
>   struct tic_tac_toe feld1 = { {1,1,1},{0,0,0},{2,1,0} };
> }

von zitter_ned_aso (Gast)


Lesenswert?

"struct" braucht man nicht, dafür aber zusätzliche geschweifte Klammern
1
tic_tac_toe feld1 = { {{1,1,1},{0,0,0},{2,1,0}} };

von Teo D. (teoderix)


Lesenswert?

zitter_ned_aso schrieb:
> "struct" braucht man nicht, dafür aber zusätzliche geschweifte Klammern

Aussage kräftige Bezeichner auch nicht. Zusätzliche Klammern.... ne 
glaube nicht, das die nötig sind.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.