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-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.