[c]zeitberechnung

Padawan

Erfahrenes Mitglied
Hallo zusammen,
hab im Rahmen eines "C-Projekts" folgende Funktion erstellt:

C:
int addTime()
{
    //Definitionen für
    int i, j;          //die Laufzeit der 'Zeitfeldern'
    int *gesSekunden = 0, *gesMinuten = 0, *gesStunden = 0;    //für die Berechnung der Gesamtdauer einer CD
    int minuten = 0, sekunden= 0;
    int *gesamtDauer = 0;


    for(j = 0; j < (CDData + i)->nrTracks; j++) /* TODO: Same interpret */
    {
        gesStunden = gesStunden + (CDData + i)->songs[j].dauer.stunden;
        gesMinuten = gesMinuten + (CDData + i)->songs[j].dauer.minuten;
        gesSekunden = gesSekunden + (CDData + i)->songs[j].dauer.sekunden;
    }

    //Berechnen der Stunden aus der Minutenzahl, falls über 60 Minuten
    if(gesSekunden >= 60)
    {
       sekunden = gesSekunden / 60;
       gesSekunden = gesSekunden - sekunden;
    }

    //Berechnen der Stunden aus der Minutenzahl, falls über 60 Minuten
    if(gesMinuten >= 60)
    {
       minuten = gesMinuten / 60;
       gesMinuten = gesMinuten - minuten;
    }

    gesMinuten += sekunden;
    gesStunden += minuten;

    //Übergeben der Gesamtdauer einer CD an gesamtDauer
    gesamtDauer = scanf("%02d:%02d:%02d", gesStunden, gesMinuten, gesSekunden);

    return *gesamtDauer; //Rückgabe von GesamtDauer
}

Die Code:
C:
(CDData + i)->songs[j].dauer.stunden
(CDData + i)->songs[j].dauer.minuten
(CDData + i)->songs[j].dauer.sekunden

sind in einem struck in einer .h-Datei als Integer Definiert.



Bekomme folgende Fehlermeldungen:

In function `addTime':|
18|warning: comparison between pointer and integer|
20|error: invalid operands to binary /
25|warning: comparison between pointer and integer
27|error: invalid operands to binary /
38|error: syntax error at end of input

v.a. das Teilen in den Zeilen 20 und 27 müsste doch Funktionieren.

Würde mich sehr freuen, wenn ihr mir helfen könntet.

Lg Padawan
 
ah danke, jetzt Funktioniert es, nachdem ich die variablen nicht mehr als Zeiger Initialisiere.
 
Hallo,

da du die Gesamtdauer als 'int' definiert hast, musst du dir überlegen wie du einen einzigen Zahlenwert generierst. Hier bietet sich an die Zeit in Sekunden zurückzugeben. Du rechnest die Stunden und Minuten in Sekunden um und addierst alles zu den schon vorhandenen Sekunden.

Die Codezeile mit 'scanf' ist ein kleiner Missgriff. Schaue dir nochmal in der scanf-Referenz an, was diese Funktion überhaupt tut.

Gruß
MCoder
 
Hallo zusammen,
hab den Code verändert:
C:
int addTime(int a)
{
    //Definitionen für
    int b, x, z;    int gesMinuten = 0;     //für die Berechnung der Gesamtdauer einer CD
    int minuten = 0, sekunden = 0;   //Zur Ermitlung der Zeit beivon über 60 Minuten bzw. Sekunden
    int sekAnz = 0, minAnz = 0;


    for (b = 0; b < (CDData + a)->nrTracks; b++) /* TODO: Same interpret */
    {
        if((CDData + a)->titel == (CDData + b)->titel)
        {
        (CDData + a)->songs[b].dauer.gesamtStunden = (CDData + a)->songs[b].dauer.gesamtStunden + (CDData + a)->songs[b].dauer.stunden;
        (CDData + a)->songs[b].dauer.gesamtMinuten = (CDData + a)->songs[b].dauer.gesamtMinuten + (CDData + a)->songs[b].dauer.minuten;
        (CDData + a)->songs[b].dauer.gesamtSekunden = (CDData + a)->songs[b].dauer.gesamtSekunden +(CDData + a)->songs[b].dauer.sekunden;


                if((CDData + a)->songs[b].dauer.gesamtSekunden >= 60)
                {
                   sekunden = (CDData + a)->songs[b].dauer.gesamtSekunden / 60;
                   sekAnz = sekunden * 60;      //Für "Abziehen" der in Minuten berechneten Zeit
                   (CDData + a)->songs[b].dauer.gesamtSekunden = (CDData + a)->songs[b].dauer.gesamtSekunden - sekAnz; //"Abziehen" der in Minuten berechneten Zeit
                }

                (CDData + a)->songs[b].dauer.gesamtMinuten =  (CDData + a)->songs[b].dauer.gesamtMinuten + sekunden;    //Hinzurechnen der Minuten die sich aus der Sekundenzahl ergeben

                //Berechnen der Stunden aus der Minutenzahl, falls über 60 Minuten
                if(gesMinuten >= 60)
                {
                   minuten = (CDData + a)->songs[b].dauer.gesamtMinuten / 60;
                   minAnz = minuten * 60;
                   (CDData + a)->songs[b].dauer.gesamtMinuten = (CDData + a)->songs[b].dauer.gesamtMinuten - sekAnz;
                }
        }
    }


return printf("\nDie Gesamtdauer der CD Beträgt: %d02:%d02:%d02 \n",   (CDData + a)->songs[b].dauer.gesamtStunden,
                                                                       (CDData + a)->songs[b].dauer.gesamtMinuten,
                                                                       (CDData + a)->songs[b].dauer.gesamtSekunden);
}

in dem folgenden in einem Struckt erstellten Variablen befindet sich die Zeit:
C:
(CDData + i)->songs[j].dauer.stunden
(CDData + i)->songs[j].dauer.minuten
(CDData + i)->songs[j].dauer.sekunden

in die folgenden Variablen soll die Zeit berechnet werden:
C:
(CDData + a)->songs[b].dauer.gesamtStunden
(CDData + a)->songs[b].dauer.gesamtMinuten
 (CDData + a)->songs[b].dauer.gesamtSekunden

mein Problem ist, es kommt kein richtiger wert raus. Kann jedoch nicht den Fehler finden.

Würde mich freuen, wenn mir jemand helfen könnte.

Lg Padawan
 
Hi.

Warum machst du das so kompiliziert? Verwende doch einfach den Vorschlag von MCoder und summiere einfach alles in Sekunden.

Ich würde sogar noch weiter gehen und die Spieldauer für jeden Song einfach in Sekunden speichern und nicht in Minuten, Stunden und Sekunden aufteilen. Das ist Verschwendung und letztendlich verkompliziert es die Sache nur anstatt zu helfen.

Sind denn die dauer.gesamt* Attribute korrekt mit 0 initialisiert?

So wie ich das sehe gehst du alle Tracks bzw. Songs durch und berechnest für jeden Track eine Gesamtspielzeit, welche allerdings ausschließlich aus der Spielzeit dieses Tracks berechnet wird.

Solltest du nicht eine Gesamtspielzeit berechnen, die aus der Summe der einzelnen Songs/Tracks besteht?

Zu allem Überfluß greifst du dann nach der Schleife auch noch auf einen nicht existierenden Track zu, was zu undefiniertem Verhalten führt.

Gruß
 
ich würde aussderm kein (CDData + a)-> verwenden sondern den CDData[a]-> syntax entsprechend.
Das ist übersichtlicher und vermeidet fehler.
 
Zurück