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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: C: Datentausch bei enum und struct

  1. #1
    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
    hey, ich hab ein kleines projekt in C zu schreiben, komme aber überhaupt nicht weiter. Vielleicht hat von euch einer ne idee.
    Folgendes:
    Ich habe eine Enum am anfang definiert, welche in eine Struct eingebunden ist. Nun möchte ich zwei Werte über pointer miteinander tauschen. Dabei ist ein Datentyp teil der Enum, der andere ist Int. Kann ich die beiden datentypen irgenwie casten?

    Code:
    typedef enum {...} AUFZ;
    
    typedef struct Table
    {
    char .... int Ergebnis AUFZ Aufzählung
    } main(void) AUFZ *pTemp AUFZ *pAlt AUFZ *pNeu pAlt = &Table[i].Aufzählung pNeu = &Table[i].Ergebnis (Hier ist das Problem; wenn ich den Pointer pNeu anders, also nich über geschenke definiere, dann habe ich das problem später, bei:) pTemp = *pAlt; *pAlt = *pNeu; *pNeu = pTemp; ...
    Hat einer ne idee? ich bin seit zwei abenden am verzweifeln x)
    mfg
    Stift
    Zitieren Zitieren C: Datentausch bei enum und struct  

  2. #2
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.745
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Also willst du einen int in enum casten?

    Vielleicht hilft dir ein union weiter? http://de.wikibooks.org/wiki/C-Progr...entypen#Unions

    Edit: glaub das ist blödsinn was ich hier geschriben habe, blick nicht ganz was du machen willst!
    Geändert von Jochen Kühner (27.04.2011 um 23:20 Uhr)
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  3. #3
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Irgendwie ist dein Beispiel-Code etwas konfus...
    Aber mal angenommen du hast irgendwo nochmal Table als Array definiert und das typedef hat dann einen anderen Namen, könnte folgender Cast funktionieren:
    Code:
    pNeu = (AUFZ*)&Table[i].Ergebnis;
    Es hängt aber vom Compiler und C-Standard ab, ob das Ergebnis dann definiert ist.

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

    Standard

    ja, genau;
    thomas hat mein problem schon verstanden.
    einen array hab ich definiert - dummerweise aber vergessen ins forum reinzutippen - sorry

    den fehler hab ich allerdings immer noch.
    ich hab die beiden pointer folgendermaßen definiert:
    Code:
    pAlt = &Array[i].Gegenstand;
    pNeu = (AUFZ*)&Array[i].iErgebnis;
    Beim Tauschvorgang stürzt mein compiler allerdings jedes mal ab.
    Code:
            *pTemp = *pAlt;
            *pAlt = *pNeu;
            *pNeu = *pTemp;
    mfg
    Stift

  5. #5
    Registriert seit
    27.10.2005
    Ort
    Schwäbisch Gmünd
    Beiträge
    5.224
    Danke
    630
    Erhielt 955 Danke für 769 Beiträge

    Standard

    Die Größe eines int muss nicht gleich der Größe einer enum sein. Dies kann natürlich zu einem Problem führen. Außerdem sehe ich nirgends, wo der Speicher allokiert wird. Ist dies in ausreichender Größe getan worden?
    Was bedeutet "Compiler stürzt ab"? Welche Fehlermeldung gibt er aus? Erzeugt er einen BSOD? Oder läuft die Anwendung nicht? Gibt es in der Entwicklungsumgebung einen Ausnahmefehler?
    Rainer Hönle
    DELTA LOGIC GmbH

    Ein Computer kann das menschliche Gehirn nicht ersetzen. Engstirnigkeit kann unmöglich simuliert werden. (Gerd W. Heyse)

  6. #6
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Zeig doch bitte mal einen compilierbaren Programmcode, und nicht immer solche Programmschnippsel die kein Compiler frisst.

    Aber ich denke mal du hast da noch ein Problem mit den Zeigern:
    Code:
    AUFZ *pTemp; /* Variable für einen Zeiger auf den Typ AUFZ */
    AUFZ *pAlt;  /* Variable für einen Zeiger auf den Typ AUFZ */
    AUFZ *pNeu;  /* Variable für einen Zeiger auf den Typ AUFZ */
    Damit legst du Variablen für einen Zeiger auf den Datentyp AUFZ an.
    Code:
    pAlt = &Array[i].Gegenstand;
    pNeu = (AUFZ*)&Array[i].iErgebnis;
    pAlt zeigt jetzt auf Array[i].Gegenstand.
    pNeu zeigt jetzt auf Array[i].iErgebnis.

    Code:
    *pTemp = *pAlt;
    Und hier versuchst du, der Variablen auf die pTemp zeigt den Wert zuzuweisen auf den pAlt zeigt. Und worauf zeigt pTemp?
    Ich sehe zumindest keine Zuweisung.

    Wenn du den Zeiger pTemp vorher nicht auf eine gültige Speicherstelle zeigen lässt, zeigt pTemp auf einen zufälligen (und aller Wahrscheinlichkeit nach) nicht gültigen Wert. Beim Zugriff auf diese Speicherstelle bekommst du unter einem Betriebssystem einen Speicherzugriffsfehler, bei einem Mikrocontroller ohne Betriebssystem zerschießt du dir deinen Speicher.

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

    Standard

    danke schon mal euch beiden.
    den speicher habe ich noch nirgends allokiert. ich habe von malloc zwar mal was gelesen, habe allerdings nicht verstandent, was ich damit anfangen kann.

    ptemp soll eine zwischenvariable sein, da ich möchte, dass die inhalte von palt und pneu getauscht werden.

    das ganze is ne heimarbeit, für die uni. aber ich will ehrlich gesagt nicht, dass ihr mir was ausbessert und die sache läuft.
    wär cool, wenn ihr mir tipps geben könntet, damit ich nen ansatz habe und bisschen weiter komme aber dabei auch was lerne.
    damit habt ihr mir ja vor drei jahren in der sps-technik wahnsinnig viel beigebracht.

    Ziel der aufgabe ist, dass zwei studenten ihr geschenk tauschen.
    ein wichtelprogramm
    folgenden code habe ich geschrieben:

    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;
    };
    
    
    main(void)
    {
        struct Table Student[6];
        int i;
        char szGeschenk[12];
        GESCHENKE *pTemp=NULL;
        GESCHENKE *pAlt=NULL;
        GESCHENKE *pNeu=NULL;
    
        //Schleife der Namens- und Geschenkeingabe
        for(i=0; i<=1; 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<=1; i++)
        {
            printf("%s wuerfelt: ", Student[i].szName);
            scanf("%i", &Student[i].iErgebnis);
    
            //Schleife zur Überprüfung korrekter Würfelergebnisse
            while (Student[i].iErgebnis<=0 || Student[i].iErgebnis>=7)
            {
                printf("Falscheingabe: Bitte noch einmal wuerfeln!\n");
                printf("%s wuerfelt: ", Student[i].szName);
                scanf("%i", &Student[i].iErgebnis);
            }
    
            //Tauschvorgang
            pAlt = &Student[i].Gegenstand;
            pNeu = (GESCHENKE*)&Student[i].iErgebnis-1;
    
            *pTemp = *pAlt;
            *pAlt = *pNeu;
            *pNeu = *pTemp;
            /////////////////////////////////////////////////////////////////////////////////
            
        }
    
        for(i=0; i<=1; 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);
    }
    mfg
    Stift

  8. #8
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Seltsames Programm

    Aber schau die meinen Hinweise mit dem nicht initialisiertem pTemp an.
    Das ist ein Grund warum es kracht.

    In dein neues Programm hast du noch einen weiteren Fehler eingebaut:
    Code:
    pNeu = (GESCHENKE*)&Student[i].iErgebnis-1;
    Was soll die -1 bewirken?
    So wie du es dort geschrieben hast, wird der Zeiger pNeu auf die Adresse der Variablen "Student[i].iErgebnis" minus 1 gesetzt.
    Mal angenommen die Variable Student[i].iErgebnis liegt im Speicher an Byteadresse 1000. dann zeigt pNeu auf Speicherstelle 999. Und da willst du sicherlich nicht drauf zugreifen

    Warum überhaupt der Umweg über Zeiger und keine direkte Zuweisung?

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

    Standard

    im anhang ein bild, wie das programm schlussendlich funktionieren soll. ich hab das ganze auch bereits hinbekommen, allerdings nicht über call by reference. und das ist teil der aufgabenstellung.
    Angehängte Grafiken Angehängte Grafiken
    mfg
    Stift

  10. #10
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von stift Beitrag anzeigen
    im anhang ein bild, wie das programm schlussendlich funktionieren soll. ich hab das ganze auch bereits hinbekommen, allerdings nicht über call by reference. und das ist teil der aufgabenstellung.
    Mit Pointern zu arbeiten würde da aber nur Sinn ergeben, wenn man den Geschenketausch in eine eigene Funktion verlegen würde.

    Als Anregung vielleicht so:
    Code:
    void geschenketausch(GESCHENKE *gesch, int *erg)
    {
    ...
    }
    oder noch allgemeiner:
    Code:
    void geschenketausch(Table *student1, Table *student2)
    {
    ...
    }
    Dann benötigt man auch diese Hilfsvariable als Zwischenspeicher, die aber kein Zeiger ist. Denn der Zeiger selber kann keinen Wert speichern sondern nur eine Adresse (Zeiger).

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

    stift (03.05.2011)

Ä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
  •