Перезагрузка
Время работы: , почти месяц.
Как часто вы перезагружаете компьютер?
By logging in to LiveJournal using a third-party service you accept LiveJournal's User agreement
Category was added automatically. Read all entries about "работа".
Испытал настоящий шок, когда докопался до сути проблемы: C++ разрешает использовать черную магию 70 ступени…
Есть обычная функция, которая должна вернуть int. Внутри происходит черная магия: функция, выполняющая работу, вызывается через указатель… Выглядит это примерно так:
int getInt() { return (int)WrapperCall((void *(*)(void *))DoGetInt); } int DoGetInt() { return calcInt(); } void DoUpdateInt() { memberInt = calcInt(); }
В принципе ничего страшного :))
Чисто случайно после слияния вместо DoGetInt
стала вызываться DoUpdateInt
. Последняя функция ничего не возвращает, и в результате getInt
возвращает неожиданные значения.
Но чему тут удивляться? Если функция ничего не возвращает, то сложно ожидать, что возвращаемое значение будет иметь какое-то разумное значение.
Вот и получается, что вместо результата вычислений в calcInt
функция getInt
возвращает мусор, оставшийся от работы других функций.
Если бы не отладчик, я бы еще не скоро заметил неладное…
P.S. Реальный код был несколько сложнее, было не так очевидно, что вызывается не та функция, которая должна бы.
Для создания инсталляционных пакетов Windows Installer мы используем WiX. И тут потребовалось создать патч к уже существующему установочному пакету.
Естественно, я пошел искать, как это делать. Первым, что нашел Google, была вот эта инструкция. И она в общем-то подходила. Но с ее помощью так не удалось создать патч. Поборов несколько препятствий, я столкнулся с неразрешимой проблемой: патч не создавался, потому что на последнем шаге создания патча инструменты не видели никаких изменений в двух разных установках. Забегая вперед, скажу, что позже я выяснил, почему он не создавался. Оказывается, в наших инсталляционных пакетах не указаны размеры файлов, поэтому и изменений не было.
Но инструкция выше относилась к версии 2.0, а мы уже использовали версию 3.0. Пришлось поковыряться в сайте WiX, чтобы найти инструкции для новой версии. Их уже было две:
Беда в том, что обе инструкции предполагали, что есть исходный .wsx файл создания пакета. А его у меня нет. После нескольких вариантов создания, декомпиляции и т.п. все также ничего не получалось. Даже скачал обновленный билд WiX, но тоже не помогло.
( Collapse )