Существует ли способ вывести структуру C?

Я записал программу, чтобы зондировать пределы C системы time.h функции и разгрузить их в JSON. Затем другие вещи, которые зависят от тех функций, могут знать свои пределы.

# system time.h limits, as JSON
{
    "gmtime": { "max": 2147483647, "min": -2147483648 },
    "localtime": { "max": 2147483647, "min": -2147483648 },
    "mktime": {
        "max": { "tm_sec": 7, "tm_min": 14, "tm_hour": 19, "tm_mday": 18, "tm_mon": 0, "tm_year": 138, "tm_wday": 1, "tm_yday": 17, "tm_isdst": 0 },
        "min": { "tm_sec": 52, "tm_min": 45, "tm_hour": 12, "tm_mday": 13, "tm_mon": 11, "tm_year": 1, "tm_wday": 5, "tm_yday": 346, "tm_isdst": 0 }
    }
}

gmtime () и localtime () достаточно просты, они просто берут числа, но mktime () берет структуру TM. Я записал пользовательскую функцию для превращения структуры TM в хеш JSON.

/* Dump a tm struct as a json fragment */
char * tm_as_json(const struct tm* date) {
    char *date_json = malloc(sizeof(char) * 512);
#ifdef HAS_TM_TM_ZONE
    char zone_json[32];
#endif
#ifdef HAS_TM_TM_GMTOFF
    char gmtoff_json[32];
#endif

    sprintf(date_json,
            "\"tm_sec\": %d, \"tm_min\": %d, \"tm_hour\": %d, \"tm_mday\": %d, \"tm_mon\": %d, \"tm_year\": %d, \"tm_wday\": %d, \"tm_yday\": %d, \"tm_isdst\": %d",
            date->tm_sec, date->tm_min, date->tm_hour, date->tm_mday,
            date->tm_mon, date->tm_year, date->tm_wday, date->tm_yday, date->tm_isdst
    );

#ifdef HAS_TM_TM_ZONE
    sprintf(&zone_json, ", \"tm_zone\": %s", date->tm_zone);
    strcat(date_json, zone_json);
#endif
#ifdef HAS_TM_TM_GMTOFF
    sprintf(&gmtoff_json", \"tm_gmtoff\": %ld", date->tm_gmtoff);
    strcat(date_json, gmtoff_json);
#endif

    return date_json;
}

Существует ли способ сделать это в общем для какой-либо данной структуры?

Примечание: C, не C++.

8
задан Schwern 12 February 2010 в 06:45
поделиться

1 ответ

Вот что у меня есть. Это не протестировано, но, надеюсь, будет менее гениально для вас работать с.: -)

double
roundd(double n, short mode)
{
    short cw, newcw;

    __asm__("fstcw %w0" : "=m" (cw));
    newcw = cw & 0xf3ff | mode;
    __asm__("fldcw %w0" : : "m" (newcw));
    __asm__("frndint" : "+t" (n));
    __asm__("fldcw %w0" : : "m" (cw));
    return n;
}

Хотя, если вы не обязаны использовать сборку для достижения вашего режима округления, подумайте об использовании функций в < fenv.h > вместо этого.: -)

-121--5044410-

Если вы используете ветвь с именем heroku в качестве «альтернативной главной» ветви (с конфиденциальными данными) и старую главную ветвь без конфиденциальных данных, то вы всегда можете сделать

git merge master

Так что вы можете протолкнуть ветвь heroku в heroku, а не главную ветвь.

-121--2414480-

Не в C - по крайней мере, в целом. Но если модуль C скомпилирован с символами отладки, и объектный модуль доступен, можно проанализировать его и обнаружить все о структуре. Держу пари, что есть библиотека для вашей системы, чтобы помочь с этим.

4
ответ дан 5 December 2019 в 21:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: