Stackdump bei Division

Alles was mit C/C++ unter NetBeans zu tun hat

Moderator: wegus

Antworten
xp10r3r
Beiträge: 6
Registriert: 08.07.2018, 16:10

Stackdump bei Division

Beitrag von xp10r3r » 26.07.2018, 11:15

Moin,

ich bin an einer weiteren Aufgabe dran. Hierbei soll für einen eingegebenen Geldbetrag die minimale Anzahl der jeweiligen Geldscheine und -münzen bestimmt werden.

Nachdem ich den Betrag eingelesen habe, bestimme ich, wie viele 500er Noten enthalten sind. Bei der Division Anzahl = Betrag / Divisor erhalte ich die Fehlermeldung, die im zweiten Screenshot angegeben ist. Verwerfe ich die Meldung erscheint nach kurzer Zeit der Fehler, der im dritten Screenshot zu sehen ist.

Was kann die Ursache sein?

Nebenbei ist mir noch aufgefallen, dass nach der Eingabe des Betrags bereits die Variablen 10er und 5er initialisiert sind, zu sehen auf dem ersten Screenshot.

Wie kann das sein? Die entsprechende Funktion hierfür würde erst später im Programmablauf folgen.

Compiler und NetBeans Versionen stimmen mit meinen anderen Posts überein, bspw. https://netbeans-forum.de/viewtopic.php?f=24&t=7751.

Viele Grüße

Code: Alles auswählen

#include <stdio.h>                                                              /* Praeprozessoranweisungen */

unsigned short einlesen_betrag(void);
unsigned short ermittle_anzahl(unsigned short betrag, unsigned short divisor);
unsigned short ermittle_rest(unsigned short betrag, unsigned short divisor);

void main(void) {                                                               /* Hauptfunktion */
    unsigned short betrag,
                   divisor,
                   anzahl,
                   _500er,
                   _200er,
                   _100er,
                   _50er,
                   _20er,
                   _10er,
                   _5er,
                   _2er,
                   _1er;
    
    betrag = einlesen_betrag();
    
    _500er = ermittle_anzahl(betrag, 500);                                      /* Ermittlung #500er */
    betrag = ermittle_rest(betrag, 500);
    
    _200er = ermittle_anzahl(betrag, 200);                                      /* Ermittlung #200er */
    betrag = ermittle_rest(betrag, 200);
    
    _100er = ermittle_anzahl(betrag, 100);                                      /* Ermittlung #100er */
    betrag = ermittle_rest(betrag, 100);
    
    _50er = ermittle_anzahl(betrag, 50);                                        /* Ermittlung #50er */
    betrag = ermittle_rest(betrag, 50);
    
    _20er = ermittle_anzahl(betrag, 20);                                        /* Ermittlung #20er */
    betrag = ermittle_rest(betrag, 20);
    
    _10er = ermittle_anzahl(betrag, 10);                                        /* Ermittlung #10er */
    betrag = ermittle_rest(betrag, 10);
    
    _5er = ermittle_anzahl(betrag, 5);                                          /* Ermittlung #5er */
    betrag = ermittle_rest(betrag, 5);
    
    _2er = ermittle_anzahl(betrag, 2);                                          /* Ermittlung #2er */
    betrag = ermittle_rest(betrag, 2);
    
    _1er = ermittle_anzahl(betrag, 1);                                          /* Ermittlung #1er */
    
    printf("\nDer eingegebene Betrag %hu wird minimal in die folgenden "
           "Geldscheine und -stuecke aufgeteilt: ", betrag);
    printf("500er:%2hu", _500er);
    printf("200er:%2hu", _200er);
    printf("100er:%2hu", _100er);
    printf(" 50er:%2hu",  _50er);
    printf(" 20er:%2hu",  _20er);
    printf(" 10er:%2hu",  _10er);
    printf("  5er:%2hu",   _5er);
    printf("  2er:%2hu",   _2er);
    printf("  1er:%2hu",   _1er);
}

unsigned short einlesen_betrag(void) {
    unsigned short betrag;
    
    do {
        printf("Bitte einen ganzzahligen Betrag kleiner 0 < Betrag < 65535 "
               "eingeben: ");
        scanf("%hd", &betrag);
    } while(betrag > 65535);
    
    return betrag;
}

unsigned short ermittle_anzahl(unsigned short betrag, unsigned short divisor) {
    unsigned short _1_betrag,
                   _1_divisor,
                   _1_anzahl;
    
    _1_anzahl = _1_betrag / _1_divisor;
            
    return _1_anzahl;
}

unsigned short ermittle_rest(unsigned short betrag, unsigned short divisor) {
    unsigned short _2_betrag,
                   _2_divisor;
    
    _2_betrag %= _2_divisor;
    
    return _2_betrag;
}
Dateianhänge
B07-14_3.png
Screenshot 3
B07-14_3.png (5.86 KiB) 507 mal betrachtet
B07-14_2.png
Screenshot 2
B07-14_2.png (11.22 KiB) 507 mal betrachtet
B07-14_1.png
Screenshot 1
B07-14_1.png (89.12 KiB) 507 mal betrachtet

Benutzeravatar
nigjo
Beiträge: 606
Registriert: 08.09.2009, 09:43
Wohnort: Aachen
Kontaktdaten:

Re: Stackdump bei Division

Beitrag von nigjo » 26.07.2018, 11:58

Hi

Du verwendest für die Formeln in "ermittle_anzahl()" die lokalen Variablen und nicht die Parameter. Die lokalen Variablen sind nicht initialisiert und mit "irgendwas" gefüllt. Da kann nichts korrektes bei rauskommen. Du solltest die übergebenen Parameter für die Berechnung verwenden.

Gruß
Jens

ps: Starte das ganze mal im Debugger und setze (einen) Breakpoint. Da wirst du solche Dinge viel schneller entdecken können.
Man sollte seine Werkzeuge kennen. Ansonsten haut man sich mit dem Hammer nur auf die Finger.

--
NetBeans Certified Engineer - Java Getriebe

xp10r3r
Beiträge: 6
Registriert: 08.07.2018, 16:10

Re: Stackdump bei Division

Beitrag von xp10r3r » 10.08.2018, 10:42

nigjo hat geschrieben:
26.07.2018, 11:58
Du verwendest für die Formeln in "ermittle_anzahl()" die lokalen Variablen und nicht die Parameter
Ich danke dir für den Hinweis. Jetzt habe ich es auch im Debugger gesehen gesehen.

Viele Grüße

Antworten