Forum: Compiler & IDEs Variable in Variable


von Der M. (naeschd)


Lesenswert?

Guten Abend miteinander.

Die Frage wird von euch wahrscheinlich schnell beantwortet sein:

Ich habe einen String. Sagen wir colour. Die kann die folgende "red", 
"blue", "green" und "yellow" haben.

Jetzt will ich wenn colour = "green" die Variable green (unsigned char) 
verändern... Genauso mit den anderen Farben.

Ich kann das natürlich mit if und case usw machen. Aber da gibt es doch 
bestimmt eine elegantere Lösung, oder?

Also so irgendwie:

color = "red";
.color += 1; //erhöht die Variable red um 1

color = "green";
.color += 1; //erhöht die Variable green um 1

Wäre nett wenn ihr mir da weiterhelfen könntet...
Danke!

von Timmo H. (masterfx)


Lesenswert?

wieso machst du das nicht mit einem struct?

struct color_struct{
  char red;
  char green;
  char blue;
}color;

von Rolf Magnus (Gast)


Lesenswert?

> Ich kann das natürlich mit if und case usw machen.

Mit case kannst du es nicht machen.

> Aber da gibt es doch bestimmt eine elegantere Lösung, oder?

case wäre die elegante Lösung, wenn sie ginge.

> Also so irgendwie:
>
> color = "red";
> .color += 1; //erhöht die Variable red um 1
>
> color = "green";
> .color += 1; //erhöht die Variable green um 1

Ach sowas suchst du.  Das gibt's in C nicht.

von Der M. (naeschd)


Lesenswert?

@Timo

kannst du das bitte noch ein bisschen genauer erklären... Bin noch ganz 
neu in C! Danke

von Karl H. (kbuchegg)


Lesenswert?

Das was du suchst, nennt sich "assoziatives Array" und wie Rolf schon 
schrieb: So was gibt es in C nicht.
Man könnte es selbst programmieren aber ich denke nicht, dass du schon 
soweit bist.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> color = "red";
Es gibt in C keine Stringzuweisungen und Stringvergleiche.
Ein String ist ein char-Array und wird mit strcpy() zugewiesen und mit 
strcmp() verglichen.

> color = "red";
> .color += 1; //erhöht die Variable red um 1
Welche Sprache ist das ursprünglich?

von der mechatroniker (Gast)


Lesenswert?

1
int red, green, blue, *color;
2
3
// ...
4
color = &red;
5
*color += 1;
6
*color -=5;
7
// ...
8
color = &green;
9
*color = 77;

von Tobias T. (thelaughingman)


Lesenswert?

Wenn du die zur Identifizierung nicht unbedingt einen String nehmen 
musst geht es auch ganz billig:
1
#define COLOR_RED   0
2
#define COLOR_GREEN 1 
3
#define COLOR_BLUE  2
4
5
unsigned char color[3] = {0,0,0};
6
7
color[COLOR_RED]++;

von Der M. (naeschd)


Lesenswert?

Lothar Miller schrieb:
> Welche Sprache ist das ursprünglich?

Ich meine sowas mal in Php gesehen zu haben

von Sven P. (Gast)


Lesenswert?

PHP:
1
$red = 0;
2
$green = 0;
3
$blue = 0;
4
5
$color = 'green';
6
7
$$color += 1;

von Timmo H. (masterfx)


Lesenswert?

PHP ist auch etwas anders. Das ist ja extra für String Handling usw. 
erstellt worden. In PHP nennt man das "Variable Variablen"

von Sven P. (Gast)


Lesenswert?

Jo. In C nennt man das Vektor oder Zeiger :-}

von Der M. (naeschd)


Lesenswert?

Könntet ihr mir da kurz ein kleines Beispiel zeigen. Wie gesagt ich 
beschäftige mich mit GCC noch nicht so lang. Ich weiß aber was ein 
Zeiger/vektor ist jedoch kann ich mir detailiert wies funktionieren soll 
leider noch nix vorstellen...

von Sven P. (Gast)


Lesenswert?

1
struct {
2
  int red;
3
  int green;
4
  int blue;
5
} colors;
6
7
struct {
8
  const char *const name;
9
  int *color;
10
} mapping[] = {
11
  { "red", &colors.red },
12
  { "green", &colors.green },
13
  { "blue", &colors.blue }
14
};
15
16
17
void set_color(char *name, int color) {
18
  for (size_t i = 0; i < sizeof(mapping) / sizeof(mapping[0]); i++) {
19
    if (strcmp(mapping[i].name, name) == 0) {
20
      *(mapping[i].color) = color;
21
      break;
22
    }
23
  }
24
}

Alternativ könnte man den Vektor auch von Hand sortieren und bsearch() 
benutzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.