我正在使用Component Tag(NativeInt)值的赋值将其添加到字节集中。该程序在为WIN32编译时工作正常,但不为WINx64编译。 (错误2001需要序数类型) 这是一个MCVE:
public class PalindromeFinder {
ArrayStack<Character> charStack = new ArrayStack<>();
String strVerify = "";
private String strCheck;
public PalindromeFinder(String strCheck) {
strCheck = strCheck.toLowerCase();
pushStr(strCheck);
strVerify = popStr();
}
public void pushStr(String strToPush) {
for (int chVal = 0; chVal <strToPush.length(); ++chVal) {
char ch = strToPush.charAt(chVal);
ch = Character.toLowerCase(ch);
if (Character.isAlphabetic(chVal)) {
charStack.push(ch);
}
}
}
public String popStr() {
while (!charStack.empty()) {
strVerify += charStack.pop();
}
return strVerify;
}
public boolean isPalindrome() {
return strVerify == strCheck;
}
}
如何调整代码使其适合WINx64编译?
答案 0 :(得分:8)
Tag
是NativeInt
。这是x86中的32位,x64中的64位。据我了解,32位整数被认为是序数,64位整数不是序数。这就是编译器错误的原因,我想,尽管Integer
被认为是一种序数类型,而Int64
不是,我不能告诉你。如果我不得不猜测,我会想象这与Int64
不适合x86上的寄存器的事实有关,因此与编译器相比,需要与1,2和4字节序数相比有很大的不同处理类型。
既然你可能不想要改变尺寸的东西,我希望你可以投射到Integer
:
s := [Integer(C.Tag)];
既然你只使用低8位,你应该将其转换为Byte
:
s := [Byte(C.Tag)];
最好断言你在范围内:
Assert((C.Tag >= low(Byte)) and (C.Tag <= high(Byte)))
坦率地说,在我看来,你完全避免Tag
。将数据存储在专用于该任务的变量中,并使用您可以选择的类型。作为一般规则,在我看来,Tag
是你应该避免使用的东西。它不是类型安全的,除非你碰巧有NatoiveInt
存储,它的名字没有说明它的内容,并且当多方试图使用它时很容易发生冲突。
答案 1 :(得分:7)
添加标记属性的类型转换,将其强制转换为字节:
s:=[Byte(C.Tag)];
虽然Win32编译器不需要它,但它会接受这个并且它允许Win64编译器接受代码并且具有相同的效果并导致两种情况。
从表面上看,这似乎是Win64编译器中的一个错误,因为没有明显的理由说明为什么它需要这个转换。