Forum: Compiler & IDEs GCC f. AVR: strstr(.)


von Bernd (Gast)


Lesenswert?

Die Funktion strstr(...) sucht einen Substring im String. Beide Strings 
befinden sich im RAM des Controllers. Bei der Funktion strstr_P(...) 
befindet sich der String im RAM und der Substring im Flash.

Wie kann man einen String im Flash mit einem Substring im RAM 
durchsuchen?

http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Bernd schrieb:
> Wie kann man einen String im Flash mit einem Substring im RAM
> durchsuchen?

Du kopierst den String vom Flash ins RAM und rufst strstr() auf. Oder 
ist der zu lang fürs RAM?

Alternative: Selber schreiben.

von Theor (Gast)


Lesenswert?

Als allgemeinen Hinweis möchte ich anführen, dass das "fehlen" einer 
Funktion in einer Standardbibliothek meist, aber nicht grundsätzlich, 
darauf hindeutet, dass diese Funktion nicht oder sehr selten gebraucht 
wird.

Daraus folgt, dass es sich oft lohnt, darüber nachzudenken, ob man das 
Problem nicht neu formulieren kann, so dass man mit den vorhandenen 
Funktionen auskommt.

Falls das aus irgendeinem Grund nicht geht, kann man die Funktion selbst 
schreiben.

Falls Du es für angebracht hältst, kannst Du uns ja mal beschreiben, was 
Du erreichen willst. Vielleicht können wir bei der Neuformulierung des 
Problems helfen.

von Cyblord -. (cyblord)


Lesenswert?

Bernd schrieb:
> Wie kann man einen String im Flash mit einem Substring im RAM
> durchsuchen?

Mächtig viel Sinn macht das ganze nicht.

strstr_P Funktion gibt es vor allem weil davon ausgegangen wird dass der 
gesuchte String (needle) konstant ist und direkt im Quelltext angegeben 
wird. Damit dieser dann nicht Platz im RAM verschwendet kann man ihn 
auch nur im Flash anlegen lassen und nutzt dann strstr_P.

Wenn nun aber dein "haystack" im Flash liegt, ist er konstant. Du kennst 
ihn. Warum darin rumsuchen? Es ergibt keinen Sinn!

von Markus F. (mfro)


Lesenswert?

Cyblord -. schrieb:
> Wenn nun aber dein "haystack" im Flash liegt, ist er konstant. Du kennst
> ihn. Warum darin rumsuchen? Es ergibt keinen Sinn!

Jein. Sieht nur auf den ersten Blick so aus.

Stell' dir beispielsweise einen Parser vor, der überprüft, ob und wenn 
ja welches Token (z.B. bei ein Kommando) vorliegt. Da wirst Du durchaus 
durch eine (konstante) Stringliste spazieren und Vergleiche durchführen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Markus F. schrieb:
> Da wirst Du durchaus durch eine (konstante) Stringliste spazieren und
> Vergleiche durchführen.

Das würde bedeuten, daß die Tokens alle mehr oder weniger 
aneinandergeklatscht in einem String liegen. Kann man zwar machen, 
aber was wäre damit gewonnen? Eine Stringliste besteht nach meinem 
Verständnis aus separaten Strings, und dann muss man nicht mit 
strstr darin suchen.

von Cyblord -. (cyblord)


Lesenswert?

Rufus Τ. F. schrieb:
> Markus F. schrieb:
>> Da wirst Du durchaus durch eine (konstante) Stringliste spazieren und
>> Vergleiche durchführen.
>
> Das würde bedeuten, daß die Tokens alle mehr oder weniger
> aneinandergeklatscht in einem String liegen. Kann man zwar machen,
> aber was wäre damit gewonnen? Eine Stringliste besteht nach meinem
> Verständnis aus separaten Strings, und dann muss man nicht mit
> strstr darin suchen.

Eben. Wenn man das braucht dann hat man in 99% der Fälle eine deutlich 
bessere Lösung übersehen.

von Stefan E. (sternst)


Lesenswert?

Rufus Τ. F. schrieb:
> Eine Stringliste besteht nach meinem
> Verständnis aus separaten Strings, und dann muss man nicht mit
> strstr darin suchen.

Auch dafür gibt es sinnvolle Beispiele. Stell dir z.B. vor, der User 
soll hier die Möglichkeit haben, ein Subforum per Texteingabe auswählen 
zu können. Er kann dann also "Funk" eingeben, um in "HF, Funk & Felder" 
zu landen.

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.