mikrocontroller.net

Forum: Compiler & IDEs Variable in Variable


Autor: Der Matze (naeschd)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wieso machst du das nicht mit einem struct?

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Matze (naeschd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Timo

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: der mechatroniker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int red, green, blue, *color;

// ...
color = &red;
*color += 1;
*color -=5;
// ...
color = &green;
*color = 77;

Autor: Tobias T. (thelaughingman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du die zur Identifizierung nicht unbedingt einen String nehmen 
musst geht es auch ganz billig:
#define COLOR_RED   0
#define COLOR_GREEN 1 
#define COLOR_BLUE  2

unsigned char color[3] = {0,0,0};

color[COLOR_RED]++;

Autor: Der Matze (naeschd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
> Welche Sprache ist das ursprünglich?

Ich meine sowas mal in Php gesehen zu haben

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PHP:
$red = 0;
$green = 0;
$blue = 0;

$color = 'green';

$$color += 1;

Autor: Timmo H. (masterfx)
Datum:

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

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jo. In C nennt man das Vektor oder Zeiger :-}

Autor: Der Matze (naeschd)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
struct {
  int red;
  int green;
  int blue;
} colors;

struct {
  const char *const name;
  int *color;
} mapping[] = {
  { "red", &colors.red },
  { "green", &colors.green },
  { "blue", &colors.blue }
};


void set_color(char *name, int color) {
  for (size_t i = 0; i < sizeof(mapping) / sizeof(mapping[0]); i++) {
    if (strcmp(mapping[i].name, name) == 0) {
      *(mapping[i].color) = color;
      break;
    }
  }
}


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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.