我需要將C代碼轉換爲Java。 最小C代碼是:更改Java中函數參數的值
void changeX(int *x)
{
*x=5;
}
changeX被稱爲在函數B爲:
void B()
{
int k= 2;
changeX((int*) &k);
}
的問題而將其轉換成Java是x不是類成員,所以我不能使用此。我如何將這些代碼轉換爲Java?
我需要將C代碼轉換爲Java。 最小C代碼是:更改Java中函數參數的值
void changeX(int *x)
{
*x=5;
}
changeX被稱爲在函數B爲:
void B()
{
int k= 2;
changeX((int*) &k);
}
的問題而將其轉換成Java是x不是類成員,所以我不能使用此。我如何將這些代碼轉換爲Java?
假設你真的在問:「我可以在Java中使用pass-by-reference」(C代碼沒有使用,但是使用指針進行模擬,這在Java中也不支持)答案沒有。
選項:
這些選項的最後兩個是最好的。如果你可以提供更多關於大圖的信息 - 爲什麼你認爲你想這樣做 - 這將有所幫助。
我如何在這裏使用包裝類? – 2012-03-19 06:32:56
@RogMatthews:像數組一樣:創建一個包裝類,使用局部變量實例化它,傳入包裝的引用,在方法中改變包裝器,然後返回調用器,或者從包裝器再次設置局部變量或者直接使用它。但是很醜陋 - 重新設計會更好。 – 2012-03-19 06:34:20
你的意思是選擇4的「改變你的設計」嗎? – 2012-03-19 06:59:23
您應該返回x的新值,該方法應該如下:
private int changeX(int x){
return 5;
}
您現有的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變量並通過值傳遞對象,您可以獲得類似的效果。
雖然這不是對Java問題的真正答案 – 2012-03-19 06:26:05
@JonSkeet:正在更新答案 – codaddict 2012-03-19 06:29:06
請注意,C代碼也使用pass-by-value - 它只是傳遞的值是指向變量和* *在*中不被支持* – 2012-03-19 06:30:19
使用一個元素的數組引用:
void changeX(int[] x) {
// do not forget about checks
x[0] = 5;
}
void test() {
int[] x = {0};
changeX(x);
}
簡單地說Java沒有相當於一個指向基本類型 - 爲了實現這一點,你需要一個參考的int類型類似
class RefInt {
public int Value;
RefInt(int x) { Value=x; }
}
你在同樣的情況下通過這個和它的作品像這樣:
RefInt X=new RefInt(3)
ChangeX(X);
很顯然,在這個上下文簡單地將返回值更改爲int類型並指定它會更好,但這並不能解決您的一般問題。
選項1: 將int變量放在包裝類中。通過該方法。在該方法中,您可以更改包裝器實例中的值。
選項2: 使changeX()返回int並用k = changeX(k)替換所有的changeX(k)。
作爲一個原始而不是類成員,您不能將該引用傳遞給另一個方法。改爲使用類成員。
也許你不能將簡單,可靠和自動的C代碼轉換爲Java。你有另一種方法來解決你的問題? – 2012-03-19 06:22:32
我的C很生疏,但C代碼是否確實按照您的想法執行了操作? – Bombe 2012-03-19 06:22:48
而你的例子可能會崩潰(因爲它是在地址0x2處引用一個int),但是Java沒有崩潰的行爲......或者你的意思是''B'體內的changeX((int *)&k);' ? – 2012-03-19 06:24:02