mikrocontroller.net

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


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
uchar txtWeekDay[][10] = {{"    Montag"},
      {"  Dienstag"},
      {"  Mittwoch"},
      {"Donnerstag"},
      {"   Freitag"},
      {"   Samstag"},
      {"   Sonntag"}
};

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.
void func(unsigned char *pText);

Der Aufruf mit
func(txtWeekDay[Wochentag][0])
spuckt mir Fehlermeldungen aus (illegal pointer conversion),
während
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
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

Autor: Daniel -------- (root)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
func(&txtWeekDay[Wochentag][0])

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
char *tage[] = {
  "Montag", "Dienstag", ..., "Freitag"
};

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) :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ralf wrote:

> während
>
> func(txtWeekDay[Wochentag])
> 
> 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:
const char *tage[] = {
  "Montag", "Dienstag", ..., "Freitag"
};

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.