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!
wieso machst du das nicht mit einem struct? struct color_struct{ char red; char green; char blue; }color;
> 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.
@Timo kannst du das bitte noch ein bisschen genauer erklären... Bin noch ganz neu in C! Danke
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.
> 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?
1 | int red, green, blue, *color; |
2 | |
3 | // ...
|
4 | color = &red; |
5 | *color += 1; |
6 | *color -=5; |
7 | // ...
|
8 | color = &green; |
9 | *color = 77; |
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]++; |
Lothar Miller schrieb:
> Welche Sprache ist das ursprünglich?
Ich meine sowas mal in Php gesehen zu haben
PHP:
1 | $red = 0; |
2 | $green = 0; |
3 | $blue = 0; |
4 | |
5 | $color = 'green'; |
6 | |
7 | $$color += 1; |
PHP ist auch etwas anders. Das ist ja extra für String Handling usw. erstellt worden. In PHP nennt man das "Variable Variablen"
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.