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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.