C Programm startet nicht in CodeBlocks

#1
Hallo zusammen,

irgendwie startet mein C Programm nicht bei CodeBlocks. Der Code ist unten. Wisst ihr woran es liegt ?

C:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int main(int argc, char *argv[])
{
    int x=0;                        //Zählvariable
    int MinStunden=atof(argv[1]);   //zur Speicherung der Öffnungszeiten
    int MinMinuten=atof(argv[2]);   //zur Speicherung der Öffnungszeiten
    int MaxStunden=atof(argv[3]);   //zur Speicherung der Öffnungszeiten
    int MaxMinuten=atof(argv[4]);   //zur Speicherung der Öffnungszeiten
    int Jahr=0;                     //Speichert das aktuelle Jahr
    int Monat=0;                    //Speichert den aktuellen Monat
    int Tag=0;                      //Speichert den aktuellen Tag
    int Stunde=0;                   //Speichert die aktuelle Stunde
    int Minute=0;                   //Speichert die aktuelle Minute
    int DauerStunde=0;              //zur Speicherung der Parkdeuer
    int DauerMinute=0;              //zur Speicherung der Parkdeuer
    int Zufallszahl=0;              //zur Speicherung einer generierten Zufallszahl
    int AusfahrtStunde=0;           //zur Speicherung der Ausfahrtszeit
    int AusfahrtMinute=0;           //zur Speicherung der Ausfahrtszeit

    //Überprüfung der Übergabeparameter (Öffnungszeiten
    if((MaxStunden>=24)||(MaxStunden<0)){
        printf("\nFehler in den Öffnungszeiten!\n");
        return -1;
    }
    if((MaxMinuten>=60)||(MaxMinuten<0)){
        printf("\nFehler in den Öffnungszeiten!\n");
        return -1;
    }
    if((MinStunden>=24)||(MinStunden<0)){
        printf("\nFehler in den Öffnungszeiten!\n");
        return -1;
    }
    if((MinMinuten>=60)||(MinMinuten<0)){
        printf("\nFehler in den Öffnungszeiten!\n");
        return -1;
    }

    //Abfragen der aktuellen System-Uhrzeit
    struct tm *tmnow;
    time_t tnow;
    tnow=time(NULL);
    tmnow=localtime(&tnow);
    Jahr=tmnow->tm_year+1900;
    Monat=tmnow->tm_mon+1;
    Tag=tmnow->tm_mday;
    Stunde=tmnow->tm_hour;
    Minute=tmnow->tm_min;

    //Überprüfen der 'Einfahrtszeit'
    if(Stunde<=MinStunden){
        if(Stunde<MinStunden){
            printf("\nParkhaus ist noch nicht geöffnet!\nÖffnungszeiten: %02d:%02d Uhr bis %02d:%02d Uhr\n",MinStunden,MinMinuten,MaxStunden,MaxMinuten);
            return -1;
        }
        if(Stunde==MinStunden){
            if(Minute<MinMinuten){
                printf("\nParkhaus ist noch nicht geöffnet!\nÖffnungszeiten: %02d:%02d Uhr bis %02d:%02d Uhr\n",MinStunden,MinMinuten,MaxStunden,MaxMinuten);
                return -1;
            }
        }
    }
    if(Stunde>=MaxStunden){
        if(Stunde>MaxStunden){
            printf("\nParkhaus ist noch nicht geöffnet!\nÖffnungszeiten: %02d:%02d Uhr bis %02d:%02d Uhr\n",MinStunden,MinMinuten,MaxStunden,MaxMinuten);
            return -1;
        }
        if(Stunde==MaxStunden){
            if(Minute>MaxMinuten){
                printf("\nParkhaus ist noch nicht geöffnet!\nÖffnungszeiten: %02d:%02d Uhr bis %02d:%02d Uhr\n",MinStunden,MinMinuten,MaxStunden,MaxMinuten);
                return -1;
            }
        }
    }

    //Überprüfen ob Parkhaus gerade schließt
    if((Stunde==MaxStunden)&&(Minute==MaxMinuten)){
        printf("\nEinfahrt nicht mehr möglich!\n");
        return -1;
    }

    int Maximum=MaxStunden-Stunde;  //Speichert ein Maximum für Zufallsgeneration

    //Schleife zur Generiereung einer zulääsigen Parkdauer
    while(x==0){
        if(Maximum==0){DauerStunde=0;}
        else{
            srand(time(NULL));
            Zufallszahl=rand() % Maximum + 0;
            DauerStunde=Zufallszahl;
        }
        if(DauerStunde!=0){
            srand(time(NULL));
            Zufallszahl=rand() % 60 + 0;
            DauerMinute=Zufallszahl;
        }else{
            Maximum=MaxMinuten-Minute;
            srand(time(NULL));
            Zufallszahl=rand() % Maximum + 0;
            DauerMinute=Zufallszahl;
        }
        x++;

        if((DauerStunde==0)&&(DauerMinute==0)){
            x=0;
        }
        AusfahrtMinute=Minute+DauerMinute;
        AusfahrtStunde=Stunde+DauerStunde;
        if(AusfahrtMinute>=60){
            AusfahrtStunde=AusfahrtStunde+1;AusfahrtMinute=AusfahrtMinute-60;
        }
        if(AusfahrtStunde>MaxStunden){
            x=0;
        }
        if(AusfahrtStunde==MaxStunden){
            if(AusfahrtMinute>MaxMinuten){
                x=0;
            }
        }
    }

    //Berechnen der Gebühren für die Parkdauer
    double Gebuehren=1.5;
    if((DauerStunde==1)&&(DauerMinute==0)){
        Gebuehren=1.5;
    }
    if((DauerStunde==1)&&(DauerMinute>0)){
        Gebuehren=Gebuehren+1.3;
    }
    if((DauerStunde==2)&&(DauerMinute==0)){
        Gebuehren=Gebuehren+1.3;
    }
    if((DauerStunde==2)&&(DauerMinute>0)){
        Gebuehren=Gebuehren+2.6;
    }
    if((DauerStunde>=3)&&(DauerMinute==0)){
        Gebuehren=Gebuehren+2.6+(DauerStunde-3);
    }
    if((DauerStunde>=3)&&(DauerMinute>0)){
        Gebuehren=Gebuehren+3.6+(DauerStunde-3);
    }

    double Betrag=0;    //Speichert den insgesamt bezahlten Betrag
    double Rueckgeld=0; //Speichert das Rückgald
    double Einwurf=0;   //Registriert die eingeworfene Münze oder Schein
    int S10=0;          //10Euro Schein
    int S5=0;           //5Euro Schein
    int M2=0;           //2Euro Münze
    int M1=0;           //1Euro Münze
    int M50=0;          //50cent Münze
    int M20=0;          //20cent Münze
    int M10=0;          //10cent Münze

    //Anzeige der nötigen Informationen für Kunde
    printf("Parkdauer: %02d.%02dh \nParkgebühren: %.2lf",DauerStunde,DauerMinute,Gebuehren);

    //Schleife zur Aufforderung des Geld einwerfens
    while(Betrag<Gebuehren){
        printf("\nSchein oder Münze einwerfen (10€,5€,2€,1€,0.50€,0.20€,0.10€): ");
        scanf("%lf",&Einwurf);
        if((Einwurf==10)||(Einwurf==5)||(Einwurf==2)||(Einwurf==1)||(Einwurf==0.5)||(Einwurf==0.2)||(Einwurf==0.1)){
            Betrag=Betrag+Einwurf;
            if(Einwurf==10){
                S10++;
            }
            else if(Einwurf==5){
                S5++;
            }
            else if(Einwurf==2){
                M2++;
            }
            else if(Einwurf==1){
                M1++;
            }
            else if(Einwurf==0.5){
                M50++;
            }
            else if(Einwurf==0.2){
                M20++;
            }
            else if(Einwurf==0.1){
                M10++;
            }
            if(Betrag<Gebuehren){
                printf("Bereits gezahlt: %.2lf€",Betrag);
            }
        }
        else{
            printf("\nKeine gültige Zahlung!\n");
        }
    }

    //Drucken des Parkscheins
    printf("\n=========== PARKSCHEIN ===========");
    printf("\nDatum:         %02d.%02d.%04d",Tag,Monat,Jahr);
    printf("\nEinfahrtszeit: %02d:%02d Uhr",Stunde,Minute);
    printf("\nAusfahrtszeit: %02d:%02d Uhr",AusfahrtStunde,AusfahrtMinute);
    printf("\nParkzeit:      %02d.%02dh",DauerStunde,DauerMinute);
    printf("\nParkgebühr:    %.2lf €",Gebuehren);
    printf("\nGezahlt:       %.2lf (10€:%dx 5€:%dx 2€:%dx 1€:%dx 0.50€:%dx 0.20€:%dx 0.10€:%dx)",Betrag,S10,S5,M2,M1,M50,M20,M10);

    //Berechnen der Stückelung des Rückgeldes
    double Rest;    //Zur Berechnung des Divisionsrestes
    Rueckgeld=Betrag-Gebuehren;
    S10=Rueckgeld/10;   Rest=fmod(Rueckgeld,10);
    S5=Rest/5;          Rest=fmod(Rest,5);
    M2=Rest/2;          Rest=fmod(Rest,2);
    M1=Rest/1;          Rest=fmod(Rest,1);
    M50=Rest/0.5;       Rest=fmod(Rest,0.5);
    M20=Rest/0.2;       Rest=fmod(Rest,0.2);
    M10=Rest/0.1;

    printf("\nRückgeld:      %.2lf (10€:%dx 5€:%dx 2€:%dx 1€:%dx 0.50€:%dx 0.20€:%dx 0.10€:%dx)",Rueckgeld,S10,S5,M2,M1,M50,M20,M10);
    printf("\n==================================\n");
    return 0;
}
LG Alex
 

