Probleme mit 2d-Matrix auf elemente zugreifen

Gast #5316230
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
Gast #5316334
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.
Gast #5316366
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren