bisher lasse ich mir die Tage und Datums in der Konsole ausgeben.
Um mein eigentliches Vorhaben zu machen, wollte ich eine Matrix
schreiben (7x32)- Damit habe ich jede kombination gegeben und kann in
jedem Feld den wert erhöhen.
das Problem ist, sobald ich die Zeile
1
int auswertung[7][31];
auskommentiere, wird mir in der Konsole nichts mehr angezeigt.
Woran liegt das? Das macht für mich keinen sinn.
Stephan
Wieso kann ich das nicht machne? ich vergleiche doch nur zwei strings
miteinander, oder nicht?
Habe es trotzdem geändert. Dennoch bleibt das Problem das selbe.
Stephan schrieb:> Wieso kann ich das nicht machne? ich vergleiche doch nur zwei strings> miteinander, oder nicht?
char* ist aber kein String sondern ein Array und Arrays kann man (so)
nicht vergleichen.
Peter II schrieb:> char* ist aber kein String sondern ein Array und Arrays kann man (so)> nicht vergleichen.
genauer gesagt ist es ein pointer (nicht das sich jemand an Array stört)
> char* ist aber kein String sondern ein Array und Arrays kann man (so)> nicht vergleichen.
Nö, char* ist ein Zeiger, und der Compiler warnt zu Recht davor,
selbigen Zeiger mit der ∗Adresse∗ eines String-Literals zu vergleichen.
Stephan schrieb:> Habe es trotzdem geändert. Dennoch bleibt das Problem das selbe.
Auch den Elemente tm_hour, tm_min und tm_sec in ts solltest du sinnvolle
Werte zuweisen (im einfachsten Fall 0). Lediglich tm_wday, tm_yday und
tm_isdst kannst du uninitialisiert lassen, da sie von mktime berechnet
werden.
Edit:
tm_isdst musst du ebenfalls initialisieren (s. Man-Page von mktime).
Schreibe es jetzt in eine textdatei. das funktioniert auch soweit. Das
Problem was ich jetzt habe, dass ich nicht weiss, wie ich überprüfen
kann, ob der Tag überhaupt existiert hat. Momentan spuckt er mir aus,
dass der 29.Februar2014 ein Samstag war und zählt diesen mit.
(30.Februar2014->Sonntag, 31.Februar2014->Montag).
kann ich auch irgendwie kontrollieren, ob dieser Tag überhaupt existiert
hat?
Stephan schrieb:> kann ich auch irgendwie kontrollieren, ob dieser Tag überhaupt existiert> hat?
Vergleiche nach dem mktime, ob die Werte in ts dieselben sind, die du
vorher rein geschrieben hast.
Zu deinem ersten Problem.
Es gibt in C eine feste Adresse, die man für ungültige Adressen
verwendet: NULL
mhh,
habe es jetzt so gemacht, dass ich mir die Tage in einem Monat aus einer
Funktion geben lasse und die for-Schleife für die Tage nur bis dahin
laufen lass.
das mit dem vergleichen hört sich aber besser an, habe ich aber nicht
hinbekommen. Da muss ich erst noch mal ein bisschen probieren.
aber danke schon mal für eure Hilfe.
>kann ich auch irgendwie kontrollieren, ob dieser Tag überhaupt existiert> hat?
Ja, in dem du ermittelst ob das Jahr ein Schaltjahr war (wie man das
programmiertechnisch macht, das kannst du googlen), in dem Falle gibt es
halt den 29. Februar - ansonsten nicht.
Gruß J
Ich würde nur für den ersten Tag mktime nehmen. den Rest dann selber aus
der Tabelle, bzw. mit Schleifen errechnen.
Meist macht man arrDaysInMonth ein 2D-Array:
Dirk B. schrieb:> Ich würde nur für den ersten Tag mktime nehmen.
Mit mktime kommst du (bei 32-Bit time_t) aber nur von ~1902 bis ~2038.
Dann kannst du Freitag, den 15. Oktober 1582 als Startpunkt nehmen.
Davor war Donnerstag, der 4. Oktober.
Was soll den jetzt dieses Gemisch aus C und C++? Das macht es auch nicht
besser. Ebensowenig irgendwelche besch... Code dranzukleben.
Oben wurde es schon mal erwähnt: HANDBUCH LESEN!
> The mktime() function modifies the fields of the tm structure as follows:> tm_wday and tm_yday are set to values determined from the contents of the> other fields; if structure members are outside their valid interval, they> will be normalized (so that, for example, 40 October is changed into 9> November); tm_isdst is set (regardless of its initial value) to a> positive value or to 0, respectively, to indicate whether DST is or is> not in effect at the specified time. Calling mktime() also sets the> external variable tzname with information about the current timezone.
D.h. hat mktime() den Tag verändert, so gibt es das Datum nicht ->
Ergebnis wegschmeißen.
Einfachster Test, wenn es nur darum geht den 29. (Schaltjahre), 30. und
31. eines Monats in den Griff zu bekommen:
Jay schrieb:> Oben wurde es schon mal erwähnt: HANDBUCH LESEN!>>> The mktime() function modifies the fields of the tm structure as follows:>> tm_wday and tm_yday are set to values determined from the contents of the>> other fields; if structure members are outside their valid interval, they>> will be normalized (so that, for example, 40 October is changed into 9>> November);>> D.h. hat mktime() den Tag verändert, so gibt es das Datum nicht ->> Ergebnis wegschmeißen.
Nein, das heisst, eine einfache Schleife genügt:
1
heute = 1. Jan. 2000
2
WHILE heute != 1. Jan 2016
3
wochentag = wochentag von heute
4
tag = monatstag von heute
5
trage (tag, wochentag) in resultat ein
6
heute = heute + 1
7
benutze mktime um heute zu normalisieren
8
END WHILE
9
10
zun schluss resultattabelle ausgeben
und damit sind alle Vorrichtungen um Schaltjahre und 28-, 29-, 30 oder
31-Tagige Monate abzufangen hinfällig, weil mktime das alles
übernimmt.