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 schon localtime_r verwendet, so daß du den Code so für den anderen Code übernehmen kannst, d.h. einen 2. Parameter vom Typ struct 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.


Anmelden zum Antworten