Ausgabe nach Uhrzeit liefert scheinbar willkürliche Ergebnisse C++

Hey Leute, schreibe gerade an einem Programm bei dem ich aus einer Liste aus Verbindungsdaten (Telephonverbindungen, also Dauer, Uhrzeit wann das Gespräch stattgefunden hat, und von welchem Zimmer aus) bestimmte anzeigen lassen soll, also zB alle Gespräche vom 23.08.2010, 12:00 Uhr bis 24.08.2010 17:00 Uhr von Zimmer 19.

Nach dem Zimmer suchen kein Problem, Datum auch kein Problem, aber jetzt falls es an dem Datum mehrere Verbindungen gab, bis zu einer gewissen Uhrzeit nur auszugeben wie oben erklärt macht mir Probleme, mehr oder weniger willkürliche Ergebnisse, mal richtig mal falsche dabei.

Die Uhrzeiten sind wie das Datum in einem String gespeichert, und werden in einen Chararray umgewandelt, dieser dann in ein int, also die Stunden in ein int, die Minuten und die Sekunden, damit ich sie vergleichen kann, größer kleiner ihr wisst.
Das Datum, Uhrzeit usw wird aus einer Textdatei eingelesen. Es liegt mit sicherheit nicht an der konvertierung von char zu int usw, mehrfach die Inhalte der Vars geprüft da stimmt alles, außerdem die Funktionen uach schon in anderen Programmen verwendet. Es muss ein Denkfehler bei der for-Schleife sein, sehe ihn aber nicht ....



Code:
for(int i = 50; i >= 0; --i)
                                  {
                                          if(datum[i] == datum_start) // datum[i] wird das Datum des Eintrags Nr. i verglichen mit dem Datum das der Benutzer als anfangsdatum eingeben hat 
                                          {
                                                      for(int k = 0; k < 9; ++k)
                                                      {
                                                              cuhrzeit_u[k] = uhrzeit[i][k];
                                                      }
                                                      cuhrzeit_u[9] = '\0';
                                                      
                                                      cstunden_u[0] = cuhrzeit_u[0];
                                                      cstunden_u[1] = cuhrzeit_u[1];
                                                      cstunden_u[2] = '\0';
    
                                                      cminuten_u[0] = cuhrzeit_u[3];  // Umwandlungen
                                                      cminuten_u[1] = cuhrzeit_u[4];
                                                      cminuten_u[2] = '\0';
    
                                                      csekunden_u[0] = cuhrzeit_u[6];
                                                      csekunden_u[1] = cuhrzeit_u[7];
                                                      csekunden_u[2] = '\0';
            
                                                      convert.char_to_int(istunden_u, cstunden_u);
                                                      convert.char_to_int(iminuten_u, cminuten_u);
                                                      convert.char_to_int(isekunden_u, csekunden_u);
                                                      
                                                      
                                                      if( istunden_u >= istunden_a) //Vergleich der Stunden, Minuten Sekunden, falls übereinstimmung speichern der Nr. i des Eintrags bei dem Übereinstimmung war
                                                      {
                                                          if(istunden_u == istunden_a)
                                                          {
                                                                        if(iminuten_u >= iminuten_a)
                                                                        {
                                                                                      if(iminuten_u == iminuten_a)
                                                                                      {
                                                                                                    if(isekunden_u >= isekunden_a)
                                                                                                    {
                                                                                                                   start = i;
                                                                                                    }
                                                                                      }
                                                                                      start = i;
                                                                        }
                                                          }
                                                          start = i;
                                                      }
                                                      else
                                                      {
                                                          break;
                                                      }
                                                      
                                          }
                                  }


Code etwas verzogen hoffentlich lesbar, das ist nur der ausschnitt bei dem das Datum überprüft und dann die Uhrzeit überprüft wird.
 
Also, das Zeug ist ja mal nicht besonders leicht zu lesen. Ich hätte aber einen konstruktiven Vorschlag zu bieten: Du berechnest aus der Zeit (AnzahlStunden * 3600 + AnzahlMinuten * 60 + AnzahlSekunden) die gesamten Sekunden und vergleichst dann diese Werte. Damit fällt der if-Block am Ende zu einer Abfrage zusammen.
Aus dem Code lese ich heraus, dass die Zeiten in uhrzeit[] bereits aufsteigend sortiert sind, richtig verstanden?
Es wäre noch praktisch, wenn du unter Umständen nicht nur einen Ausschnitt sondern das ganze Listing, also zumindest die ganze Funktion als Dateianhang lieferst. Dann kennt man sich bezüglich den Datentypen und dem Kontext unter Umständen besser aus. Ungarische Notation hin oder her.