AGGROStar1991

Well-Known Member
c-b Experte
#2
Vielleicht einfach mal den Fehler mit angeben und noch besser erstmal alle Warnungen beheben?

clang -Weverything wirft mir 27 Warnungen hin und sagt mir es startet nicht wegen eines Adressbereichsfehlers. Und ganz kleiner TIpp : lern eine vernünftige Programmstruktur. Zerleg es in Funktionen und Prozeduren, so kann man die auch brauchbar testen und schreib Tests, bestenfalls vorher.
 

German

Well-Known Member
c-b Experte
#6
Starte doch deine main Funktion erst mal so:
C:
  if (argc < 5)
  {
    puts("Fehler: Die geforderten Kommandozeilenargumente wurden nicht uebergeben.");
    return 1;
  }
 
#7
Hey, erstmal sorry, hatte die ganze Zeit leider kein Internet, weswegen ich mich nicht melden konnte.

if (argc < 5) { puts("Fehler: Die geforderten Kommandozeilenargumente wurden nicht uebergeben."); return 1; }
Hab es eingefügt, doch da sagt er:

Code:
Process returned -1073741819 (0xC0000005)   execution time : 4.113 s
Press any key to continue.
Was kann ich noch testen ? :)
 

BAGZZlash

Well-Known Member
c-b Experte
#8
Was passiert eigentlich mit argv[0]? Nebenbei: atof gibt double zurück, Du speicherst aber in int.

