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