Re: Rückgab e von mehrdimensionalem String in C++
Andreas Fett <[email protected]>
| Newsgroups | gmane.user-groups.linux.dresden |
|---|---|
| Message-ID | <[email protected]> |
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
signature.asc
(application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEJ6Jq1qpfVQ9CLff4NMc/tuPtDEAFAmJ66xIACgkQNMc/tuPt DEA0Kg/+KPFdqObTA2JBLU7CFserN1HAFyXX5srE/CrSVagvZ5JGD1MSLQ5yI/bw Xd2Ul6OCP6UMRyVm+YlESjMG6RD4ASRdkd/miu+ATFILEIZ6/7eTbwxpG6PapP0H C6FTAKJbQ48zEiowmwOh580jNfHLOCQVXEbyiIdUQIqgL0d36kyEIWA1slSvTgJ8 RMHmGMlW8MSoqPMIVfjFgjqu3MS1lDszcHd/+JwsJVQL39sIpz7Aost/rXIqKyPh eAVkjMlA3s5r5CA6SBwpi5l5c22FbOEX5aXYf833uHM+9c2jVs6fUnftHWKyWI05 SLa201/3xu3Nq4Z7+x2Vcwmg77//Z5Zt1HY4ixCIrBGlkWjR+x6Kzsm7C0iwPWf+ 2MlI74wALjB8etMZICJDhNvRB8GGDx4uphpma/eWKmZZpS0sbaK7zE0Or73zuK13 X7oIPCblpGBBcx8CkqwiBNzilytu6sTWhWADes8SxqCfQ3wNJK9Hc6vbpnCzNoUJ FR5L2yS0GFkRu+AvBhvHyG33MR1iUr9cJugkVn0/rY9g3/JXwDDwhA1e//7kr4Lp hJpP9qcKnTJ23PRSMVP1f2vdGpRl2Cuwx0tOOPajAhXoQpzpZrm5UFeDbQsDhGCk TecOcuvbM1JregHd3YVI+cTBJbZEjKOWfjIiZ9dHNe61ac/H2qk= =DN1k -----END PGP SIGNATURE-----