Du übergibst aber schon die Kommandozeilenparameter? Sonst gibt's Segfaults bei den atof-Funktionen. Vielleicht zum Testen erst mal konkrete Werte eintragen.
 

AGGROStar1991

Well-Known Member
c-b Experte
#9
Du kannst erstmal Warnungen beseitigen und es in klare Funktionen zerlegen. Und dann gehst du alle Funktionen durch und schaust ob sie die eine Sache die sie tun sollen auch tun, mein Kommentar war ziemlich ernst gemeint ;)

PS : da ich gerade etwas zeit habe hier ein paar Warnings die mehr als einmal kommen : -Wfloat-conversion, -Wfloat-equal, -Wshorten-64-to-32, die sollten in jedem Fall erstmal weg, genauso wie ein -Wunused-parameter.
 

asc

Well-Known Member
c-b Experte
#10
Das wird schwierig sein, weil GCC von Haus aus nicht so strikt ist wie CLANG.
-Weverything gibt es unter GCC nicht und -Wall -Wextra -pedantic liefert nichts weiter als "unused parameter argc" ...
 

AGGROStar1991

Well-Known Member
c-b Experte
#11
Naja ist ja nicht so als könnte man unter gcc nicht bei weitem mehr Warnungen anstellen, die geben sogar noch weitere Hilfreiche wie -Wdeclaration-after-statement, -Wtraditional, -Wconversion , -Wunsuffixed-float-constants und -Wtraditional-conversion.

Welche Warnings gcc kennt kann man herausfinden mit
Bash:
gcc -Q --help=warning
und wenn man will kann man ein -Weverything emulieren mit und so, in einer bash, auf folgende Befehlszeile kommen die wirklich alle Warnungen wirft :

Bash:
gcc $(gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n') -lc -lm -std=c11 test.c
Aber ich weiß schon warum ich clang predige (und bestenfalls noch clang-tidy und clang-format) oder wenn gcc dann wenigstens alles anzuschalten, -Wall -Wextra -pedantic hat ja afaik nicht einmal meinen Liebling : -Wshadow.

mfg
 
Oben