bash.im ithappens.me zadolba.li
12161

Раз-раз, как слышно?

3 мая 2014, 07:12

Требовалось однажды создать двумерный логический массив 8×8. Памяти было очень мало, экономить приходилось на всём. А bool в C (да и почти везде) занимает непростительно много — целый байт. На весь массив, таким образом, ушла бы восьмая килобайта, а их было всего два. При этом от нас требовалась переносимость — просто взять несколько int для этой цели не удалось бы, так как мы не знали точного количества байтов в int на каждой конкретной платформе.

Задача решилась просто: мы взяли символьный массив из восьми элементов (char занимает один байт ровно на всех платформах) и использовали его как двумерный булеановский.

Это присказка, а не сказка. В одном ветвлении программы, которое становилось возможным с трёх дней постоянной работы (времени на тестирование было недостаточно, чтобы заметить это) закралось две ошибки. Первая — банальное падение программы. Вторая — забытое преобразование из char в int элементов массива при записи в лог. Когда программа упала, местный айтишник посмотрел в лог… Ну надо же было массиву принять значение {1, 1, x, y, u, -, \}!