GCC f. AVR: strstr(.)

Gast #5611805
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
Gast #5611853
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.
#5613450
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!
#5613487
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.
Persönliche Seite #5613491
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.
#5613505
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.
#5613523
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 8 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.