2017-10-30 4 views
-2

Ich habe im Moment mit diesem Problem zu kämpfen. Ich habe eine Union, die ein Mitglied Struct + Variablen hat, die Member-Struktur enthält auch eine Member-Struktur + Variablen, diese Member-Struktur enthält Variablen.Daten in einer Union überschrieben werden

Ich habe festgestellt, dass beim Versuch, Werte bestimmten Variablen zuzuweisen, ich überschreibe einige der zuvor zugewiesenen Daten. Ich habe das gute Gefühl, dass dies darauf zurückzuführen ist, dass ein Zeiger nicht inkrementiert wird. Einige Beispiel-Code unten:

struct Scale 
{ 
    char Scale_Name[5]; 
    char notes[10]; 
}; 

struct Instrument 
{ 
    char Inst_Name[5]; 
    struct Scale scales[5]; 
}; 

union Whole_Inst 
{ 
    char InstrumentCount; 
    struct Instrument Instruments[2]; 
}; 

union Whole_Inst Instrument1; 

int main(void) 
{ 
    char i, j, k; 
    char TempArr[5] = {0x01, 0x02, 0x03, 0x04, 0x05}; 
    char NUMBER_OF_INST = 1; 

    Instrument1.InstrumentCount = TempArr[0]; 

    printf("InstCount = 0x%x\n", Instrument1.InstrumentCount); 

    for(j = 0; j < NUMBER_OF_INST; j++) 
    { 
     for(i = 0; i < 4; i++) 
     { 
      Instrument1.Instruments[0].Inst_Name[i] = TempArr[i+1]; 
      printf("\nInstName[%d] = 0x%x", i, 
      Instrument1.Instruments[0].Inst_Name[i]); 
     } 
    } 

    printf("\n\nInstCount = 0x%x\n", i, Instrument1.InstrumentCount); 

    system("PAUSE");  
    return 0; 
} 

bekomme ich folgende Ausgabe:

InstCount = 0x1 

InstName[0] = 0x2 
InstName[1] = 0x3 
InstName[2] = 0x4 
InstName[3] = 0x5 

InstCount = 0x4 
Press any key to continue . . . 

Könnte jemand bitte zeigen Sie mir in die richtige Richtung.

Mit freundlichen Grüßen David

+2

Warum verwenden Sie eine Union? Sollte es nicht eine Struktur sein? –

+0

Wenn Sie 'Instrument1.InstrumentCount' einstellen, überschreiben Sie tatsächlich die Gerätedaten - Gewerkschaftsmitglieder ordnen demselben Speicherplatz zu. Wenn Sie also ein Mitglied ändern, werden alle Gewerkschaftsmitglieder geändert. Es macht keinen Sinn, dass Sie dafür eine Union verwenden. – xxbbcc

+1

Weißt du, wofür "Union" ist? Dies ist genau das, was es tut. –

Antwort

3

Ihre union können Sie entweder eine Zählung oder ein Array von Inustrument s speichern, aber nicht beides. Die zwei Daten teilen sich den gleichen Speicher. Wenn Sie einen ändern, schreiben Sie den Speicher des anderen.

Wenn Sie sowohl eine Zählung als auch ein Array speichern möchten, müssen Sie struct anstelle von union verwenden.

Verwandte Themen