Я использую sqlite3 на C++. У меня возникли проблемы с получением результатов SQL из массива char в мою структуру.
class Row {
public:
uint8_t type;
uint16_t user;
uint32_t ipAddress;
std::string name;
};
void SqlToRow(char **argv, Row *row){
row->type = *(argv[0]);
row->user = *(uint16_t*)argv[1];
row->ipAddress = *(uint32_t*)argv[2];
row->name = argv[3];
}
Единственные, что работают, это type и name. Остальные выглядят как случайные значения, например 892486210
Было бы полезно увидеть вызов SqlToRow (), чтобы узнать, что передается.
@Christian Hackl Что ваш вопрос помогает найти решение?
@ICU_: Спасибо за вопрос. Первый вопрос определяет, стоит ли начинать объяснение основной концепции char*. Второй вопрос помогает угадать ожидаемое поведение.
# 1 Да, когда мне нужно поговорить о вещах C. Обычно это не двойные указатели. # 2 IP-адреса полезны как целые числа без знака, когда их действительно нужно использовать в сети.
@ICU_: "IP-адреса полезны как беззнаковые целые числа" - только адреса IPv4, так как они составляют 4 байта, которые могут уместиться в одно целое число. Адреса IPv6 составляют 16 байтов, и ни один современный компилятор не имеет встроенного 128-битного числового типа (во всяком случае, адрес IPv6 представляет собой массив из 8 2-байтовых целых чисел).
@RemyLebeau Тогда хорошо, что мы живем в мире ipv4 :)





Ошибка в том, что вы пытаетесь повторно интерпретировать значения char* как числовые. Используйте sscanf с SCNu16 и SCNu32, например:
sscanf(argv[1], "%" SCNu16, &row->user);
sscanf(argv[2], "%" SCNu32, &row-> ipAddress);
Вы когда-нибудь раньше действительно использовали указатели
charв C++? И какой смысл представлять пользователя или IP-адрес как одно целое число (если только они не должны быть чем-то вроде внешних ключей)?