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

Attachment: signature.asc
Description: PGP signature

Antwort per Email an