tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
498
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    paul10 paul10 ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    21
    Hallo,
    Ich muss ein Programm für die Schule schreiben.
    Dabei funktioniert auch alles soweit.

    Nur wenn ich mehr als 1 Element hinzufüge bekomme ich leider nur Fehler
    Ich habe schon einiges probiert und auch schon einige Tutorials gelesen, hat mir leider nicht weiter
    geholfen.

    Das Programm verwaltet ein Adressebuch:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    
    #include <stdlib.h>
    // Wird für Ein/Ausgabe gemacht
    #include <stdio.h> 
    #include <string.h>
     
    /**
      * Im struct ADDRESS wird die Adresse der Person gespeichert.
      */
    typedef struct{
        int plz;
        int hausNr;
        char strasse[100];
        char ort[100];
    }ADDRESS;
     
    /**
      * Im struct PERSON werden die Daten zur Person gespeichert. Zudem wird noch ein ADDRESS struct gespeichert
      * 
      */
    typedef struct{
        int id;
        char vorname[50];
        char nachname[100];
        char telefon[50];
        ADDRESS ad;
    }PERSON;
     
    // Prototypendefinition
    int del(PERSON *pr, int psize);
    int add(PERSON *pr, int psize);
    int ls(PERSON *pr, int psize);
     
    /**
      * In der Main-Methode wird dem Benutzer anzeigt was er zu tun hat,  die Werte zu berechnen eingelesen und die entsprechenden Methoden werden aufgerufen.
      *
      * @param argc Anzahl der Parameter die übergeben wurde
      * @param argv Char-Array in dem die übergebenen Parameter stehen
      */
    int main( int argc, char** argv )
    {
        char c,x;
        // Speicher für die Daten wird reserviert
        PERSON *ipoint = (PERSON*)malloc(1*sizeof(PERSON));
     
        int psize = 0;
        
        // Konnte kein Speicher reserviert werden, dann wird das Programm abgebrochen
        if( ipoint == NULL)
        {
            printf("Fehler bei Speicherreservierung!\n");
            return -1;
        }
        
        printf("Willkommen zu meinem Adressbuch-Verwaltungsprogramm!\n\n");
        printf("Wollen Sie loeschen(d), neuer Eintrag(n), eintraege Listen(l) oder Programm beenden(e)\n");
        scanf("%c", &c);
     
        // Schleife die solange läuft, wie der Benutzer Daten eingeben will.
        do{
            // Dementsprechend, was der Benutzer eingegeben hat, wird in der switch-case entschieden
            switch( c )
            {
                case 'd':
                    psize = del(ipoint, psize);
                    break;
                case 'n':
                    psize = add(ipoint, psize);
                    break;
                case 'l':
                    ls(ipoint, psize);
                    break;
                case 'e':
                    return 1;
                default:
                    printf( "Falsche Eingabe!!\n" );
            }
     
            // Benutzer wird nach einer Eingabe gefragt
            printf("Wollen Sie loeschen(d), neuer Eintrag(n), eintraege Listen(l) oder Programm beenden(e)\n");
            scanf("%c", &c);
            fflush(stdin);
        }while(c != 'e' ); // do-While Schleife für nochmal berechnen
     
        return 1;
    }
     
    /**
      * In der Funktion del kann ein Struct gelöscht werden. Dazu wird dem Benutzer die ID des jeweiligen Eintrages gezeigt.
      * Durch Eingabe der ID, kann das Element dann anschließen gelöscht werden.
      */
    int del(PERSON *pr, int psize)
    {
        int c, i=0,x;
        fflush(stdin);
        printf("\nWelchen Eintrag wollen Sie löschen?\n");
     
        // Elemente werden dem Benutzer angezeigt
        for(;i < psize; i++)
        {
            printf("\n------------------------\n");
            printf("ID: %d\n", pr[i].id);
            printf("Nachname: %s\n", pr[i].nachname);
            printf("Vorname: %s\n", pr[i].vorname);
            printf("------------------------\n");
        }
        // ID wird vom Benutzer eingefragt.
        printf("\n***\nBitte ID eingeben:");
        scanf("%d", &x);
        fflush(stdin);
     
        // Wenn Eingabe im Wertebereich war.
        if( x <= psize)
        {
            // entsprechendes Element wird gelöscht
            free(pr+x);
        }
     
        psize--;
        return psize;
    }
     
    /**
      * In der Methode add kann ein neues Element hinzugefügt werden
      */
    int add(PERSON *pr, int psize)
    {
        char c[100];
        int x;
        // Speicher für ein weiteres Element wird reserviert
        pr = (PERSON*)realloc( pr, (psize+1) * sizeof(PERSON));
     
        // Ist die Speicherreservierung fehlgeschlagen, dann wird die Methode beendet
        if( pr == NULL )
            return -1;
     
        // id wird psize zugewiesen
        pr[psize].id = psize;
     
        // Die Daten für die Person werden vom Benutzer eingelesen
        printf("Nachname: ");
        scanf("%s", &c);
        fflush(stdin);
        strcpy(pr[psize].nachname, c);
        
        printf("Vorname: ");
        scanf("%s", &c);
        fflush(stdin);
        strcpy(pr[psize].vorname, c);
     
        printf("Telefonnummer: ");
        scanf("%s", &c);
        fflush(stdin);
        strcpy(pr[psize].telefon, c);
        
        printf("Ort: ");
        scanf("%s", &c);
        fflush(stdin);
        strcpy(pr[psize].ad.ort, c);
     
        printf("Strasse: ");
        scanf("%s", &c);
        fflush(stdin);
        strcpy(pr[psize].ad.strasse, c);
     
        printf("Hausnummer: ");
        scanf("%d", &x);
        fflush(stdin);
        pr[psize].ad.hausNr = x;
     
        printf("PLZ: ");
        scanf("%d", &x);
        fflush(stdin);
        pr[psize].ad.plz = x;
     
        // Ein Element mehr->psize wird um 1 erhöht
        psize = psize +1;
        return psize;
    }
     
    int ls(PERSON *pr, int psize)
    {
        int i=0;
     
        // Wurde noch kein Element hinzugefügt, bzw. alle bestehenden gelöscht
        if( psize == 0 )
        {
            printf("\n\nNO ELEMENTS IN STRUCT!\n");
            return -1;
        }
     
        // Existieren noch Elemente, dann werden diese ausgegeben
        printf("\n\nLISTE DER ELEMENTE:\n %d", psize);
     
        for(;i < psize; i++)
        {
            printf("------------------------\n");
            printf("\tID: %d\n", pr[i].id);
            printf("\tNachname: %s\n", pr[i].nachname);
            printf("\tVorname: %s\n", pr[i].vorname);
            printf("\tTelefonnummer: %s\n", pr[i].telefon);
            printf("\tOrt: %s\n", pr[i].ad.ort);
            printf("\tStrasse: %s\n", pr[i].ad.strasse);
            printf("\tHausnummer: %d\n", pr[i].ad.hausNr);
            printf("\tPLZ: %d\n", pr[i].ad.plz);
            printf("------------------------\n");
        }
     
        return 1;
    }

    Ich würde mich über eine schnelle Antwort freuen
    und bedanke mich schon ganz herzlich im vorraus******

    MfG
    Geändert von paul10 (09.12.11 um 00:01 Uhr) Grund: Code aktualisiert
     

  2. #2
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    NULL und malloc(0*...) ist nicht das Gleiche.
    Mach wirklich ein malloc am Anfang.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    paul10 paul10 ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    21
    OK, Danke erstmal, hatte ich leider auch schon probiert, werd ich aber sofort nochmal testen.

    mfg
     

  4. #4
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Wenns nicht geht: Debugger: In welcher Zeile passierts?
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  5. #5
    paul10 paul10 ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    21
    So hab ich jetzt probiert mit
    PERSON *ipoint = (PERSON*)malloc(1*sizeof(PERSON));

    jetzt ist es möglich ein Element hinzuzufügen
    reserviere ich mir dann aber mit realloc für das nächste Element Speicher, dann dürfte ich wieder
    auf die falsche Speicherstelle zugreifen

    mfg

    und zum Debugger: Das Programm wird nicht unterbrochen, erst bei der Funktion ls wird dann einfach nur Blödsinn ausgegeben...
    Geändert von sheel (09.12.11 um 10:36 Uhr) Grund: Doppel
     

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von sheel Beitrag anzeigen
    NULL und malloc(0*...) ist nicht das Gleiche.
    malloc darf NULL zurückgeben wenn als Argument 0 angegeben wurde. Oder es gibt einen Zeiger auf 0 Bytes Speicher zurück...

    Aber warum sollte man eine Person anlegen, wenn man überhaupt keine Daten hat? Initialisiere doch einfach ipoint mit NULL - dafür brauchst du doch keine Funktion aufrufen...

    @paul10: Geh doch im Debugger einfach Zeile für Zeile durch und schau dir genau an was passiert. So groß ist dein Programm doch nicht...

    \edit: Hab mir dein Programm mal näher angeschaut.

    Bemerkungen:
    Code c:
    1
    2
    3
    4
    
      printf("Nachname: ");
      scanf("%s", &c);
      fflush(stdin);
      strcpy(pr[psize].nachname, c);
    Erstmal ist fflush auf Eingabeströme nicht definiert. (http://faq.cprogramming.com/cgi-bin/...&id=1043284351)

    Von statischen Array kann man keine Adresse ermitteln. Deswegen verwendet man den & Operator nicht bei Arrays (bei dem c). (ich erhalte eine Warnung weil das Format und der Typ nicht passt)

    Und warum machst du das so kompiliziert? Lies doch einfach den Wert direkt in die Struktur ein.

    Außerdem hast du keine Fehlerprüfung gemacht. Du solltest psize nur inkrementieren wenn auch alle Werte korrekt eingelesen wurden.

    Dann übergibst du den Funktionen add und del eine Kopie des Zeigers ipoint. D.h. nachdem die Funktion zurückgekehrt ist, ist der Wert des Zeigers ipoint unverändert. Du müßtest die Adresse von ipoint übergeben (einen Zeiger auf den Zeiger), damit der Wert in der Funktion geändert werden kann.
    Code c:
    1
    2
    3
    4
    5
    
    int add(PERSON **ppr, int psize) {
      ...
    }
     
    add(&ipiont, psize);

    Die del Funktion ist noch komplett falsch. Erstens darf x nicht <= psize sein, sondern muß echt kleiner sein. Dann kannst du nicht einfach ein beliebiges Element mit free löschen. Du mußt vielmehr alle Elemente die hinter dem zu löschenden Eintrag stehen um 1 Position nach links schieben (siehe memmove).

    Gruß
    Geändert von deepthroat (09.12.11 um 07:55 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  7. #7
    paul10 paul10 ist offline Mitglied
    Registriert seit
    Apr 2009
    Beiträge
    21
    so, konnte es jetzt endlich lösen, vielen Dank an alle

    mfg
     

Ähnliche Themen

  1. Dynamische Speicherverwaltung
    Von Googlehupf im Forum C/C++
    Antworten: 11
    Letzter Beitrag: 17.01.12, 23:19
  2. Dynamische Speicherverwaltung
    Von rainer82 im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 21.10.09, 08:00
  3. Dynamische Speicherverwaltung mit malloc
    Von wims_live im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 21.01.09, 08:13
  4. dynamische Speicherverwaltung
    Von ollek81 im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 12.06.02, 22:26

Stichworte