Forum: PC-Programmierung Probleme mit 2d-Matrix auf elemente zugreifen


von Felix (Gast)


Lesenswert?

Hallo,
wir haben heute in der Schule in Informatik eine Aufgabe aufbekommen, 
mit der ich nicht ganz zurechtkomme.
Die Aufgabe ist es in C eine 2D-Matrix um 90 Grad zu drehen
Bsp.:
1
[[1, 2, 3],      [[7, 4, 1],
2
 [4, 5, 6],  ->   [8, 5, 2],
3
 [7, 8, 9]]       [9, 6, 3]]
Dazu haben wir noch eine Definition für arrays bekommen.
1
typedef struct arr_##name {
2
  int size;
3
  type *arr;
4
} arr_##name
5
6
arr_##name alloc_arr_##name(int len){
7
  arr_##name a = {len, len > 0 ? malloc(sizeof(type) * len) : NULL};
8
  return a;
9
}
10
11
12
arr_arr_integer Rotation2D(arr_arr_integer a) {
13
14
}

Die Aufgabe an sich habe ich schon verstanden, allerdings komme ich 
nicht klar auf die einzelnen Werte zuzugreifen.
Normalerweise würde ich mit
1
int x = a[0][0];
den wert von a(0,0) holen (hier 1).
Aber hier bekomme ich eine fehlermeldung:
error: subsripted value is neither array nor pointer nor vector int x = 
a[0][0];

Wie komme ich an den Wert 1 ran?

Wie funktioniert genau
1
arr_##name a = {len, len > 0 ? malloc(sizeof(type) * len) : NULL};
Normalerweise kenne ich das mit dem Fragezeicheoperator nur mit einer 
Bedingung. Jetzt steht vor der Bedingung allerdings noch einmal len. Was 
bedeutet dies?

Das ## operator kenne ich bisher nur in dem zusammenhang, dass es zwei 
Makroparameter miteinander verbindet. Aber hier habe ich es auch noch 
nciht ganz verstanden, was es genau bewirkt.

Wäre super, wenn ihr mir bei der ein oder anderen Frage Hinweise geben 
könntet

Felix

von guest (Gast)


Lesenswert?

Dein a ist ein Struct und kein Array. Erst ein Member des Structs ist 
dann wohl das gesuchte Array. Also etwa so a.arr[0][0].

von Felix (Gast)


Lesenswert?

guest schrieb:
> Dein a ist ein Struct und kein Array. Erst ein Member des Structs ist
> dann wohl das gesuchte Array. Also etwa so a.arr[0][0].

Besten dank für den Hinweis, aber damit bekomme ich leider die selbe 
Fehlermeldung

von guest (Gast)


Lesenswert?

Felix schrieb:
> Besten dank für den Hinweis, aber damit bekomme ich leider die selbe
> Fehlermeldung

Dann kommen dann aber vermutlich noch ein paar mehr Fehler. Dein 
minimaler Codefetzen gibt auch nichts her. Deine "Definition für arrays" 
kommt mit Sicherheit aus einem Makro, da fehlt also etliches.

Übrigens das wo der ?-Operator auftaucht ist eine Initialisierung einer 
Struktur. Und da die bei Dir zwei Elemente hat, stehen in den 
geschweiften Klammern halt auch zwei Ausdrücke, einmal 'len' und als 
zweites das Konstrukt mit dem '?'. Das erste 'len' hat also absolut 
nichts mit der Bedingung vor dem '? zu tun.

von guest (Gast)


Lesenswert?

Achso, Dein komisches nicht vorhandenes Makro erzeugt ein 
eindimensionales Array, also nur ein Index: a.arr[0]. Die Umrechnung 
mußt Du dann selber machen. Oder Arrays von Arrays erzeugen, dann siehts 
etwa so aus: a.arr[0].arr[0].

Hab mal versucht aus Deinen Fetzen was sinnvolles zu machen:
1
#include <stdlib.h>
2
3
#define DUMMY(type,name) typedef struct arr_##name{int size;type *arr;}arr_##name;\
4
arr_##name alloc_arr_##name(int len)\
5
{arr_##name a={len,(type*)(len>0?calloc(len,sizeof(type)):NULL)};return a;}
6
7
DUMMY( int, integer )
8
DUMMY( arr_integer, arr_integer )
9
10
int main( int argc, char** argv )
11
{
12
  arr_arr_integer a = alloc_arr_arr_integer( 3 );
13
14
  a.arr[0] = alloc_arr_integer( 3 );
15
  a.arr[1] = alloc_arr_integer( 3 );
16
  a.arr[2] = alloc_arr_integer( 3 );
17
18
  int x = a.arr[0].arr[0];
19
20
  return 0;
21
}

Geht durch den Compiler. Vom Stil her aber eher eine ziemliche 
Katastrophe, also besser nicht nachmachen.

von Rolf M. (rmagnus)


Lesenswert?

guest schrieb:
> Vom Stil her aber eher eine ziemliche Katastrophe, also besser nicht
> nachmachen.

Sieht allerdings aus, wie eine typische Kreation von einem Lehrer, der 
nie tatsächlich Software geschrieben hat. Kein Mensch würde in einem 
echten Programm sowas schreiben.

von guest (Gast)


Lesenswert?

Rolf M. schrieb:
> Sieht allerdings aus, wie eine typische Kreation von einem Lehrer, der
> nie tatsächlich Software geschrieben hat. Kein Mensch würde in einem
> echten Programm sowas schreiben.

;-) Könnte auch aus einem der hier verrissenen Bücher stammen:
Beitrag "C-Lehrbuch aus dem Rheinwerk-Verlag schlecht? Alternative?"

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.