C ++ Sqlite3-итерация в MSVS2019 приводит к ошибке приведения (время компиляции), почему? - PullRequest
0 голосов
/ 07 апреля 2020

"new.db" - это база данных Sqlit3, которая содержит некоторую информацию о фильмах.

Его таблица PAGE состоит из десяти столбцов (примерный год производства, директор и т. Д. c.) И трех строк. Он не имеет ограничений типа «не может быть NULL» и т. Д. 1014 *. Я оставил некоторые ячейки пустыми.

Я могу запустить код c ++ (воспроизведенный ниже), который правильно выводит правильную информацию (в отладке я подавил ошибку).

Анализ кода по-прежнему выдает те же ошибки приведения («переполнение Arithmeti c: использование оператора« + »для 4-байтового значения и затем приведение результата к 8-байтовому значению»). «+» используется только в приращении итератора, поэтому я предполагаю, что это как-то связано с этим - хотя я чувствую, что могу быть совершенно не прав.

Мне просто интересно, может ли кто-нибудь помочь мне увидеть, где происходит несоответствие 4/8, и дать мне понять, к какому типу UB может привести.

Код (одна функция закомментирована, потому что операции sqlite были иметь место на существующей БД и поэтому не нужно было создавать):

#include <iostream> 
#include <stdio.h>
#include <string>
#include "sqlite3.h"

using namespace std;

static int createDB(const char* s);
static int outputDB(const char* s);
static int callback(void* NotUsed, int argc, char** argv, char** azColName);

int main()
{
    const char* dir = "C:\\Show\\me\\the\\way\\to\\sqlite\\new.db";
    sqlite3* DB;
    //createDB(dir);
    outputDB(dir);
    return 0;
}

static int createDB(const char* s)
{
    sqlite3* DB;
    sqlite3_open(s, &DB);
    sqlite3_close(DB);
    return 0;
}

static int outputDB(const char* s)
{
    sqlite3* DB;
    sqlite3_open(s, &DB);
    string selection = "SELECT * FROM PAGE;";
    sqlite3_exec(DB, selection.c_str(), callback, NULL, NULL);
    return 0;
}

static int callback(void* NotUsed, int argc, char** argv, char** azColName)
{
    for (int i = 0; i < argc; i++)
    {
        cout << azColName[i] << ": " << argv[i] << endl;
    }

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