如何调整为WINx86编译的代码为WINx64编译

时间:2015-10-29 19:31:57

标签: delphi delphi-xe5 win64

我正在使用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编译?

2 个答案:

答案 0 :(得分:8)

TagNativeInt。这是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编译器中的一个错误,因为没有明显的理由说明为什么它需要这个转换。