WebHU - Programozási kérdések és válaszok

ctime visszatérő null

Ha a time_t felhasználói típus __darwin_time_t-ként van definiálva, amely maga is long-ként van definiálva a MacOS X rendszerben, akkor a következő kód miért 8 Time is (null)-t ad ki? Lehet, hogy ez valami hülyeség, de nem igazán értem.

#include <stdio.h>
#include <time.h>

int main(void)
{
    time_t time = 0x7FFFFFFFFFFFFFFF;

    printf("%lu\n"
           "Time is %s\n", sizeof(time_t), ctime(&time));

    return 0;
}
17.05.2011

  • __darwin_time_t-re gondoltam, nem __darwin_time-ra, elnézést. 17.05.2011

Válaszok:


1

Úgy tűnik, hogy a 0x7FFFFFFFFFFFFFFFF idő a Kr. u. 292 471 210 647 év körül van, ami kétségtelenül azt okozza, hogy a ctime meghaladja a C99 által garantált 26 karaktert, tehát NULL-t ad vissza, nem pedig túlcsordítja a puffert. Általában próbálja meg elkerülni azokat a dátumokat, amelyek azután történnek, hogy a morlockok háborúba indulnak az eloikkal.

17.05.2011
  • Nos, az ötlet az volt, hogy megtudjuk, mikor lesz time_t körbezárása. A 0x7FFFFFFFF Unix időben 2038-ban fog megtörténni, úgyhogy azt hiszem, új szabványra van szükségünk, mielőtt a bolygóközi háborúk gyakran előfordulnának galaxisunkban. 17.05.2011
  • Inkább próbáld ki az strftime-ot. Vagy csak vizsgálja meg a localtime vagy a gmtime tm_year-ját. 17.05.2011

  • 2

    A "Expert C Programming" című könyv átdolgozása közben ugyanezzel a problémával találkoztam a Lion 10.7.3-ban -- a t=0xf0c00000000000, ctime(&t) Wed Mar 1 21:07:12 214739252-t eredményez, és a t=0xf0d00000000000, ctime(&t) nullmutatót (0x0) ad vissza. Tehát nem úgy tűnik, hogy a t körbezárja, hanem valami teszt az ctime(&t)-ben, amely visszaadja a nullmutatót, ha t túl nagy.

    27.02.2012
  • Ugyanezt csinálta. Vicces. 20.07.2013

  • 3

    Forrás: glibc implementációja ezt olvassuk:

    Korlátozzuk a nyomtatható év méretét. A %d formátum-specifikátor használatával az 1900 hozzáadása túlcsordítja a számot, és negatív érték kerül nyomtatásra. Egyes architektúrákhoz elméletileg használhatjuk a %ld-t vagy egy egyre nagyobb egész szám formátumot, de ez azt jelentené, hogy a kimenetnek több hely kell. Ez nem jelentene problémát, ha az 'asctime_r' interfész értelmesen lenne definiálva, és átadna egy pufferméretet.

    Futtassa az alábbi programot, hogy megtalálja a gépén a pontos határértéket.

    #include <limits.h>
    #include <stdio.h>
    #include <time.h>
    
    /**
     * Find the largest time_t for which ctime returns a non-NULL value
     * using a bsearch between 0 and LONG_MAX.
     **/
    static time_t ctime_max() {
        time_t start = 0, end = LONG_MAX, mid;
        while (start < end) {
            mid = start + (end - start) / 2;
            if (ctime(&mid)) {
                /* this mid is ctime-able; try higher */
                start = mid + 1;
            } else {
                /* this mid is not ctime-able; try lower */
                end = mid;
            }
        }
        /* mid is now the lowest number that's too high; subtract one */
        return mid - 1;
    }
    
    int main() {
        time_t t = ctime_max();
        printf("%s", ctime(&t));
        return 0;
    }
    

    Számomra ez a Tue Dec 31 23:59:59 2147483647-hoz jön ki, ami történetesen a második, mielőtt az év túlcsordul négy előjeles bájttal.

    03.12.2014
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..