C
mistake
trap
#migrated

C > stdint.hを使うことで処理が変わってしまう > ミス: unsigned intをuint8_tで定義した

http://ideone.com/YV3IdY

#include <stdio.h>
#include <time.h> // use for test. not available on IDE

time_t getElapsedSecond(int yyyy, int mm, int dd, int hh, int nn, int ss){
    struct tm workdt;
    workdt.tm_isdst = -1; // summer time flag
    workdt.tm_year = yyyy - 1900;
    workdt.tm_mon = mm - 1;
    workdt.tm_mday = dd;
    workdt.tm_hour = hh;
    workdt.tm_min = nn;
    workdt.tm_sec = ss;
    return mktime(&workdt);
}

void getDateTimeString(time_t srcdt, char *dstPtr)
{
    if (dstPtr == NULL) {
        return; // error
    }
    struct tm *workdt;
    workdt = localtime(&srcdt); 
    workdt->tm_year = workdt->tm_year + 1900;
    sprintf(dstPtr, "%04d/%02d/%02d %02d:%02d:%02d", 
        workdt->tm_year, workdt->tm_mon + 1, workdt->tm_mday, 
        workdt->tm_hour, workdt->tm_min, workdt->tm_sec
    );
}

typedef struct {
    unsigned int OI; // [s]
    unsigned int MI; // [s]
    unsigned int W; // [s]
    unsigned int R; // [s]
    unsigned int N; // [s]
} SETTING_t;

time_t getNextWtime(time_t torigin, time_t tnow, SETTING_t *setPtr)
{
    if (setPtr == NULL) {
        return 0; // error // TOOD: 0z > use error value for time_t
    }
    // case 1: (now - origin) % OI == 0
    unsigned long A = (tnow - torigin) / setPtr->OI;
    if ((tnow - torigin) % setPtr->OI == 0) {
        return torigin + (A + 1) * setPtr->OI;
    }

    // case 2: (now - origin) % OI != 0

    //   case 2-a: (now - A*OI) % MI == 0

    //   case 2-b: (now - A*OI) % MI != 0

    return 0; // TODO: 0z > remove after debug
}

void AssertCheck(time_t torigin, time_t tnow, time_t tnextWans, SETTING_t *setPtr)
{
    char szbuf[30];
    if (setPtr == NULL) {
        return; // error
    }
    time_t tnextWres = getNextWtime(torigin, tnow, setPtr);

    getDateTimeString(tnow, szbuf);
    printf("%s - ", szbuf);
    getDateTimeString(tnextWres, szbuf);
    printf("%s:", szbuf);
    printf("%c", (tnextWres == tnextWans) ? 'T' : 'F');
    printf("\r\n");
}

void Test_group_run()
{
    time_t torigin = getElapsedSecond(2017, 8, 2, 13, 48, 55);
    SETTING_t setting = { 3600, 600, 60, 5, 3 }; // OI, MI, W, R, N

    // case (2)
    AssertCheck(torigin,
                getElapsedSecond(2017, 8, 2, 13, 48, 55),
                getElapsedSecond(2017, 8, 2, 14, 48, 55),
                &setting);

}

int main(void) {
    Test_group_run();

    return 0;
}
run
2017/08/02 13:48:55 - 2017/08/02 14:48:55:T

SETTING_tの定義に関してunsigned intをuint8_tに変更することで結果がTからFに変わってしまった。

優先作業が終わってから時間に余裕があれば見直すかもしれない。

教えていただきました

@mt08 さんのコメント
にて型の間違いを教えていただきました。

情報感謝です。