2013-11-04 73 views
0

我正在將C++代碼轉換爲C#代碼,它恰好是頻域中圖像的快速傅里葉變換。只是爲了給出一些背景。C++和C#數組和空轉換

這裏是一個C++代碼的鏈接:fft.cc

我有這個功能稱爲步驟,它的簽名是在C++:

void step (int n, int mj, float a[], float b[], float c[], float d[], float w[], float sgn); 

,被稱爲像這樣:

step (n, mj, &x[0*2+0], &x[(n/2)*2+0], &y[0*2+0], &y[mj*2+0], w, sgn); 

我想將它轉換爲C#,現在這個函數在Y或X數組上運行,這取決於它是正向快速傅立葉變換還是後向快速傅立葉變換米(更多上下文)

我不明白的是,在C#中,做x[0*2+0]什麼都不做......首先在方括號中放置一個整數實際上在該數組的一個位置調用一個變量。

但究竟是什麼在C++做的,我知道&是當量的ref C#的關鍵字,這是說得到被指向太陣列的內容,但我覺得在這種情況下這意味着更多不僅僅如此。

那麼你會怎麼調用C#該功能,顯然這會失敗:

step(n, mj, x[0 * 2 + 0], x[(n/2) * 2 + 0], y[0 * 2 + 0], y[mj * 2 + 0], w, sgn); 

回答

2

在C++中,這是傳遞數組到函數的入口地址。這在C#中不起作用,因爲您無法獲取數組條目的地址。我建議重寫聲明只傳遞索引並單獨傳遞數組。或者讓x和y數組成爲包含類的成員。

呃,或者如果您只對單個元素感興趣,您可以改爲傳遞元素。請記住,C++中的float b []與float * b相同,所以如果跳過只訪問b [0](而不是[b + 1]),那麼這可能是更簡單的解決方案)。

當我們有一個C++的聲明等

void step (float a[]) 

其是相同

void step (float* a) 

我們用

step(&x[2]); 

調用它的函數步驟看到浮陣列從x的第二個入口開始。因此,步驟

float f = a[0]; 

將引用x [2]處的元素;

當然,也可以解決a[27],但這很容易出錯,因爲我們不知道x的剩餘長度。

爲了在這種情況下找到最佳解決方案,需要知道步驟對參數的處理。是否可以發佈步驟功能或其中的一部分?

+0

請問您是否可以在代碼中詳細說明,我發現它有點難以理解,是C++將數組傳遞給函數還是單個浮點數? –

+0

它將數組條目的地址傳遞給函數。 '&x [0 * 2 + 0]'表示:取[0 * 2 + 0]處的浮點地址(在這種情況下:數組的起始處)並將其傳遞給函數。在C++中,這又是一個數組,所以在函數內部,a將是一個數組,其索引現在是0,而參數是。我會盡量解釋一下這一點。 – PMF

+0

Ahhh,所以它實際上試圖從索引處開始指定數組的子集。歡呼聲 –

0

刪除地址,除了使其成爲具有更改值或返回值的函數的類之外,無法更改值。而不是float a[]使用float[] a

這是你的函數的樣子,沒有必要標題:

public class entity 
{ 
    public void Step(int n, int mj, float a[], float[] b, float[] c, float[] d, float[] w, float sgn) 
    { 
     ... 
    } 

    Step(0, 0, new[] { 1f, 1f }, new[] { 1f, 1f }, new[] { 1f, 1f }, new[] { 1f, 1f }, new[] { 1f, 1f }, 1f); 
} 
+0

這並沒有真正的幫助,因爲您傳遞的是新數據而不是對現有數據陣列的引用。 – Wilbert

0

的C++版本,您可以在三分球(想引用),以數據的某些元素通過。

對於C#版本,我建議你在兩個陣列直接傳遞,然後只通過在索引,所以

void step (int n, int mj, float a[], float b[], float c[], float d[], 
     float w[], float sgn); 

成爲

void Step(float[] x, float[] y, int n, int mj, int ai, int bi, int ci, int di, 
    int w, float sign) 
{ 
     float a = x[ai]; 
     float b = x[bi]; 
     float y = y[ci]; 

     // .... compute whatever 


    x[ai] = a; 
    x[bi] = b; 
    //... 
} 

如果遇到類似在C++函數[5]中,你可以簡單地使用

float aa = x[ai+5]; 

但當然你需要思考如果有必要,寫回新的價值。