Что-то странное в C # - UInt32 против Int32 - PullRequest
0 голосов
/ 19 февраля 2019

Фон

Я работаю в 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.

В отладчике я вижу это:

enter image description here

Если изображение не видно, значение HashEntry равно 0x00000000.Если я прошу отладчик посмотреть hex_segments[0], я получу MLV.HexSegment с достоверными данными.Если я спрашиваю отладчик, чтобы увидеть hex_segments[HashEntry], я получаю нулевое значение !!

Изменение HashEntry на Int32 исправило проблему.

Как я уже сказал, я программист встраиваемых систем.,Для меня это большая загадка.Кто-нибудь может объяснить, почему это так?

1 Ответ

0 голосов
/ 19 февраля 2019

Поскольку Hashtable индексируется объектом, а не int.

public virtual object this[object key] { get; set; }

, поэтому, если объект был добавлен с ключом 0 как Int32, он будет отличаться от объекта, добавленного с 0 как UInt32.

Посмотрите на это:

UInt32 index = 0;
Int32 index2 = 0;
Hashtable t = new Hashtable();

t.Add(index, new { name = "matt" });
t.Add(index2, new { name = "Matt" });

var obj = t[index];
var obj2 = t[index2];

Console.WriteLine(obj);
Console.WriteLine(obj2);
...