Hallo Ich habe da ein ESP32 Arduino Programm Ich habe in einem Header static time_t WatchZeit; konfiguriert und lese in der Loop über sntp die Zeit aus und schreibe sie in die WatchZeit Variable in dem c++ Teil, timeinfo = localtime ( &WatchZeit ); Hour = timeinfo->tm_hour; Minute = timeinfo->tm_min; Second = timeinfo->tm_sec; printf(">>%d - %d -%d <<", Hour, Minute, Second); versuche ich die aktuelle Zeit "WatchZeit" auszulesen, aber ist sie dort mit 0 initialisiert. Wo ist mein Denkfehler ?
Wenn eine globale Variable als static deklariert ist, heißt das: sie ist nur in dieser "compilation unit" gültig, also nur in dem jeweiligen *.c oder *.cpp. Hast du zwei Quelltexte, die beide eine *.h #includen und in beiden ist die Variable als static vereinbart, dann hat dein Programm zwei verschiedenen Variablen, eine für jede der beiden Quelldateien. Damit du nur eine Variable für beide hast, muß sie in einer Datei ohne static vereinbart sein, und in allen anderen als extern (und auch ohne static).
:
Bearbeitet durch User
Ausserdem tut man Variablen nicht in Header-Dateien deklarieren. Nein das tutet man nicht, das ist pöhse! Und "static" und globale Variable ist ein Widerspruch in sich!
prog rammierer schrieb: > Ausserdem tut man Variablen nicht in Header-Dateien deklarieren. > Nein das tutet man nicht, das ist pöhse! Doch, DEKLARIEREN (mit extern davor) sehr wohl. Nur DEFINIEREN (also ohne extern, sodaß Speicher dafür angelegt wird) nicht in der .h, sondern in genau einer .c oder .cpp. > > Und "static" und globale Variable ist ein Widerspruch in sich! Hat man sich halt mal vor einem halben Jahrhundert in C so ausgedacht. Das Schlüsselwort static im Sinne von "mache eine lokale Variable, die sonst automatisch wäre, stattdessen statisch" macht ja nur innerhalb von Funktionen Sinn. Also war static außerhalb von Funktionen erstmal nutzlos, weil globale Variablen sowieso statisch sind (also kein Widerspruch, sondern ein Pleonasmus). Für die Verwendung "global, aber nur in dieser .c sichtbar" hat man dann static einfach recycled, anstatt ein neues Schlüsselwort dafür zu definieren. Je weniger Schlüsselworte, um so besser dachten sich die Herren dabei. Nein, schön ist das nicht - aber es ist nunmal so.
Klaus W. schrieb: > Für die Verwendung "global, aber nur in dieser .c sichtbar" hat man dann > static einfach recycled, anstatt ein neues Schlüsselwort dafür zu > definieren. Man könnte alternativ (zur Ehrenrettung der Schöpfer) auch postulieren, dass mit static (als "stationär" UND "statisch" im Deutschen) die Begrenzung auf die umgebende Einheit gemeint ist: Sei es ein {}-Klammernpaar oder halt die Übersetzungseinheit.
Danke für die Antworten Habe es nochmal mit extern time_t WatchZeit; deklarieren. Dann funktioniert es. Ich hatte gestern mit time ( &WatchZeit ); timeinfo = localtime ( &WatchZeit ); WatchZeit überschrieben und später rausgenommen und das vergessen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.