sehe vor lauter pointer den wald nicht mehr

OP #3258745
Lesenswert?

hallo zusammen.

ich habe:
1
const char *ListeA[] = {
2
   "Text 1A",
3
   "Text 2A",
4
   "Text 3A"
5
};
6
const char *ListeB[] = {
7
   "Text 1B",
8
   "Text 2B"
9
};
10
const char *ListeC[] = {
11
   "Text 1C",
12
   "Text 2C",
13
   "Text 3C",
14
   "Text 4C"
15
};
16

17
const char *(*AlleListen[]) = {ListeA, ListeB, ListeC};
18

19
void DisplayText(char *text) {...}


jetzt habe ich aber probleme, um innerhalb von funktionen auf diese 
arrays zuzugreifen.
1
void funktion1(char* ListeX[]) {...}
2
// hier ListeX = {ListeA, ListeB, ListeC}
3
// hier möchte ich auf die einzelnen texte von ListeX zugreifen können
4
// z.b. DisplayText(ListeX[i]);
5

6
void funktion2(char* ListeX[]) {...}
7
// hier ListeX = AlleListen
8
// hier möchte ich auf die einzelnen texte von ListeX zugreifen können
9
// z.b. DisplayText(ListeX[i][j]);

ich bin froh um jegliche hilfe, oder fehler bei der deklaration etc. 
danke
OP #3258754
Lesenswert?

danke für die formatierung

>> Das kann schon mal nicht stimmen.
ja eben, ich stehe irgendwie auf dem schlauch. auch mit 'char 
*(*AlleListen[])' ging's nicht. nun, wie soll ich das machen mit 
typedefst?

und wie ginge es, wenn ich funktion2 auch nur eine eindimensinales array 
übergeben möchte aber nur 'AlleListen[]' habe, z.b. AlleListen[2] 
übergeben mlchte?

danke!
#3258767
Lesenswert?

Der ganze Ansatz kann so nicht funktionieren, weil du in AlleListen 
keine Möglichkeit mehr hast, die tatsächlichen Längen der einzelnen 
Teilarrays festzustellen. Du brauchst also eine Zwischenstruktur, mit 
der du diese Information ergänzen kannst.
1
#include "stdafx.h"
2

3
const char* ListeA[]= {
4
   "Text 1A",
5
   "Text 2A",
6
   "Text 3A"
7
};
8

9
const char* ListeB[] = {
10
   "Text 1B",
11
   "Text 2B"
12
};
13

14
const char* ListeC[] = {
15
   "Text 1C",
16
   "Text 2C",
17
   "Text 3C",
18
   "Text 4C"
19
};
20

21
#define ARRAY_LEN(x) (sizeof(x)/sizeof(*x))
22

23
struct TextSubList {
24
  int          nrElements;
25
  const char** Elements;
26
};
27

28
struct TextSubList AlleListen[] = {
29
  { ARRAY_LEN(ListeA), ListeA },
30
  { ARRAY_LEN(ListeB), ListeB },
31
  { ARRAY_LEN(ListeC), ListeC }
32
};
33

34
void DisplayText(const char *text)
35
{
36
  printf( "%s\n", text );
37
}
38

39
void function1( struct TextSubList* EineGruppe )
40
{
41
  int i;
42

43
  for( i = 0; i < EineGruppe->nrElements; i++ )
44
    DisplayText( EineGruppe->Elements[i] );
45
}
46

47
void function2( int nrGruppen, struct TextSubList* AllGruppen )
48
{
49
  int i;
50

51
  for( i = 0; i < nrGruppen; i++ ) {
52
    printf( "******\n" );
53
    function1( &AllGruppen[i] );
54
  }
55
}
56

57
int main()
58
{
59
  function2( ARRAY_LEN( AlleListen ), AlleListen );
60
}
Gast #3259851
Lesenswert?

Mein Rat:

Laß lieber die Finger auf solche Konstrukte wie Zeiger auf Zeiger auf 
sonstwas.

Denk dir lieber eine ganz andere Strategie aus. C hat keine 
mehrdimensinalen Felder, das sollte man sich ganz dick hinter die Ohren 
schreiben und beherzigen. Jeder Versuch, sich mit sowas wie 
MyBlabla[x][y}[z] zu behelfen, läuft auf etwas hinaus, daß der naive 
Programmierer SO nie beabsichtigt hatte.

Mein Vorschlag: Arbeite mit einer Art Handle und laß dir den zugehörigen 
Text von einem Unterprogramm liefern. Mehr Code als für das mehrfache 
Dereferenzieren braucht das auch bloß nicht.
Ich hab das bei meinen Geräten etwa so gemacht:

#define  txt_KlappeAuf  1
#define  txt_KlappeZu   2
#define  txt_FensterAuf 3
.. usw.

char* GetText (int handle, int language)
{...
}


W.S.

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