Заполнение структуры C - PullRequest
       5

Заполнение структуры C

0 голосов
/ 16 февраля 2019

Я бы хотел присвоить значение, извлеченное из базы данных sqlite, c-struct, поэтому я делаю это следующим образом:

typedef struct
{
    uint16_t    shortID;
    double       temp;
    unsigned long timestamp;
} location_t;

static uint8_t prv_set_value(lwm2m_data_t* dataP,
                           location_t* tempData)
{
    uint8_t ret = COAP_205_CONTENT;
    sqlite3 *db;
    sqlite3_stmt *res;

    // connect to sqlite
    int rc = sqlite3_open("test.sqlite3", &db);

    if (rc != SQLITE_OK) {
        fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }
    else {
        fprintf(stderr, "Connection to SQLITE established!.\n" );
    }
    rc = sqlite3_prepare_v2(db, "SELECT temp FROM envirment ORDER BY ID DESC LIMIT 1", -1, &res, 0);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Failed to fetch data: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 1;
    }
    rc = sqlite3_step(res);
    if (rc == SQLITE_ROW) {
        fprintf(stdout, "Temperature value ==== : %s\n", sqlite3_column_double(res, 0));

         tempData->temp = sqlite3_column_double(res, 0);
        fprintf(stdout, "Temp value from temperature_data_t: %s\n", tempData->temp);

        }

        sqlite3_finalize(res);
        sqlite3_close(db);

         }
    return ret;
}

Данные выбираются из базы данных sqlite.Я проверяю, работает ли функция так, как задумано, поэтому я отображаю значение до и после назначения.Выходные данные из присвоения структуры tempData->temp = sqlite3_column_double(res, 0);, отображаемые в следующей строке fprintf(stdout, " Temp value from temperature_data_t: %s\n", tempData->temp);, равны null.Ниже приводится вывод функции:

Connection to SQLITE established!.
Temperature value ==== : 29.1
Temp value from temperature_data_t:  (null)

Как правильно назначить выборку для tempData->temp?

1 Ответ

0 голосов
/ 16 февраля 2019

tempData->temp = sqlite3_column_double(res, 0); правильно, но потому что tempData-> temp является двойным, а не char*, замените

fprintf(stdout, "Temp value from temperature_data_t: %s\n", tempData->temp) ;

на

fprintf(stdout, "Temp value from temperature_data_t: %f\n", tempData->temp);

Я полагаю, что строка

fprintf(stdout, "Temperature value ==== : %s\n", sqlite3_column_double(res, 0));

на самом деле

fprintf(stdout, "Temperature value ==== : %s\n", sqlite3_column_text(res, 0));

, поскольку sqlite3_column_double не возвращает char*


маясмотрите также: получение значений с плавающей запятой с использованием sqlite3_column_double

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...