Фон
Я работаю в C #, обычно пишу программы поддержки для встроенных проектов.Я унаследовал проект от кого-то давно ушедшего, и это программа, которую один из моих клиентов использовал для загрузки и загрузки файлов Intel Hex через RS-232 на некоторые из своих плат.Программа работала хорошо для них в течение ряда лет, но с новой платой, над которой я работаю, этого не произошло, и потребовались некоторые модификации.
Проблема
Я открыл проект, инашел проблему.Новая плата производила некоторые данные по адресам в диапазоне 0x90000000-0x9007FFFF
, а код C # использовал тип int
для адресных данных;который подписан, что неправильно обрабатывает адреса свыше 0x80000000
.Все идет нормально.Но потом я стал дерзким.
Я решил очистить код, заменив все "int" на Int16 / UInt16 / Int32 / UInt32, в зависимости от использования.Это заняло некоторое время, но я решил, что это сделает код более понятным и понятным, и, надеюсь, позволит избежать любых будущих ошибок.
Код перестал работать.Это заняло у меня большую часть дня и сводилось к следующей строке:
currseg = (HexSegment)hex_segments[HashEntry];
Тип HexSegment - это структура (да, структура, а не класс),
public struct HexSegment
{
UInt32 Address; // this is the fix I made, both were int
UInt32 Buf_idx;
}
hex_segments - это HashTable.
наконец, HashEntry был "int", также превращенным в UInt32
.
В отладчике я вижу это:
Если изображение не видно, значение HashEntry равно 0x00000000
.Если я прошу отладчик посмотреть hex_segments[0]
, я получу MLV.HexSegment
с достоверными данными.Если я спрашиваю отладчик, чтобы увидеть hex_segments[HashEntry]
, я получаю нулевое значение !!
Изменение HashEntry
на Int32
исправило проблему.
Как я уже сказал, я программист встраиваемых систем.,Для меня это большая загадка.Кто-нибудь может объяснить, почему это так?