Forum: PC-Programmierung C: Pointer auf zweidimensionales Array an Funktion übergeben


von Ralf (Gast)


Lesenswert?

Hallo,

ich steh gerade aufm Schlauch, liegt wahrscheinlich an der Uhrzeit :(

Ich verwende ein zweidimensionales char-Array für verschiedene Texte, 
z.B. Wochentage:
1
uchar txtWeekDay[][10] = {{"    Montag"},
2
      {"  Dienstag"},
3
      {"  Mittwoch"},
4
      {"Donnerstag"},
5
      {"   Freitag"},
6
      {"   Samstag"},
7
      {"   Sonntag"}
8
};

Ich möchte in Abhängigkeit einer Variablen den entsprechenden Text 
auswählen und an eine Funktion übergeben.Die Funktion erwartet als 
Parameter einen Pointer auf ein eindimensionales char-Array, also einen 
Text.
1
void func(unsigned char *pText);

Der Aufruf mit
1
func(txtWeekDay[Wochentag][0])
spuckt mir Fehlermeldungen aus (illegal pointer conversion),
während
1
func(txtWeekDay[Wochentag])
zwar akzeptiert wird, aber murks macht, offenbar wird die 
Nullterminierung nicht erkannt, es werden alle Texte erkannt.
Ich hab's auch mit
1
func((char *)txtWeekDay[Wochentag][0])
probiert, aber hier scheint der Pointer ins Nirwana zu zeigen, da wird 
gleich gar nichts ausgegeben, das ist wiederum zu wenig :)

Wie gesagt, es ist schon spät, ich werd morgen mal untersuchen, wo denn 
die Pointer eigentlich genau hinzeigen, aber vielleicht sieht jemand 
was, was ich gerade nicht zu erkennen in der Lage bin.

Danke.

Ralf

von Daniel -. (root)


Lesenswert?

func(&txtWeekDay[Wochentag][0])

von Sven P. (Gast)


Lesenswert?

Du reservierst zehn Zeichen und belegst die mit Blabla und Leerzeichen 
-- wo soll da das Nullbyte hin?! Außerdem schießt du dir mit der 
Initialisierung des VEKTORS evtl. ins Knie. Probier mal:
1
char *tage[] = {
2
  "Montag", "Dienstag", ..., "Freitag"
3
};
4
5
func(tage[0]);

Übrigens nimmt man für 'Zeichen' meistens einfach nur 'char'. Das ist 
zwar je nach Einstellungen und Compiler mal signed und mal unsigned, 
aber hat sich eben so eingebürgert. Wenn man dann Zeichen vergleichen 
muss, castet man wieder nach (unsigned char) :-)

von Karl H. (kbuchegg)


Lesenswert?

Ralf wrote:

> während
>
1
> func(txtWeekDay[Wochentag])
2
>
> zwar akzeptiert wird,

Das wäre in deinem Fall die richtige Lösung.

> aber murks macht,

Den Murks hast du gemacht

> offenbar wird die
> Nullterminierung nicht erkannt,

Kein Wunder, du hast keine.
Der String "  Dienstag" ist 11 Zeichen lang (wenn man die 0-Terminierung 
mit einrechnet.


Sven hat schon die bessere Lösung gepostet. Das einzige was ich daran 
noch ändern würde:
1
const char *tage[] = {
2
  "Montag", "Dienstag", ..., "Freitag"
3
};

Denn das sind ja die Strings tatsächlich: konstant. Und damit enthält 
der VEKTOR lauter Pointer auf konstante Character.

von Ralf (Gast)


Lesenswert?

@Daniel:
> func(&txtWeekDay[Wochentag][0])
Danke, probier ich mal aus.

@Sven:
> Du reservierst zehn Zeichen und belegst die mit Blabla und Leerzeichen
> -- wo soll da das Nullbyte hin?!
argl Natürlich, dass hab ich total verpennt :( Werd ich ebenfalls 
ausprobieren.

> Außerdem schießt du dir mit der Initialisierung des VEKTORS evtl. ins Knie.
Warum?

> Probier mal: ...
Okay, werd ich ebenfalls probieren...
Danke!

@KHB:
> Das wäre in deinem Fall die richtige Lösung.
Jepp, wenn ich genug Platz lasse für die Nullterminierung, könnts dann 
doch so klappen :) ->Werd ich probieren...

> Den Murks hast du gemacht
Hm, das hat aber nur deine Tastatur abgenutzt, meinst du nicht? :)

> Kein Wunder, du hast keine.
Jo, heut nacht ist mir das nicht aufgefallen :)

> Sven hat schon die bessere Lösung gepostet. Das einzige was ich daran
> noch ändern würde:
> ...
> Denn das sind ja die Strings tatsächlich: konstant. Und damit enthält
> der VEKTOR lauter Pointer auf konstante Character.
Ja, das werde ich ebenfalls austesten.

Besten Dank an alle.

Ralf

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.