Forum: Compiler & IDEs strchr Funktion überladen?


von Name (Gast)


Lesenswert?

Hallo,

Ich möchte mit:

int length = strchr(rx_buffer, '#');

Nach dem # - Zeichen im String suchen.

leider sagt der Compiler:
Fehler: call of overloaded 'strchr(unsigned char [32], char)' is
ambiguous

Was mache ich falsch?

von Markus M. (mark_m)


Lesenswert?

Für den Compiler ist der Aufruf der Funktion nicht eindeutig. Der 
Compiler hat mehrere Funktionen, die auf deinen Aufruf passen.

Überprüfe mal deine Aufrufparameter.

Ein bisschen mehr Source-Code wäre auch nicht verkehrt.

Grüsse

von Name (Gast)


Lesenswert?

> Überprüfe mal deine Aufrufparameter.

Was genau soll ich bei denen überprüfen?

von Markus M. (mark_m)


Lesenswert?

Die Datentypen der der Parameter sollten mit den Datentypen 
übereinstimmen, die die Funktion erwartet.
1
char *strchr( const char *str, int ch );

Na! Kommst Du drauf?

Grüsse

von Name (Gast)


Lesenswert?

hmm...

rx_buffer ist ein unsigned char, erwartet wird ein const char
und '#' ist doch ein int, oder?

Weiterhin gibt doch strchr entweder die Stelle zurück, an der die # 
steht, oder eine Null, falls keine # enthalten, richtig?
Das kann in dem int length gespeichert werden.

von Markus M. (mark_m)


Lesenswert?

Und genau der Rückgabewert passt nicht auf deinen int length!

Der Rückgabewert ist ein Zeiger (char*). Je nach System ist dieser 
16/32/64 Bit. Der Compiler weigert sich eine Adresse in einen Integer zu 
casten. Was auch irgendwie keinen Sinn ergibt. Der Rückgabewert gibt 
auch nicht irgendeine Länge zurück sondern die Speicheradresse des 
gefundenen Zeichens.

Um die Länge zu erhalten müsstest Du rx_buffer von diesem Zeiger 
subtrahieren.

Grüsse

von Rolf M. (rmagnus)


Lesenswert?

Name schrieb:
> Fehler: call of overloaded 'strchr(unsigned char [32], char)' is
> ambiguous

Also scheint es sich um C++ zu handeln. Da gibt es zwei Überladungen der 
Funktion. Wo ist denn der Rest der Fehlermeldungen? Ich kenne das so, 
daß der Compiler danach noch die Kandidaten nennt, die er in Betracht 
ziehen würde.

Name schrieb:
> hmm...
>
> rx_buffer ist ein unsigned char,

Warum unsigned? Das ist der Auslöser der Fehlermeldung, weil der 
Compiler sich aufgrund des falschen Zeigertypen nicht entscheiden kann, 
welches strchr er aufrufen soll.

> erwartet wird ein const char und '#' ist doch ein int, oder?

Nicht in C++. Da ist '#' ein char.

> Weiterhin gibt doch strchr entweder die Stelle zurück, an der die #
> steht, oder eine Null, falls keine # enthalten, richtig?
> Das kann in dem int length gespeichert werden.

Du willst den zurückgegebenen Zeiger in einem int speichern?

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.