Array in Array

OP #4245260
Lesenswert?
• ▲
▼
Hallo zusammen,

ich möchte mehrere 2d-Arrays in einem Array für einen dynamischen 
Zugriff ablegen.
1
static const int** _fontdesc[] = {
2
  microsoftSansSerif_8ptDescriptors,
3
  microsoftSansSerif_10ptDescriptors
4
};
Die Arrays in _fontdesc sind 2d-Arrays.

Beim compilieren kommt folgende Fehlermeldung:
1
error: cannot convert 'const int (*)[2]' to 'const int**' in initialization


sitze seit Stunden davor und lese und recherchiere und bekomme es nicht 
hin. :(

Mit eindimensionalen Arrays funktioniert es:
1
static const char* _fonttype[] = {
2
  microsoftSansSerif_8,
3
  microsoftSansSerif_10
4
};

Kann mir da jemand weiter helfen?

Gruß Alex
Gast #4245283
Lesenswert?
• ▲
▼
Das liegt daran, dass Arrays und Zeiger eben nicht ganz dasselbe sind.
1
    static const int** _fontdesc[] = {
2
        (const int**) microsoftSansSerif_8ptDescriptors,
3
        (const int**) microsoftSansSerif_10ptDescriptors
4
    };
Das würde funktionieren. Kommt drauf an, was du dann noch vorhast mit 
_fontdesc. Denn der Zugriff darauf ist jetzt nicht mehr so cool.

Wenn es dir aber reichen würde immer nur einen Zeiger auf das erste 
Element im Array zu speichern, dann ist das viel leichter gemacht und 
sieht auch nicht so seltsam aus.
1
    static const int _fontdesc[] = {
2
        &microsoftSansSerif_8ptDescriptors[0][0],
3
        &microsoftSansSerif_10ptDescriptors[0][0]
4
    };

Ich muss auch zugeben, dass der Zusammenhang zwischen Arrays und Zeigern 
sehr verwirrend ist und ich daher für nichts eine Garantie übernehme.

Wenn es noch jemand besser weiß, dann bin ich daran auch sehr 
interessiert.
Gast #4245286
Lesenswert?
• ▲
▼
1
    int foo0[2][2] = {{1,2},{3,4}};
2
    int foo1[2][2] = {{5,6},{7,8}};
3

4
    int* listeDerArrays[2][2];
5
    *listeDerArrays[0] = (int*)foo0;
6
    *listeDerArrays[1] = (int*)foo1;
7

8
    // Zugriff mit:
9
    listeDerArrays[1][0][1];

Hat mir keine richtige Ruhe gelassen, von daher hier noch eine Lösung
OP #4245777
Lesenswert?
• ▲
▼
nfet schrieb:
> Das liegt daran, dass Arrays und Zeiger eben nicht ganz dasselbe sind.
>     static const int** _fontdesc[] = {
>         (const int**) microsoftSansSerif_8ptDescriptors,
>         (const int**) microsoftSansSerif_10ptDescriptors
>     };
> Das würde funktionieren. Kommt drauf an, was du dann noch vorhast mit
> _fontdesc. Denn der Zugriff darauf ist jetzt nicht mehr so cool

Diese Lösung hat mich schon mal ohne Fehlermeldung weiter gebracht. 
Allerdings bekomme ich beim außlesen ganz andere Werte als enthalten 
sind.

Mein microsoftSansSerif_8ptDescriptors sieht wie folgend aus:
1
static const int microsoftSansSerif_8ptDescriptors[][2] = {
2
   {1, 0},
3
   {4, 12},
4
   {6, 24}
5
}

wenn ich mir dann den ersten Wert ausgeben lasse kommt keine 1 sondern 
148 rauß
1
char myChar = "!";
2
int charASCII = (int)myChar - 33; // charASCCII = 0
3
int fontfamily = 0; // msSansSerif 8pt
4

5
const int charWidth = _fontdesc[fontfamily][charASCII][0];
6

7
Ausgabe von charWidth ist 148 ???
#4245959
Lesenswert?
• ▲
▼
Alex R. schrieb:
> Allerdings bekomme ich beim außlesen ganz andere Werte als enthalten
> sind.

Das liegt am Speicherlayout von mehdimensionalen Arrays und dem falschen 
cast "(const int**) microsoftSansSerif_8ptDescriptors,"

2d Arrays sind im Speicher wie 1d Arrays abgelegt. Der cast kann daraus 
nicht magisch Pointer auf 1d arrays machen, weil diese Pointer nirgens 
gespeichert sind.

Folgende Möglichkeiten:
Array von Pointern auf Mehrdimensionale Arrays: (nearest match)
1
static const int (*_fontdesc[][2])[] = {
2
  microsoftSansSerif_8ptDescriptors
3
};

Möglichkeit 2, compound literal abuse: (worst option)
1
static const int** _fontdesc[] = {
2
  (const int*[]){
3
    microsoftSansSerif_8ptDescriptors[0],
4
    microsoftSansSerif_8ptDescriptors[1],
5
    microsoftSansSerif_8ptDescriptors[2]
6
  }
7
};

Möglichkeit 3, stattdessen structs verwenden: (best option)
1
typedef struct fontCharacterDescriptor {
2
  int charWidth, whatever;
3
} fontCharacterDescriptor_t;
4

5
static const fontCharacterDescriptor_t microsoftSansSerif_8ptDescriptors[] = {
6
   {1, 0},
7
   {4, 12},
8
   {6, 24}
9
};
10
static fontCharacterDescriptor_t (*_fontdesc[])[] = {
11
  microsoftSansSerif_8ptDescriptors
12
};

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.