mfg benediktibk
 
Code:
for(int i = 50; i >= 0; i[B][COLOR=Red]--[/COLOR][/B])
{
   if(datum[i] == datum_start)
   {
      for(int k = 0; k < 9; k[COLOR=Red][B]++[/B][/COLOR])
      {
         ...
Also ich kenn das ja nur so wie ich es berichtigt habe...

Ansonsten schließe ich mich benediktibk an...häng den Quellcode ran - da kann mans außerdem auch mal in nem Editor über die ganze Bildschirmbreite anzeigen lasse.
 
++i und i++ ist beides zulässig. Wobei es schon unterschiede gibt. Ersteres wird hochgezählt und dann i ausgewertet, bei zweiterem wird erst i ausgwertet und dann hochgezählt. Wenn ich das noch richtig im Kopf habe.
 
so also hier im Anhang der komplette Code, ich weiß verdammt schlampig, und kein Meter Objektorientiert, ich schäme mich auch dafür >.< nichmals Funktionen ..... :D:rolleyes:
 
Off Topic

edit, damit ich auch was zum Thema beitrage:

Code:
        if( istunden_u >= istunden_a) //Vergleich der Stunden, Minuten Sekunden, falls übereinstimmung speichern der Nr. i des Eintrags bei dem Übereinstimmung war
                                                      {
                                                          if(istunden_u == istunden_a)
                                                          {
                                                                        if(iminuten_u >= iminuten_a)
                                                                        {
                                                                                      if(iminuten_u == iminuten_a)
                                                                                      {
                                                                                                    if(isekunden_u >= isekunden_a)
                                                                                                    {
                                                                                                                   start = i;
                                                                                                    }
                                                                                      }
                                                                                      start = i;
                                                                        }
                                                          }
                                                          start = i;
                                                      }
                                                      else
                                                      {
                                                          break;
                                                      }

Du suchst hier nur am Beginndatum, was ist wenn der erste Anruf im gewählten Zeitraum erst am 2. Tag ist? (Dann wird start nie ein wert zugewiesen => unvorhersehbarer Wert...Variablen sollten IMMER Initialisiert werden.)

Das Problem liegt aber eher in den verschachteteln if-Abfragen start ist am Ende immer i, wenn istunden_u >= istunden_a erfüllt ist. Die inneren Abfragen müssten eine Konsequenz haben, wenn sie nicht erfüllt werden, bei dir wird aber einfach ohne die Zuweisung weitergemacht, die im nächsten Schritt sowieso trotzdem passiert. Das könnte man z.B. mit continue so lösen:

Code:
if( istunden_u >= istunden_a) {

    if(istunden_u == istunden_a) {

        if(iminuten_u >= iminuten_a) {

            if(iminuten_u == iminuten_a) {

                if(isekunden_u >= isekunden_a) {  

                    start = i;                                                                           
                }
		else continue;
            }
            start = i;
        }
        else continue;
    }
    start = i;
 }
else {

    break;
}

Eleganter wäre es sowieso eine Datumsklasse zu schreiben, und die <, >, ==, != Operatoren zu Überladen. Dann kann man ohne viele if-Abfragen leicht und übersichtlich Vergleiche anstellen. Alles in Sekunden umwandeln ist natürlich auch schon eine große Erleichterung (aber komplizierter mit beachtung von 30/31 Tagen/Monat usw.)

//Off Topic:
++i hat als Ausdruck den Wert i+1, i++ gibt i zurück.
i ist danach in beiden Fällen gleich, ++i kann aber Performancevorteile haben, wenn i z.B. ein Iterator ist, da bei i++ eine Kopie angelegt werden muss um den ursprünglichen Wert zurückgeben zu können, während ++i Einfach eine Referenz auf das Ergebnis zurückgeben kann...
Deshalb halte ich es für eine sinnvolle Angewohnheit, das durchgängig so zu machen...


Ich hoffe ich hab geholfen!

kotaro
 
Zuletzt bearbeitet:
Danke für die Hilfe ! Habe es jetzt erstmal so gelöst, dass ich die Stunden Minuten usw in Sekunden umgewandelt habe und da so vergleiche, da spar ich mir die vielen if Anweisungen.

Das funktioniert jetzt auch soweit, bekomme jetzt aber oft Probleme bei der Ausgabe, sprich das ganze verschiebt sich und wird nicht mehr untereinander ausgegeben, das passiert aber auch nur wenn es größere Ausgaben sind, desweiteren werden manchmal an die Zimmernr. vorne willkürlich d's angehängt, habe auch noch keine Ahnung was das soll ...
 
Zurück
Oben