code localtime nach localtime _r umwandeln
-
Ich bin noch ganz neu dabei und habe ein Project , in dem ich uner anderem auch Warnungen von cpplint zu localtime bekomme:
Consider using localtime_r(...) instead of localtime(...) for improved thread safety. cpplint(warning:runtime/thre
Ich würde das gerne ändern. Mir fehlt dazu aber der Durchblick.
Die entsprechende Stelle im Quelltext ist:for (int index = 0; index < Config.MainMenuWidgetWeatherDays; index++) { ... cString weekDayName(""); time_t t; time(&t); struct tm *tm = localtime(&t); tm->tm_mday += index; time_t t2 = mktime(tm); weekDayName = WeekDayName(t2);
Wird später so verwendet:
cString dayname = cString::sprintf("%s ", *weekDayName);
WeekDayName() ist so definiert: (Übergeordnetes Projekt)
# Definition in tools.h cString WeekDayName(time_t t) { struct tm tm_r; return WeekDayName(localtime_r(&t, &tm_r)->tm_wday); }
Ich hoffe die Codeausschnitte reichen, um es halbwegs zu verstehen. Vielleicht hat j a jemand eine einfache Lösung
-
In
WeekDayName
wird doch auch schonlocaltime_r
verwendet, so daß du den Code so für den anderen Code übernehmen kannst, d.h. einen 2. Parameter vom Typstruct tm
anlegen und (die Adresse davon) übergeben.Der logische Unterschied dabei ist, das der Anwender selber diese Struktur anlegt, anstatt in der
localtime
-Funktion eine statische Variable dafür verwendet wird, so daß Multithreading-Programme dann korrekt funktionieren (also keine Daten evtl. überschrieben werden).
-
Hatte ich vergessen zu erwähnen. Die tools.h kann ich nicht ändern, da die nur includiert wird und nicht zu meinem Projekt gehört. Es handelt sich um ein Plugin.
-
@MegaV0lt sagte in code localtime nach localtime _r umwandeln:
Ich bin noch ganz neu dabei und habe ein Project , in dem ich uner anderem auch Warnungen von cpplint zu localtime bekomme:
Consider using localtime_r(...) instead of localtime(...) for improved thread safety. cpplint(warning:runtime/thre
Ich würde das gerne ändern. Mir fehlt dazu aber der Durchblick.
Die entsprechende Stelle im Quelltext ist:for (int index = 0; index < Config.MainMenuWidgetWeatherDays; index++) { ... cString weekDayName(""); time_t t; time(&t); //struct tm *tm = localtime(&t); struct tm myOwnTM; localtime_r(&t, &myOwnTM); myOwnTM.tm_mday += index; time_t t2 = mktime(&myOwnTM); weekDayName = WeekDayName(t2);
-
@MegaV0lt sagte in code localtime nach localtime _r umwandeln:
Hatte ich vergessen zu erwähnen. Die tools.h kann ich nicht ändern, da die nur includiert wird und nicht zu meinem Projekt gehört. Es handelt sich um ein Plugin.
Dort musst du ja auch nichts ändern.
-
Vielen Dank. Ich habe das jetzt so geändert:
time_t t = time(NULL); // Or time(&t)? struct tm tm_r; localtime_r(&t, &tm_r); tm_r.tm_mday += index; time_t t2 = mktime(&tm_r); cString weekDayName = WeekDayName(t2);
Ich denke die Initialisierung mit time(NULL) ist identisch mit time(&t)
-
@MegaV0lt sagte in code localtime nach localtime _r umwandeln:
Hatte ich vergessen zu erwähnen. Die tools.h kann ich nicht ändern, da die nur includiert wird und nicht zu meinem Projekt gehört. Es handelt sich um ein Plugin.
Davon hatte ich aber auch nichts geschrieben, sondern meinte es so, wie du es jetzt umgesetzt hast.