背景
我通常使用C#编写嵌入式项目的支持程序。我继承了一个项目,这是一个由我的一个客户使用的程序,用于通过RS-232下载和上传Intel Hex文件到他们的一些板子上。该程序多年来一直为他们工作正常,但是对于我正在处理的新板子,它却无法正常工作,需要进行一些修改。
问题
我打开了项目,并找到了问题所在。新的板子在地址范围0x90000000-0x9007FFFF
中产生了一些数据,而C#代码使用了int
类型的地址数据;这是有符号的,处理超过0x80000000
的地址时出现错误。到目前为止还好。但是我变得自负了。
我决定清理代码,用Int16/UInt16/Int32/UInt32替换所有的“int”,具体取决于使用情况。这花了我很长时间,但我认为这将使代码更清晰易懂,并希望避免任何未来的错误。
结果代码停止工作了。我花了大部分时间,最终发现问题在这一行:
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是一个哈希表。
最后,HashEntry被定义为“int”,也转换成了UInt32
。
在调试器中,我看到了这个:
如果您看不到图片,则HashEntry的值为0x00000000
。
如果我要求调试器查看hex_segments[0]
,我会得到一个具有合法数据的MLV.HexSegment
。
如果我要求调试器查看hex_segments[HashEntry]
,我得到的是null!
将HashEntry
更改为Int32
解决了该问题。
就我而言,作为嵌入式程序员,这是一个很大的谜团。有人能解释为什么会这样吗?
0x08000000
(int)还是0x80000000
(uint)? - SilvermindHashEntry
的数据类型从int
更改为uint
。但是,你没有更改插入HashTable
的代码,它仍然是int
。如果你要求调试器查看hex_segments [0U]
,你会得到空值。 - canton7int
和uint
都是值类型,所以两者都可以使用,但它们是不同的,一个装箱的0的int与一个装箱的0的uint非常不同。没有任何方法可以在它们之间进行转换。我猜你正在插入一个int(它被转换为装箱的int),并尝试使用uint(转换为装箱的uint)获取它。即使它们都是“零”,它们也不相等。 - Flydog57Convert
类有方法可以在它们之间进行转换。但这与OP的问题毫不相关。" - canton7