URL: https://www.overclockers.at/coding-stuff/c-arduino-string-zu-variable-parsen_245089/page_1 - zur Vollversion wechseln!
in meinem arduino projekt habe ich 1000+ zeilen zum parsen von kommandos, variablen etc, die über die serielle schnittstelle hereinkommen:
hat jemand eine idee wie man das noch optimieren kann? ich würde gerne bei einem human readable protokoll bleiben.Code: CPPbool EEPROMHandler::stringToVariable(uint16_t device, char* string, uint16_t& variable) { if (device == EEPROMHandler::device_type_::GENERAL) { if (strcmp_P(string, PSTR("DISPLAY_AVAILABLE")) == 0) { variable = general_variable_:: DISPLAY_AVAILABLE; return true; } if (strcmp_P(string, PSTR("DISPLAY_TYPE")) == 0) { variable = general_variable_:: DISPLAY_TYPE; return true; } if (strcmp_P(string, PSTR("DISPLAY_RES_X")) == 0) { variable = general_variable_:: DISPLAY_RES_X; return true; } if (strcmp_P(string, PSTR("DISPLAY_RES_Y")) == 0) { variable = general_variable_:: DISPLAY_RES_Y; return true; } if (strcmp_P(string, PSTR("DISPLAY_UPDATE_INTERVAL")) == 0) { variable = general_variable_:: DISPLAY_UPDATE_INTERVAL; return true; } if (strcmp_P(string, PSTR("DISPLAY_BRIGHTNESS")) == 0) { variable = general_variable_:: DISPLAY_BRIGHTNESS; return true; } if (strcmp_P(string, PSTR("DISPLAY_CONTRAST")) == 0) { variable = general_variable_:: DISPLAY_CONTRAST; return true; } ...
Ich wuerde die ganzen Konstanten sauber in ein Array schreiben und dann via foreach drueber iterieren.
// Ah i see, da wirds ein Problem geben - in C++ laesst sich ein String nicht als Variablenname verwenden.. vielleicht faellt mir noch was ein.
json file falls das für c++ gibt 
danke für den tipp mit json, es gibt eine library für arduino dafür, die werde ich mir mal anschauen: https://github.com/bblanchon/ArduinoJson
ich bin aber trotzdem für weitere vorschläge offen 
Wie ist general_variable_:: DISPLAY_AVAILABLE definiert?
die werte sind offsets von einer EEPROM- startadresse. die variable DISPLAY_AVAILABLE hab ich mittlerweile gelöscht.Code: CPPstruct general_variable_ { enum GeneralVariable_t_ : uint16_t { //... DISPLAY_TYPE = 30, //(1 byte) display type. DISPLAY_RES_X = 32, //(2 byte) display resolution (x axis). DISPLAY_RES_Y = 34, //(2 byte) display resolution (y axis). DISPLAY_UPDATE_INTERVAL = 36, //(4 byte) display update interval in milliseconds. DISPLAY_CONTRAST = 40, //(1 byte) display contrast setting DISPLAY_BRIGHTNESS = 41, //(1 byte) display brightness setting //... } }
Asoo. Dann bleib ich bei meiner Variante. String-Array sauber aufstellen (ob jetzt ausm JSON, einem Textfile oder im Code, ist egal).
Mit foreach durchiterieren, wenn der strcmp matcht, return array val.
Das ist ein Dreizeiler.
Falls du deinen Enum behalten willst, obwohl enums nicht wirklich zum durchiterieren geeignet sind, koenntest du dir diese Iterator-Klasse ansehen:
http://www.drdobbs.com/when-enum-ju...ion-c/184403955
ich glaube ich stehe gerade auf dem schlauch. meinst du return array index?Zitat von ObermotzAsoo. Dann bleib ich bei meiner Variante. String-Array sauber aufstellen (ob jetzt ausm JSON, einem Textfile oder im Code, ist egal).
Mit foreach durchiterieren, wenn der strcmp matcht, return array val.
Das ist ein Dreizeiler.
die enums würde ich mir gerne behalten, sonst muss ich erst wieder an anderer stelle in einer lut die indices nachschlagen.Zitat von ObermotzFalls du deinen Enum behalten willst, obwohl enums nicht wirklich zum durchiterieren geeignet sind, koenntest du dir diese Iterator-Klasse ansehen:
http://www.drdobbs.com/when-enum-ju...ion-c/184403955
Also die schoenste Loesung waere eine Hashmap: http://stackoverflow.com/a/3578247
Zitat#include <map>
#include <iostream>
#include <cassert>


ich habe derzeit noch ca 160kb flash frei, aber das programm ist noch lange nicht fertig 
mein eigener naiver ansatz wäre gewesen ein array von structs zu erstellen:
dann könnte ich einfach drüber iterieren und den zum string passenden command zurückgeben, das würde aber wahrscheinlich in sachen geschwindigkeit, speicherverbrauch und lesbarkeit nix bringenCode: CPPstruct command_inst_ { const PROGMEM char* string; uint16_t command; }; command_inst_ command_list_[NUM_CMDS];
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025