2012-03-19 73 views
1

我需要將C代碼轉換爲Java。 最小C代碼是:更改Java中函數參數的值

void changeX(int *x) 
{ 
    *x=5; 
} 

changeX被稱爲在函數B爲:

void B() 
{ 
    int k= 2; 
    changeX((int*) &k); 
} 

的問題而將其轉換成Java是x不是類成員,所以我不能使用此。我如何將這些代碼轉換爲Java?

+0

也許你不能將簡單,可靠和自動的C代碼轉換爲Java。你有另一種方法來解決你的問題? – 2012-03-19 06:22:32

+2

我的C很生疏,但C代碼是否確實按照您的想法執行了操作? – Bombe 2012-03-19 06:22:48

+2

而你的例子可能會崩潰(因爲它是在地址0x2處引用一個int),但是Java沒有崩潰的行爲......或者你的意思是''B'體內的changeX((int *)&k);' ? – 2012-03-19 06:24:02

回答

5

假設你真的在問:「我可以在Java中使用pass-by-reference」(C代碼沒有使用,但是使用指針進行模擬,這在Java中也不支持)答案沒有。

選項:

  • 通行證中的一個對象,其包含一個字段的引用可以改變
  • (醜陋,但相當於在某種意義上以上)的大小的數組傳遞1使用本地變量構成,變異的方法中的變量,然後基於陣列的內容之後
  • 返回新值重新設定的局部變量,併爲其分配這樣
  • 更改您的設計,使喲你不需要這

這些選項的最後兩個是最好的。如果你可以提供更多關於大圖的信息 - 爲什麼你認爲你想這樣做 - 這將有所幫助。

+0

我如何在這裏使用包裝類? – 2012-03-19 06:32:56

+0

@RogMatthews:像數組一樣:創建一個包裝類,使用局部變量實例化它,傳入包裝的引用,在方法中改變包裝器,然後返回調用器,或者從包裝器再次設置局部變量或者直接使用它。但是很醜陋 - 重新設計會更好。 – 2012-03-19 06:34:20

+0

你的意思是選擇4的「改變你的設計」嗎? – 2012-03-19 06:59:23

0

您應該返回x的新值,該方法應該如下:

private int changeX(int x){ 
    return 5; 
} 
0

您現有的C代碼是不正確的:

void B() 
{ 
    int k= 2; 
    // you are not passing address of variable k but instead 
    // you are passing k (which is 2) as the address whose location needs 
    // to be changed. So you are writing to address 2 which you don't own. 
    changeX((int*) k); 
} 

你需要的是:

changeX(&k); 

現在,這是通過地址傳遞來改變變量的值。現在這樣的東西在Java中總是使用按值傳遞是不可能的。但是,通過在Integer對象或整數數組(也是對象)中封閉int變量並通過值傳遞對象,您可以獲得類似的效果。

+0

雖然這不是對Java問題的真正答案 – 2012-03-19 06:26:05

+0

@JonSkeet:正在更新答案 – codaddict 2012-03-19 06:29:06

+0

請注意,C代碼也使用pass-by-value - 它只是傳遞的值是指向變量和* *在*中不被支持* – 2012-03-19 06:30:19

1

使用一個元素的數組引用:

void changeX(int[] x) { 
    // do not forget about checks 
    x[0] = 5; 
} 

void test() { 
    int[] x = {0}; 
    changeX(x); 
} 
0

簡單地說Java沒有相當於一個指向基本類型 - 爲了實現這一點,你需要一個參考的int類型類似

class RefInt { 
    public int Value; 
    RefInt(int x) { Value=x; } 
} 

你在同樣的情況下通過這個和它的作品像這樣:

RefInt X=new RefInt(3) 
ChangeX(X); 

很顯然,在這個上下文簡單地將返回值更改爲int類型並指定它會更好,但這並不能解決您的一般問題。

0

選項1: 將int變量放在包裝類中。通過該方法。在該方法中,您可以更改包裝器實例中的值。

選項2: 使changeX()返回int並用k = changeX(k)替換所有的changeX(k)。

1

作爲一個原始而不是類成員,您不能將該引用傳遞給另一個方法。改爲使用類成員。