#c
#c
Вопрос:
Для отладки nncase и просмотра его в действии мне нравится дамп переменной main_men_
, объявленной здесь, например:
main_mem_.reset(new (std::nothrow) uint8_t[model_header_->main_mem]);
будет сбрасываться в файл каждый раз, когда мы пересекаем здесь.
Я вижу, что они обращаются к объекту здесь, как:
base = (uintptr_t)main_mem_.get();
Я попытался сбросить содержимое с помощью этих строк:
std::ofstream myfile;
myfile.open("infer-dbg/" std::to_string(node_id) " " node_opcode_names(header.opcode).data());
for(int i = 0; i < model_header_->main_mem*8; i )
{
myfile << *((uint8_t*)main_mem_.get() i);
}
opCount ;
myfile.close();
но это всегда дает мне один и тот же файл, и я вижу, что mem изменен.
Как может выглядеть идеоматический способ C для сброса этой переменной?
Комментарии:
1. Почему вы не используете
std::vector<uint8_t>
? Это практически astd::unique_ptr<uint8_t[]>
с большим количеством дополнений2. Не имеет отношения к вашей проблеме, но в чем причина использования
std::unique_ptr<uint8_t[]>
вместоstd::vector<uint8_t>
или, возможно, даже простогоstd::string
?3. Если
main_mem_
указывает наmodel_header_->main_mem
байты памяти, почему выmodel_header_->main_mem * 8
повторяете цикл? Это выйдет за пределы выделенной памяти.4. Вы правы. * 8 неверно.
Ответ №1:
Я считаю, что вам нужен std::basic_ostream::write:
myfile.write(reinterpret_cast<const char*>(main_mem_.get()), model_header_->main_mem);
Комментарии:
1. Это умножение на
8
кажется не совсем правильным.write
Функция принимает количество байтов в качестве размера, и поскольку каждый «элемент» является байтомmain_mem
, этого достаточно.2. Возможно, я скопировал число из его цикла. Я исправлю.
3. Использование этого приведения выдает ошибку: ошибка: недопустимый static_cast из типа ‘std::unique_ptr<unsigned char []>::pointer’ {он же ‘unsigned char*’} в тип ‘const char*’ myfile . запись(static_cast<const char*>(main_mem_.get()), model_header_->main_mem);
4. затем используйте
reinterpret_cast
, я обновил ответ
Ответ №2:
Я понятия не имею, почему вы используете a std::unique_ptr<uint8_t[]>
, поэтому я дам ответ, используя лучшую альтернативу IMHO std::vector<uint8_t>
. Или даже более общий
template<typename T>
void Tofile(std::string_view fileName, std::vector<T> constamp; vec) {
std::ofstream fs(fileName);
if (!fs) throw std::exception("filestream is not available for some reason");
std::copy(cbegin(vec), cend(vec), std::ostream_iterator<T>(fs));
}