Forum: Mikrocontroller und Digitale Elektronik sehe vor lauter pointer den wald nicht mehr


von Master S. (snowman)


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

von Master S. (snowman)


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!

von Tom (Gast)


Lesenswert?


von Karl H. (kbuchegg)


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
}

von Master S. (snowman)


Lesenswert?

ich dachte, da es 'const' sind, kann sich der compiler zur 
compilier-zeit die adressen berechnen. Danke für den code und den link, 
da werde ich wohl noch etwas nacht-lektüre haben...

von Karl H. (kbuchegg)


Lesenswert?

Master Snowman schrieb:
> ich dachte, da es 'const' sind, kann sich der compiler zur
> compilier-zeit die adressen berechnen.

Die Adressen: ja

Aber wieviele sind es denn pro Subliste? 2, 3, oder 4?

von Master S. (snowman)


Lesenswert?

OK jetzt funktioniert's :-) der text über pointer auf pointer hat mir 
die augen geöffnet. danke.

von W.S. (Gast)


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.

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.