Wie kann ich wissen, welcher Variablenwert für die Vereinigung festgelegt ist?

7

Ich arbeite an der Optimierung eines Projekts. Es enthält eine Struktur von Optionen, in denen Benutzer eine einzelne Option gleichzeitig auswählen können. Zusätzlich zu dieser Option verwenden wir auch eine Flag-Variable, um zu prüfen, welcher Optionswert für diesen Datensatz gesetzt ist.      Um es speichereffizient zu machen, möchte ich struct in eine Union umwandeln. Aber woher weiß ich, welche Variable Wert in Union festgelegt ist. Weil es keine Einschränkung in der Union gibt, um einen Wert einer Variablen abzurufen, der nicht gesetzt ist.

%Vor%     
Fadie Filat 10.10.2014, 10:21
quelle

2 Antworten

14

Haben Sie versucht,%% %%% in einem% union ? Sehen wir uns das folgende Beispiel an:

%Vor%

Die Union ( struct ) reserviert Speicher für ihre größte Variable und Sie können ihren Wert setzen und Ihre Struktur (Datensatz) wird diesen Union-Speicherblock verfolgen und der options Flag-Wert könnte gesetzt werden, der sagt Ihr Programm, um die pentricular Variable der Vereinigung zu holen.

    
Ali 10.10.2014, 10:25
quelle
16

Gewerkschaften leiden unter einem Problem, dass es keinen einfachen Weg gibt zu wissen, welches Mitglied einer Gewerkschaft zuletzt geändert wurde. Um diese Informationen im Auge zu behalten, können Sie union in eine Struktur einbetten, die ein anderes Mitglied hat (" Tag-Feld " oder " discriminant " genannt). Der Zweck des Tag-Feldes besteht darin, zu erinnern, welches Mitglied geändert / aktualisiert wurde. Sie können dies versuchen:

%Vor%

Aber in Ihrem Fall müssen Sie nicht sechs separate Mitglieder für die Gewerkschaft schreiben, da alle von int type sind. Daher kann es auf

reduziert werden %Vor%

Lassen Sie uns die Verwendung des Tag-Feldes mit einem einfachen Beispiel verstehen. Angenommen, wir möchten ein Array, das Daten vom Typ int und double speichern kann. Dies wird möglich durch Verwendung von union . Definieren Sie zuerst einen Union-Typ, der entweder int oder double speichert.

%Vor%

Als nächstes müssen wir ein Array erstellen, dessen Elemente Num type

sind %Vor%

Angenommen, wir möchten das Element 0 von num_arr dem Speicher 25 zuweisen, während das Element 1 speichert 3.147 . Dies kann als

erfolgen %Vor%

Nun nehmen wir an, dass wir eine Funktion schreiben müssen, die die num_arr -Elemente ausgibt. Die Funktion wäre so:

%Vor%

Warte! Wie könnte print_num entscheiden, ob n eine Ganzzahl oder double enthält?

Dies wird mit dem Tag-Feld gemacht:

%Vor%

Jedes Mal, wenn einem Mitglied von u ein Wert zugewiesen wird, muss kind muss 1 auf% festgelegt werden. co_de% oder INT , um daran zu erinnern, welchen Typ wir tatsächlich gespeichert haben. Zum Beispiel:

%Vor%

Die Funktion DOUBLE wäre wie folgt:

%Vor%

1 : Es liegt in der Verantwortung des Programmierers, das Tag-Feld bei jeder Zuweisung zum Member von print_num zu aktualisieren. Das zu vergessen führt zu einem Bug, wie in Kommentar von @ j_random_hacker .

    
haccks 10.10.2014 10:23
quelle

Tags und Links