2013-10-06 76 views
-1

我正在將C++程序轉換爲Java,並且遇到了麻煩,因爲java中沒有memcpy。嘗試將C++程序轉換爲Java。需要Memcpy幫助

在做了一些研究之後,我已經採取了最好的措施,但是我真的很猶豫,並且不確定這是否應該像C++程序那樣做,因爲我發現迄今發現的信息有點兒混亂。

(Java代碼仍具有的memcpy但註釋爲refernce)

該票據兩個
圖片=輸入圖像
輸出=輸出圖像
N =圖片
M的寬度=高度圖片。

在C++代碼中,元素是一個unsigned short int。

C++代碼

void medianfilter(element* image, element* result, int N, int M) 
{ 
    // Check arguments 
    if (!image || N < 1 || M < 1) 
     return; 
    // Allocate memory for signal extension 
    element* extension = new element[(N + 2) * (M + 2)]; 
    // Check memory allocation 
    if (!extension) 
     return; 


    // Create image extension 
    for (int i = 0; i < M; ++i) 
    { 
     memcpy(extension + (N + 2) * (i + 1) + 1, image + N * i, N * sizeof(element)); 
     extension[(N + 2) * (i + 1)] = image[N * i]; 
     extension[(N + 2) * (i + 2) - 1] = image[N * (i + 1) - 1]; 
    } 
    // Fill first line of image extension 
    memcpy(extension, extension + N + 2, (N + 2) * sizeof(element)); 
    // Fill last line of image extension 
    memcpy(extension + (N + 2) * (M + 1), extension + (N + 2) * M, (N + 2) * sizeof(element)); 
    // Call median filter implementation 
    _medianfilter(extension, result ? result : image, N + 2, M + 2); 
    // Free memory 
    delete[] extension; 
} 

Java代碼迄今。

public static void medianfilter(long[] image, long[] result, int N, int M) 
{ 
    // Check arguments 
    if (N < 1 || M < 1) 
     return; 
    // Allocate memory for signal extension 
    long[] extension = new long[(N + 2) * (M + 2)]; 

    // Create image extension 
    for (int i = 0; i < M; ++i) 
    { 
     //memcpy(extension + (N + 2) * (i + 1) + 1, image + N * i, N * sizeof(element)); 
     for(int k = 0 ; k < N ; k++) 
     { 
      extension[(N+2 * (i+1)+1)+k] = image[(N*i)+k]; 
     } 

     extension[(N + 2) * (i + 1)] = image[N * i]; 
     extension[(N + 2) * (i + 2) - 1] = image[N * (i + 1) - 1]; 
    } 
    // Fill first line of image extension 
    //memcpy(extension, extension + N + 2, (N + 2) * sizeof(element)); 
    // Fill last line of image extension 
    //memcpy(extension + (N + 2) * (M + 1), extension + (N + 2) * M, (N + 2) * sizeof(element)); 
    // Call median filter implementation 
    //_medianfilter(extension, result ? result : image, N + 2, M + 2); 
} 

我高度懷疑我做錯了,只是想在這方面得到一些幫助。 (程序的其餘部分很簡單,因爲它不使用memcpy)。

回答

0

的Java實際上確實有東西一樣的memcpy()。不安全類有一個與memcpy()基本相同的copyMemory()方法。當然,就像memcpy()一樣,它不提供內存覆蓋,數據銷燬等保護。不清楚它是真的是memcpy()還是memmove()。它可用於從實際地址複製到實際地址或從參考文獻引用。請注意,如果使用引用,則必須提供偏移量(否則JVM將盡快死亡)。 ()我的老累PC上每秒鐘高達2 GB)。使用風險自負。請注意,所有JVM實現都不存在不安全類。

您還應該看看「Java中的直接內存訪問技巧」(http://highlyscalable.wordpress.com/2012/02/02/direct-memory-access-in-java/)和「Java Magic。第4部分:sun.misc.Unsafe」(C++到Java等效的memcpy函數) 。這些人深諳如何在Java中進行低級(和風險)操作。

3

實際上,Java的形式爲memcpy,調用爲Arrays.copyOf

memcpy(source, dest, size) 

成爲

long[] dest = Arrays.copyOf(source, newSize);