Datentyp definieren



  • Hi, hab da ein Problem bei einer Aufgabe für die Uni. Die Zeile war in meinem anderen Beitrag auch schon dabei, aber der ist jetzt futsch (werden die Beiträge immer gelöscht?)

    Also, die Aufgabe lautet:

    Führen Sie für die zu verwendenden Zeichenketten (Länge 30) einen neuen Datentypen STR30 ein.

    Wir haben nie gelernt wie das geht, aber ich habs so probiert:

    typedef char STR30[30];
    

    funktioniert aber irgendwie nicht, das hier hat auch nicht funktioniert (hat einer in meinem letzten Beitrag gepostet):

    typedef char[30] STR30;
    

    Ist bestimmt ganz einfach mein Problem, hab aber nichts drüber finden können.



  • typedef char STR30[30];
    funktioniert

    und
    typedef char[30] STR30;
    funktioniert nicht

    wo ist das problem?



  • hmm, dann muss das Problem woanders liegen.
    Ich schreib mal mein komplettes bisheriges Programmfragment. Soll am Ende irgendwann mal ne Studentenverwltung werden.
    Ich hoffe dann kann mir einer sagen was sonst falsch ist.
    Ich hab ein bischen ein Problem damit die einzelnen Unterprogramme zu schreiben, wenn die Aufgabe aus 12 Teilaufgaben besteht. Info ist bei mir nur "Nebenfach", hab da noch einiges zu lernen.

    [cpp]#include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    /*******************************************/
    /****************** Informatik Praktikum /
    /************************ SS 2004 /
    /
    /

    /*****/
    /***** Aufgabenteil 1 /
    /
    /

    /* globale Definitionen */
    typedef char STR30[30];

    #define MAX_PRUEFUNGEN 15

    /* Struktur Personalien */
    typedef struct personalien
    {
    STR30 vorname, nachname, strasse, ort;
    int hausnummer, plz;
    }PERSONALIEN;

    /* Struktur Pruefung */
    typedef struct pruefung
    {
    STR30 name;
    int note;
    }PRUEFUNG;

    /* Struktur Student */
    typedef struct student
    {
    int matrikelnummer, fachsemesterzahl, anz_pruefungen;
    PERSONALIEN personalien;
    PRUEFUNG *ptr_pruefung[2];
    struct student *next_student;
    }STUDENT;

    /*****/
    /***** Aufgabenteil 2 /
    /
    /

    STUDENT *head = NULL;

    /* Zeichenkette einlesen */
    STR30 string30_einlesen()
    { 1
    int i;
    STR30 ausgabe;

    for(i=0;ausgabe[i-1] != '\n' && i<29;i++)
    ausgabe[i]=getchar();
    ausgabe[i]='\0';

    return (ausgabe); 2
    }

    /* Studentendaten einlesen */
    STUDENT daten_einlesen()
    {
    STUDENT ausgabe;

    printf("Personalien eingeben:\n");

    printf("\nVorname : ");
    ausgabe.personalien.vorname = string30_einlesen(); 3

    printf("\nNachname : ");
    ausgabe.personalien.nachname = string30_einlesen(); 4

    printf("\nStrasse : ");
    ausgabe.personalien.strasse = string30_einlesen(); 5

    printf("\nHausnr.: ");
    scanf("%i",ausgabe.personalien.hausnummer);

    printf("\nPLZ: ");
    scanf("%i",ausgabe.personalien.plz);

    printf("\nOrt : ");
    ausgabe.personalien.ort = string30_einlesen(); 6

    printf("\n\nabsolvierte Fachsemester: ");
    scanf("%i",ausgabe.fachsemesterzahl);

    return (ausgabe);
    }

    /* Listenelement erstellen */
    STUDENT create_studlist_element(STUDENT *student)
    {
    STUDENT *neu;

    neu = (STUDENT*)malloc(sizeof(STUDENT));
    if(neu == NULL)
    {
    printf("create_studlist_element: malloc failed\n");
    exit(1);
    }
    else
    {
    neu = student;
    }
    neu->next_student = NULL;

    return (neu); 7
    }

    /* Sortiertes Einfügen eines Listenelementes */
    void sorted_insert_studlist_element(int matrikelnummer , STUDENT *neu)
    {
    STUDENT *ptr;

    for(ptr = head; ptr->next_student->matrikelnummer < matrikelnummer; ptr=ptr->next_student)
    ; /* Leeranweisung */
    if(ptr->next_student->matrikelnummer == matrikelnummer)
    {
    printf("Matrikelnummer existiert bereits!");
    exit(0);
    }
    else
    {
    neu->next_student = ptr->next_student;
    ptr->next_student = neu;
    }

    return;
    }

    /* Studenten eingeben */
    void studenten_eingeben()
    {
    int matrikelnummer;
    STUDENT neuer_student;
    STUDENT neu;

    do
    {
    neuer_student.anz_pruefungen = 0;

    printf("\nneue Matrikelnummer (0 = ENDE): \n\n");
    scanf("%i",&matrikelnummer);
    neuer_student.matrikelnummer = matrikelnummer;

    neuer_student = daten_einlesen();

    neu = create_studlist_element(&neuer_student);
    neuer_student = neu;

    sorted_insert_studlist_element(matrikelnummer, &neuer_student);

    }while(matrikelnummer != 0);
    }[/cpp]

    1) error C2090: Funktionsergebnis ist ein Feld
    2) warning C4172: Adresse einer lokalen Variablen oder eines
    temporaeren Wertes wird zurueckgegeben
    3) error C2106: '=' : Linker Operand muss ein L-Wert sein
    4) error C2106: '=' : Linker Operand muss ein L-Wert sein
    5) error C2106: '=' : Linker Operand muss ein L-Wert sein
    6) error C2106: '=' : Linker Operand muss ein L-Wert sein
    7) error C2115: 'return' : Inkompatible Typen



  • Wo genau liegt jetzt dein Problem? Meldet der Compiler Fehler? Wenn ja, welche (Copy & Paste)? Oder stimmt was anderes nicht??



  • Sorry, war wohl bischen durch den Wind.
    Hab die Fehler die der Compiler meldet mal mit dicken Nummern markiert und die Fehlermeldungen unters Programm editiert.

    Hab heute nochmal bissel rumexperimentiert und die meisten Fehler kommen wohl dadurch, dass ich bei 2 eine Zeichenkette zurückgeben will. Denke das bekomme ich noch hin, aber warum 7 ein Fehler ist, das will nicht in meinen Kopf.

    So, ich hoffe diesmal hab ich genug Infos gegeben 😉



    1. Der Rückgabewert sollte ein char * sein
    2. Keine lokalen Variablen zurückgeben!
      Am besten übergibst du den String als Parameter:
    char * string30_einlesen(char * ausgabe)
    
        1. Folgefehler aus 1)
    1. Der Rückgabewert deiner Funktion sollte STUDENT * sein

    Außerdem muss jeder reservierter Speicher über malloc() bzw. calloc() und realloc() durch ein free() wieder freigegeben werden! Ansonsten gibts Speicherlecks.



  • 💡 Alles klar, danke. Jetzt müsste ich es hinbekommen.
    Was doch so'n kleiner vergessener Stern anrichten kann :p


Anmelden zum Antworten