2012-12-04 71 views
3

我想知道如何將整數轉換爲long_integer和long_integer爲Positive_Count。儘管在這種情況下轉換應該很簡單,但我嘗試過的每種方法都給了我和錯誤。在Ada中轉換數字

例如,做

long := long_integer(int1) + long_integer(int2); 

將使長有時即使兩個整數呈陽性負值。

我運行函數的代碼,步驟分開進行調試:

--calcKey-- 
procedure calcKey(x: in String16; key: out External_IO.Positive_Count) is 
    s1, s2 : String2; 
    int1, int2 : integer; 
    long1, long2 : long_integer; 
begin 
    s1 := x(12..13); 
    s2 := x(15..16); 
    put_line("s1: " &s1& "- s2: " &s2); 
    int1 := abs StringToInt(s1); 
    int2 := abs StringToInt(s2); 
    put("int1: " & Integer'image(int1) & " | int: " & Integer'Image(int2)); new_line; 
    long1 := long_integer(int1); 
    long2 := long_integer(int2); 
    long1 := long1 + long2; 
    put_line("long := " & long_integer'Image(long1)); 
    long1 := (long1 mod 256) + 1; 
    key := External_IO.Positive_Count(long1); 
    put_line("Key : " & External_IO.Positive_Count'Image(key)); 

    new_line; 
end calcKey; 

調用該函數:

calcKey("abcdef",k); 
calcKey("abcdef",k); 
calcKey("abcdef",k); 
calcKey("abcdef",k); 
calcKey("fedvba",k); 
calcKey("fedvba",k); 

輸出:

s1: bc- s2: ef 
int1: 2011929758 | int: 1667393125 
long := -615644413 
Key : 4 

s1: bc- s2: ef 
int1: 287586 | int: 1667393125 
long := 1667680711 
Key : 200 

s1: bc- s2: ef 
int1: 13132642 | int: 1667393125 
long := 1680525767 
Key : 200 

s1: bc- s2: ef 
int1: 13132642 | int: 1667393125 
long := 1680525767 
Key : 200 

s1: 43- s2: 10 
int1: 13120308 | int: 859058225 
long := 872178533 
Key : 102 

s1: 43- s2: 10 
int1: 6697780 | int: 859058225 
long := 865756005 
Key : 102 

回答

3

(這應該是一個評論,但它太長,所以我提交它作爲答案)

我會做的實際上是驗證long_int的第一件事是什麼,你認爲它是即做INTEGER'SIZELONG_INTEGER'SIZE,它很可能是你的平臺上,他們都非常相同的大小,

從阿達定義:

注意,這些類型的範圍和大小可以在每 平臺(當然除了布爾和 [[Wide_] Wide_]字符的)是不同的。有一個實現要求 Integer類型的大小至少爲16位,而Long_Integer 至少有32位(如果存在)RM 3.5.4(21..22)(註釋)。所以如果你想要你的類型的全部可移植性,不要使用標準 中的類型(除非你必須,見下文),而是定義你自己的類型。 A 編譯器將拒絕任何類型聲明,其範圍不能滿足 。

如果它們大小相同,那麼在添加2個真正大的整數時可能會溢出,從而給出結果。

來源:http://en.wikibooks.org/wiki/Ada_Programming/Libraries/Standard

+0

是的。 Integer和Long_Integer顯然是相同的大小。謝謝。 – user1279914

4

以前的答案是有必要(和正確的方法)來檢查整數大小是正確的。

另外,定義你自己的整數類型,並用「問題」來完成!

但是,如果整數加法溢出並返回負數,那麼您沒有使用Ada編譯器!

不幸的是,Gnat默認不是Ada編譯器。

使用Gnat,您需要設置編譯器標誌以啓用諸如溢出之類的檢查,默認情況下它應該處於打開狀態。然後,這樣的溢出會引發Constraint_Error異常,並在消息中直接指向代碼行 - 這使得測試比反向工程設計更容易出錯!

gnatmake -gnataeEfoUv -fstack-check my_main.adb 

是一個相當全面的,這可能包括你不希望一些樣式檢查:檢查蚋文檔瞭解更多信息。

其他建議首選國旗集歡迎。

如果您正在使用其他編譯器,我很樂意聽到它是哪個。

順便提一句,你還沒有提供StringToInt函數,所以沒有人可以測試你的例子,但我會指出它生成的值與我期望從你提供的字符串所期望的值完全不同。它是一個隨機哈希生成器?

+0

這是一個糟糕的隨機哈希生成器,我需要用於賦值。我認爲奇數值留在整數中的垃圾數據上,因爲它們與字符串的大小不同。我的任務說,字符串和整數是相同的大小,我現在知道這是不正確的。我已經爲自己的班級教過自己的Ada,所以我仍然在學習很多東西。我正在使用Gnat和GPS。 – user1279914