zHz00 Untitled

понедельник, 23 декабря 2024
04:53 Во входном канале никель, в выходном -- пуговица
(никель -- монета в 5 центов)

Выводил текстовый файл при помощи Си++. Использовал класс ofstream. Неожиданно обнаружил, что файл прерывается досрочно. При этом цикл, который туда пишет, дорабатывает до конца. А в какой момент прерывается вывод?

В общем, у меня был импровизированный ассоциативный массив. Так не делайте, используйте готовый, он в Си++ есть (std::map). Но я сделал свой, с б/дж и ш. Ключ у меня был... целое число. А значение -- текстовая строка (char*, так тоже не делайте, потому что есть std::string). Для поиска по ассоциативному массиву была сделана специальная функция, возвращающая char*.

Проблема была в тех случаях, когда ключ был в массиве не найден. Моя функция возвращала NULL, а точнее, (char*)NULL. Нулевой указатель. Который с удовольствием выводился в файл.

Файловый поток такого издевательства терпеть не мог. Он выставлял сразу биты fail и bad (но не возбуждал исключение!). Я, естественно, не проверял статус выходного потока после каждого вывода. Да и не проверял вообще. А так уж поток устроен, что если ошибку не устранить, весь остальной вывод будет молча с'едаться, что и происходило.

Корень проблемы был в плохой архитектуре, которую я исправлять не стал, потому что это одноразовая утилита. Вместо это я исправил ассоциативный массив, добавив в него значения, которые там отсутствовали из-за моего недосмотра.

@темы: Программирование, Фейлы, Говнокод, Борьба с техникой

URL
когда училась в школе читала в "искусство кино"...
Обещай только невозможное, и тебя не в чем будет упрекнут...
Час Х приближается. Нервов уже не осталось. Кофеину бы.
*** У: Пора бы вспомнить о том, что это всё-таки мой дн...
завтра приезджает бабушка.... это чтобы нам всем жизнь ...
...всё страньше и страньше:) У: Никогда не думала, ч...

23.12.2024 в 10:04

23.12.2024 в 10:04
А почему ты вообще решил писать одноразовую утилиту на c++, вместо питона какого-нибудь?
URL

23.12.2024 в 10:08

23.12.2024 в 10:08
> Проблема была в тех случаях, когда ключ был в массиве не найден. Моя функция возвращала NULL, а точнее, (char*)NULL. Нулевой указатель. Который с удовольствием выводился в файл.

Так тоже делать не надо, потому что есть std::optional: en.cppreference.com/w/cpp/utility/optional Некоторые компиляторы реализовали en.cppreference.com/w/cpp/experimental/optional, тогда этим шаблоном можно пользоваться в любой версии C++.

-- Minoru
URL

23.12.2024 в 10:47

23.12.2024 в 10:47
Xersareeth, потому что я доставал массив значений из исходника на си (github.com/NetHack/NetHack/blob/NetHack-3.7/inc...). И мне проще было просто включить файл в утилиту на си++, чем использовать анализатор си-кода на питоне (есть ли такой вообще?)

fosser, ох, это уже слишком сильная магия. Про неё не слышал, спасибо.
URL
Добавить комментарий

Расширенная форма

Подписаться на новые комментарии
Получать уведомления о новых комментариях на E-mail