Das gleiche Prob hatte ich vor kurzem in Bascom.
Da gings mit "Left","Mid" unf "Right"
Gibts da evtl in C auch??
MfG Xtreme
"vor120", wie kann ich diesen string trennen in 2 gruppen, einmal einen string "vor" zum aufruf der unterroutine und einmal eine integerzahl 120 , die in der unterroutine verarbeitet wird mit winavr-c
mfg pebisoft
Das gleiche Prob hatte ich vor kurzem in Bascom.
Da gings mit "Left","Mid" unf "Right"
Gibts da evtl in C auch??
MfG Xtreme
Hi,
ist das immer in der Reihenfolge ??
Das einzige was mir spontan dazu einfaellt ist "isalpha()"(http://www.cppreference.com/stdstring/isalpha.html).
Dann wuerde in i deine 120 als int stehen und im String str steht nur noch Dein "vor".Code:for(i=0; isalpha(str[i]); i++); //durchlaufen bis zur Zahl i=atoi(str+i); //Zahlenstring in int convertieren str[i]=0x00; //Nullerminierung
hi
ich nehme an, es geht nicht nur um dieses beispiel, sondern generell um die auftrennung eines strings in befehl und daten?
am besten definierst du dir irgend ein 'protokoll' im sinne von die ersten x bytes sind immer befehl, anschliessend kommen y bytes daten, etc
damit kannst du recht effizient arbeiten ...
wieviele verschiedene kommandos müssen denn übermittelt werden können? wenn es weniger als 256 sind, würde es eigentlich reichen, nur ein byte dafür zu verwenden (ok, der wert 37 ist weniger schön als 'vor', aber du musst dafür 2 bytes weniger übertragen)
dasselbe gilt für den integer - muss der wirklich zuerst in einen string verpackt und dann wieder umgerechnet werden?
cu
chris
hallo, klappt wunderbar (isalpha). vielen dank.
ich will damit den encoder am robby sagen z.b. das er "vor"wärts 100 encoder-werte fahren soll. komando bekommt er über funk.
mfg pebisoft
Wenn ich annehme, der String kommt vom Terminal, dann kriegst du den String ja Zeichenweise
Als erstes liest du also den string einfach ein bis <CR> ( ein "\0" hängst du am besten gleich an. )
In deinem Fall kannst du brutal die ersten 3 Byte mit "vor" vergleichen,
if (memcmp (string, "vor", 3 ) == 0)
und dann die Zahl
nn = atoi((char*)&string[3]) ( die ersten 3 bytes sin ja jetzt schon weg)
Es gibt mindestens 357 Lösungsvarianten, das ist ca Nr 37
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
die letzte lösung geht auch wunderbar.
welche nimmt mehr speicher weg.
ich mache 8 abfragen.
was heissen diese warnmeldungen:
uart.c: In function `main':
uart.c:29: warning: passing arg 1 of `memcmp' discards qualifiers from pointer target type
uart.c:31: warning: passing arg 1 of `usart_writeString' discards qualifiers from pointer target type
mfg pebisoft
Wenn du sagst
if ( (string[0] == 'v')
&& (string[1] == 'o')
&& (string[2] == 'r')
{
nn = atoi(string[3])
}
ist das sicher eine der billigsten Varianten, nur halt nicht gut zu lesen.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Ja, aber auch recht speicherfressend und nicht sonderlich flexibel...
Wenn da noch andere Befehle (auch spaeter mal zukommen sollen) wuerd ich das so nicht machen.
Wuerde da ein schoenes Struckt empfehlen in dem der Name als String gespeicher ist und ein Pointer auf die Funktion (setzt allerdings vorraus das die alle den gleichen Uebergabeparameter haben...). Dann machst Du ein Array aus diesen Struckt (halt fuer jede Funktion eins..) und Gehts dann in der for Schleife solange durch alle durch bis Du das richtig gefunden hast. Klingt jetzt evt etwas aufwendig, aber ich wage zu behaupten das Du da deutlich weniger Speicher benoetigst als mit der Variante von PicNick.
(Vor allem brauchst nicht so viel Tippen... Und das aendern/hinzufuegen geht auch schnell weil Du nur das Array erweitern musst).
Ich geb dir teilweise recht und teilweise nicht:
Ich selbst würde das in meinem Leben nicht so machen wie ich das da hingeschrieben habe. Wie du es sagst, von wegen flexibel, modularisierung und überhaupt.
ABER SPEICHERFRESSEND ist das nicht
Den 3 von mir genannten Vergleichen steht beim "memcmp" und jeder allgemeinen Function eine Call-prozedur plus einer Schleifenkonstruktion für die Länge gegenüber, damit letztlich im Kern genau wieder diese 3 Byte verglichen werden.
Außerdem muß er sich ggf. deine Vergleichstrings erstmal aus dem Flash holen, damit die function sie überhaupt lesen kann
Also recht teuer gegen drei "if's"
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Lesezeichen