Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 14 von 14

Thema: C: Datentausch bei enum und struct

  1. #11
    Registriert seit
    15.01.2008
    Ort
    München
    Beiträge
    256
    Danke
    76
    Erhielt 17 Danke für 14 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    soo, die anwendung läuft endlich.
    Code:
    /* Heimarbeit 5-3 */
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
     typedef enum {HOERBUCH,LEGOAUTO,DVD,BOOMERANG,JOJO,SPIELKARTEN} GESCHENKE;
        
    typedef struct Table
    {
        char szName[20];
        int iErgebnis;
        GESCHENKE Gegenstand;
    };
    void Geschenktausch(GESCHENKE *Student1, GESCHENKE *Student2)
    {
        GESCHENKE iTemp;
        iTemp = *Student1;
        *Student1 = *Student2;
        *Student2 = iTemp;
    };
    
    
    main(void)
    {
        struct Table Student[6];
        int i;
        char szGeschenk[12];
        GESCHENKE *pAlt=NULL;
        GESCHENKE *pNeu=NULL;
    
        //Schleife der Namens- und Geschenkeingabe
        for(i=0; i<=5; i++)
        {
        printf("Bitte geben Sie den Namen des %i. Studenten ein:\n", i+1);
        scanf("%s", &Student[i].szName);
    
        printf("Bitte geben Sie das Geschenk des %i. Studenten ein:\n", i+1);
        scanf("%i", &Student[i].Gegenstand);
        }
    
        //Schleife zur Würfelergenisseingabe und Aufruf der Schleife zum Tauschvorgang
        for(i=0; i<=5; i++)
        {
            printf("%s wuerfelt: ", Student[i].szName);
            scanf("%i", &Student[i].iErgebnis);
            Student[i].iErgebnis= Student[i].iErgebnis-1;
    
            //Schleife zur Überprüfung korrekter Würfelergebnisse
            while (Student[i].iErgebnis<0 || Student[i].iErgebnis>5)
            {
                printf("Falscheingabe: Bitte noch einmal wuerfeln!\n");
                printf("%s wuerfelt: ", Student[i].szName);
                scanf("%i", &Student[i].iErgebnis);
                Student[i].iErgebnis= Student[i].iErgebnis-1;
            }
    
            //Tauschvorgang
            if (Student[i].iErgebnis == i)
                 goto keinTausch;
            else
            Geschenktausch(&Student[i].Gegenstand, &Student[Student[i].iErgebnis].Gegenstand);
            keinTausch:;
        }
    
        for(i=0; i<=5; i++)
        {
            switch (Student[i].Gegenstand){
                case 0: 
                    strcpy(szGeschenk, "HOERBUCH");
                    break;
                case 1:
                    strcpy(szGeschenk, "LEGOAUTO");
                    break;
                case 2:            
                    strcpy(szGeschenk, "DVD");
                    break;
                case 3:
                    strcpy(szGeschenk, "BOOMERANG");
                    break;
                case 4:
                    strcpy(szGeschenk, "JOJO");
                    break;
                case 5: 
                    strcpy(szGeschenk, "SPIELKARTEN");
                    break;
            }
            
            printf("%s: %s \n", Student[i].szName, szGeschenk);
        }
    
        return(0);
    }
    ich habe es mit hilfe einer funktion gelöst, so wie du es angeregt hast. vielen dank.
    die zweite variante habe ich allerdings nicht hinbekommen, da ich schon wieder unverträgliche typen hatte, wegen der enum und der struct...
    wie müsste ich da denn das ganze adressieren. hab es folgendermaßen versucht, wobei ich allerdings gleich in der zweiten zeile der funktion die genannten probleme hatte:
    Code:
    void Geschenktausch(struct Table*Student1, struct Table *Student2)
    {
        int iTemp;
        iTemp = (*Table).Student1;
    ...
    };
    eine generelle frage habe ich allerdings noch.
    ich war immer der meinung, dass alle physikalischen adressen aus einer integer-zahl bestehen. warum habe ich dann immer diese probleme beim einsatz höherer datentypen?
    wenn ich einen pointer nutze, dann ist die adresse doch trotzdem eine ganzzahl, auch wenn ich dabei auf einen eigenen, höheren datentyp zugreife, oder?
    mfg
    Stift

  2. #12
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Zitat Zitat von stift Beitrag anzeigen
    die zweite variante habe ich allerdings nicht hinbekommen, da ich schon wieder unverträgliche typen hatte, wegen der enum und der struct...
    wie müsste ich da denn das ganze adressieren. hab es folgendermaßen versucht, wobei ich allerdings gleich in der zweiten zeile der funktion die genannten probleme hatte:
    Code:
    void Geschenktausch(struct Table*Student1, struct Table *Student2)
    {
        int iTemp;
        iTemp = (*Table).Student1;
    ...
    };
    Du musst auf das Strukturelement von Table passend zugreifen. Da der Zugriff auf Strukturen über Zeiger in C sehr häufig benötigt wird, hat man dafür den eigenen Operator -> eingeführt. Dann fällt der Dereferenzierungsoperator * weg.

    Als Ansatz:
    Code:
    void Geschenktausch(struct Table*Student1, struct Table *Student2)
    {
        GESCHENKE iTemp;
        iTemp = Student1->Gegenstand;
    ...
    Zitat Zitat von stift Beitrag anzeigen
    eine generelle frage habe ich allerdings noch.
    ich war immer der meinung, dass alle physikalischen adressen aus einer integer-zahl bestehen. warum habe ich dann immer diese probleme beim einsatz höherer datentypen?
    wenn ich einen pointer nutze, dann ist die adresse doch trotzdem eine ganzzahl, auch wenn ich dabei auf einen eigenen, höheren datentyp zugreife, oder?
    Der Compiler muss wissen auf welchen Datentyp der Zeiger zeigt. Ansonsten funktioniert die Pointerarithmetik nicht.
    Z.B. wird ein int-Pointer
    int *pInt;
    mit pint++ um sizeof(int) hochgezählt, welches auf 32-Bit Rechnern meistens den Wert 4 hat.
    Du könntest auch einen Zeiger auf deine Table anlegen.
    Table *pTable;
    Bei pTable++ wird dann der Zeiger um einen kompletten Struktursatz erhöht (20*sizeof(char) + sizeof(int) + sizeof(GESCHENKE)).

  3. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    stift (03.05.2011)

  4. #13
    Registriert seit
    29.03.2004
    Beiträge
    5.739
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Als Verfeinerung für deine switch-case Anweisung um die Geschenknamen auszugeben, kannst du einfacher folgendes machen:
    Code:
    const char *geschenknamen[7] = {"KEINS", "HOERBUCH", "LEGOAUTO", "DVD", "BOOMERANG", "JOJO", "SPIELKARTEN"};
    Dann kannst du die Geschenknamen ohne switch-case direkt aus dem enum-index auslesen:
    Code:
    printf("Geschenk: %s", geschenknamen[Student[0].Gegenstand]);

  5. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    stift (03.05.2011)

  6. #14
    Registriert seit
    15.01.2008
    Ort
    München
    Beiträge
    256
    Danke
    76
    Erhielt 17 Danke für 14 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    spitze, vielen dank für deine erklärungen. jetzt hab ich alles verstanden.
    auch das mit dem switch ist klasse.

    mir war die alte lösung auch zu umständlich, hab das letzte woche schon ma gegooglet und bin in irgend einem forum darauf gestoßen, dass es nicht möglich ist, das ganze ohne switch case zu machen

    nochmal danke
    mfg
    Stift

Ähnliche Themen

  1. String TO Enum
    Von hago10 im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 20.07.2011, 12:34
  2. Antworten: 5
    Letzter Beitrag: 08.04.2011, 14:36
  3. enum B&R
    Von Hannes im Forum Sonstige Steuerungen
    Antworten: 1
    Letzter Beitrag: 03.11.2008, 07:09
  4. Struct??
    Von broesel im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 20.12.2007, 09:41
  5. DB-Struct in DB-Struct transferieren
    Von Marvin II im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 20.11.2007, 08:29

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •