Hallo,
On Tue, May 10, 2022 at 11:54:52PM +0200, Sebastian Reinhardt wrote:
struct config_values { int config_number; string config_name; };
std::vector<config_values> config_vec
Als Beispieldaten habe ich folgende Werte:
config_vec[1].config_number = 4;
config_vec[1].config_name = led_alarm;
config_vec[2].config_number = 17;
config_vec[2].config_name = led_normal;
config_vec[3].config_number = 18;
config_vec[3].config_name = valve_1;
// usw.........
Nun möchte ich z.B. die Funktion "gpioWrite(GPIO_NO,Value)" nutzen, um die LED aus- bzw. einzuschalten. Dafür mochte ich die GPIO-Nummer "4" durch eine Variable ersetzen, in der die Nummer mit dem Suchstring "led_alarm" gefunden wird, da ich per csv-Datei die Nummer neu zuordnen kann, ohne das Programm neu zu kompilieren.
nu ja...
namespace {
int lookup(std::vector<config_values> const& v, std::string const& key) { auto it = find_if(begin(config_vec), end(config_vec), [key&](auto const& c) { return c.config_name == key; }); if (it != std::end(config_vec)) { return it->config_number; }
throw std::runtime_error(std::string("invalid config key")); }
}
...
try { gpioWrite(::lookup(config_vec, "led_alarm"), 0); } catch (std::runtime_error const& e) { ... }
oder Du nimmst halt ne std::map gleich vorn weg. Man könnte den vector dazu nachträglich umbauen eg.
auto config_map = std::map<std::string, int>{} ; std::transform(begin(config_vec) end(config_vec), std::inserter(config_map), [](auto const& e) { return std::make_pair(e.config_name, e.config_number); });
gpioWrite(config_map["led_alarm"], 0);
dat sieht zwar hübsch aus... hat aber kein Error handling.. eg. wenn Du nen lookup nach nem String machst, den's nicht gibt kommt 0 zurück...
try { gpioWrite(config_map.at("led_alarm"), 0); } catch (std::out_of_range const& e) { ... }
wäre eine Variante...
ich hab den Code nicht durch den Compiler geschickt. Da mögen Fehler drin sein.. is bloss das Prinzip.
Grüsse Andreas