strcmp_P

Gast #177544
Hi,

ich lese einige Char's per Uart ein und lege diese in ein Char Array.
Nach einem "\r" moechte ich den String mit einem String im Flash
vergleichen.

Leider habe ich da meine Probleme.

Mit diesem Befehl funktioniert es.
gleich = strcmp_P(string,PSTR("Measure"));

Versuche ich aber so geht es nicht.

gleich = strcmp_P(string,COMMAND1);

ich hab natuerlich den String im Flash ueber PROGMEM initalisiert.

const char PROGMEM COMMAND1[] = "Measure";

Anbei befindet sich mein Testprg.

Ich hoffe es kann mir jemand weiterhelfen.


Mfg

Dirk
Angehängte Dateien:
Gast
Auch wenn das deine Frage nicht beatwortet, deklariere die Konstante
COMMAND1 als globale Variable, dann wird PROGMEM nicht mehr ignoriert.
Das spart bei .data 8 Byte und bei .text weitere 12 Byte.

Ansonsten würde ich gerne lernen wie
void uart_str(const char *s) {
    register unsigned char c;
    while ( (c = *s++) ) {
     uart_putchar(c);
    }
}
funktioniert, insbesondere woher die Prozedur weiß die groß der String
ist. Mit Pointern hab ich noch so meine Probleme :-)
Gast
Hi,

mein erster Fehler war das ich eine zu alte WinAVR Version genutzt
habe. Nachdem ich die Version 3.4.1 installiert hab bekam ich auch eine
Warnung.

Nachdem ich die Zuweisung des Strings als Global gemacht hab
funktioniert es.

Vielen Dank.

So nun zu deiner Frage. Ich bin leider kein Profi in C geschweige AVR
GCC Profi.

Versuchen kann ich es mal:

C wird s zugewiesen. S wird +1 erhoeht und wenn c != 1  ist wird
abgebrochen. Da ein String mit NULL (\0) terminiert wird weiss der
Pointer das der String beendet ist.

Mfg

Dirk
Gast
"nicht ganz" - die Sache mit dem Abbruch. Versuche es auch mal:
Vor der Schleife (while) zeigt s (ein Pointer) auf eine Speicherstelle,
in der das erste auszugebende Zeichen des Strings steht. Der Ausdruck
bei while "macht" folgendes (1) kopiert den Inhalt der Speicherstelle
(ein "Zeichen") auf das s zeigt in c. Der * steht fuer die
Dereferenzierung. Ist s ein Pointer, also nichts anderes als ein
"Zahl" die einer Speicherstelle entspricht, kann mit *s auf den
Inhalt dieser Speicherstelle zugegriffen werden. (2) s wird nach der
Zuweisung um eins erhoeht (++), der Pointer zeigt somit beim naechsten
Schleifendurchlauf auf die naechste Speicherstelle, also auf das
folgende Zeichen im String. Nun muss man wissen: per Konvention enden
Strings in C mit einem Null-"Zeichen", ein Zeichen (char)
(vereinfacht) auch mit Zahlen verglichen werden kann (verglichen wird
quasi z.B. der ASCII-code des Zeichens) und Bedingungen sind dann
"wahr" wenn das Ergebnis ungleich 0 ist. Damit kommt man zu (3): wenn
das Ergebnis der Zuweisung (also c) ungleich 0 ist (also nicht das
"Endezeichen") wird c ausgegeben (ausgeschrieben (c = *s++) != 0
etwas "eindeutiger" (c=*s++)!='\0').
Nun ja - Prosa in "Epos-Laenge". Hoffe es hilft, Martin

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 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.