Hallo,
ich habe ein Problem, bei dem ich nicht weiterkomme. Ich habe die Suche
schon benutzt, genauso wie Google. Aber ich denke es ist zu speziell.
Es geht um folgendes:
Ein ATmega32 soll Schrittmotoren für eine CNC-Fräse steuern. Die
Steuerungsbefehle in Form von G-Code bekommt der Controller von einem
angeschlossenen Computer.
Jetzt möchte ich mein Programm für den Controller etwas umbauen um mehr
Performance rauszuholen. Im Programm des Controllers kommt dieser
irgendwann an die Stelle, an der er den G-Code verarbeitet.
Für folgende Beispiele wird folgender G-Code angenommen:
G01 X12.125 Y20.7123
Bisher sah es so aus:
1 | int value = (int)strtol(valStart, &valEnd, 10);
|
wobei valStart ein Pointer ist, der auf den ersten Char nach zugehörigem
Befehl zeigt. Zu Beginn also auf '0' (gehört zu "G01"). Die Funktion
wertet die Zeichenkette bis zum Vorkommen des ersten ungültigen Zeichens
aus. In dem Beispiel das Leerzeichen vor X. Die Variable "value" enthält
danach also den Wert "1". Und so weiter. Für Befehle wie X, Y, Z etc.
wird natürlich die äquivalente Funktion
1 | float value = (float)strtod(valStart, &valEnd);
|
ausgeführt. In beiden Fällen, schreibt die Funktion in valEnd die Stelle
des Endes der ausgewerteten Zahl der G-Code Zeichenkette hinein. Ist
äußerst praktisch, weil man mit der Überprüfung
1 | if(valEnd - valStart) {
|
2 | ...
|
3 | }
|
sicherstellen kann, dass eine gültige Zahl erkannt wurde.
Jetzt kommt mein eigentliches Anliegen:
Ich möchte die Funktionen strtol und strtod ersetzen durch eine eigene
Funktion um Kommazahlen ganz zu vermeiden. Diese soll dann bei X12.125
z.B. 1940 zurückgeben (die Anzahl der Schritte). Die Auswertung und so
weiter klappt alles. Jedoch bekomme ich es nicht hin, dass die Funktion
die Endstelle in valEnd schreibt.
Bei mir sieht der Funktionsrumpf so aus (ähnlich wie strtol):
1 | int decode(const char * str, char ** endptr);
|
Und in der Funktion wird am Ende, nachdem alles verarbeitet wurde
folgender Code ausgeführt:
Aufgerufen wird meine Funktion mit:
1 | valEnd = valStart;
|
2 | int value = decode(valStart, &valEnd);
|
Doch das Problem ist, dass valStart und valEnd immer gleich sind. Die
Funktion arbeitet korrekt und gibt das richtige Ergebnis zurück. Jedoch
kann ich die Überprüfung:
1 | if(valEnd - valStart) {
|
2 | ...
|
3 | }
|
nicht vornehmen, weil die Aussage jedesmal 0 ergibt. Ich habe die Sache
mit Pointer und Pointer auf Pointer etc. nicht ganz drauf, deswegen seht
es mir nach, wenn der Fehler offensichtlich ist und ich nicht drauf
komme.
Ich hoffe ihr könnt mir helfen.
Vielen Dank im voraus und einen schönen Sonntag.