У меня есть следующий 2D-вектор:
vector<vector<unsigned char>> dates;
У меня также есть следующий массив беззнаковых символов:
unsigned char date[3] = {1, 18, 108};
Когда я push_back
задаю этот массив dates
, он устанавливает для всех беззнаковых элементов char значение 204:
date = ADP::addDay(date);
cout << int(date[0]) << '-' << int(date[1]) << '-' << int(date[2]) << endl;
dates.push_back({ date[0], date[1], date[2] });
cout << int(date[0]) << '-' << int(date[1]) << '-' << int(date[2]) << endl;
Выход:
1-18-108
204-204-204
Есть ли что-то, что мне здесь не хватает? Я предполагаю, что это проблема с преобразованием char в ASCII, но я действительно не уверен.
РЕДАКТИРОВАТЬ
addDay() выглядит так:
unsigned char* addDay(unsigned char datep[3]) {
unsigned char date[3];
date[0] = datep[0];
date[1] = datep[1];
date[2] = datep[2];
... modifys date ...
return date;
}
поэтому он возвращает указатель. Может ли это быть возможной проблемой?
попробуйте на онлайн-компиляторе, ничего неожиданного, вы уверены в своем выводе?
Я понятия не имею, что вызывает проблему. Когда я запускаю другой файл, я не понимаю проблемы. Я действительно не знаю, какой код достаточно для публикации. Я надеюсь, что кто-то увидит структуру моей программы и увидит возможную проблему.
addDay
возвращает указатель на переменную стека, которая выходит за пределы области видимости; указатель недействителен в тот момент, когда вызывающая сторона имеет к нему доступ.
Замените массивы в стиле C на std::array
или std::vector
(или std::tuple
, учитывая, что позиция, вероятно, имеет значение, не зависящее от сохраненного значения), если вы хотите, чтобы это работало.
Самым минимальным изменением будет что-то вроде:
std::tuple<unsigned char, unsigned char, unsigned char> addDay(unsigned char datep[3]) {
// Same code as before
return {date[0], date[1], date[2]}; // C++17; on earlier versions, use std::make_tuple
}
Вы бы использовали возвращаемое значение с:
auto datetup = ADP::addDay(date);
cout << int(std::get<0>(date)) << '-' << int(std::get<1>(date)) << '-' << int(std::get<2>(date)) << endl;
или с красивыми именами и структурированными привязками:
auto [year, month, day] = ADP::addDay(date);
cout << int(year) << '-' << int(month) << '-' << int(day) << endl;
Можете ли вы отредактировать свой вопрос, включив в него минимальный воспроизводимый пример — код, который мы можем скомпилировать и запустить, чтобы воспроизвести проблему?