Forum: Compiler & IDEs strcmp_P


von Dirk (Gast)


Angehängte Dateien:

Lesenswert?

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

von Malte Marwedel (Gast)


Lesenswert?

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

von Dirk (Gast)


Lesenswert?

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

von mthomas (Gast)


Lesenswert?

"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

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.