2012-03-28 7 views
1

Ich weiß, dass wir die Adresse eines Objekts nicht sicher in Java zugreifen können und wir sollten niemals versuchen, etwas in der Art zu tun. Aber ich muss diesen C-Code in Java konvertieren. Der Wert hat immer die Größe 8 bits. Der C-Code ist wie folgt:Konvertieren von C-Code in Java: Zeiger

void merge(int value,unsigned short* outp, int x,int y, int width) 
{ 
    unsigned char *outc; 
    outc=(unsigned char *) outp + y*width +x; 
    *outc=value; 
} 

Um es in Java zu umwandeln ich unsigned short* outp-short outp[] und unsigned char* outc-short outc[] umgewandelt haben. Dann kann ich Werte in Teilen zuweisen. Aber das Problem, das ich bin vor, dass, wenn diese Funktion in einer Schleife durch eine andere Funktion aufgerufen wird, die Breite jedes Mal erhöht wird und nur ein Byte zu einer bestimmten Zelle zugeordnet ..

Ich habe versucht, dieses Java-Code:

void merge(int value, int outp[], int x, int y, int width) 
{ 

if(outp[y*width + x] >0) 
    {  
     outp[y*width+x]=outp[y*width+x]<<8 +value; 
    } 
    else 
    { 
     outp[y*width+x]=value; 
    } 
} 

Wie kann ich das tun. Bitte helfen Sie. Vielen Dank.

+1

Bitte tun Sie das nicht. Dies beeinträchtigt die Lesbarkeit erheblich. Versuchen Sie, die Logik zu verstehen und das Gleiche in Java neu zu schreiben. Fügen Sie auch Kommentare hinzu, die Person neben Ihnen wird Sie segnen. – questzen

+0

@questcence Sorry, aber ich habe nicht verstanden, was nicht zu tun .. –

+0

ein Wort 'Lesbarkeit'. Die nächste Person müsste die gleichen Hürden nehmen, um herauszufinden, was vor sich geht. – questzen

Antwort

3

Es ist nicht "möglich" in Java, das keine Zeiger hat. Es hat Referenzen, die für den primitiven Typ wie char irrelevant sind.

also in Java typischerweise Methode, die wir verwenden, die Wert zurückgibt, anstatt den Wert über Zeiger wie C-Programmierer Rückkehr tun:

char merge(int value,int x,int y, int width) { 
    char outchar; 
    /// your code... 
    return outchar; 
} 
+0

Aber dieser Code ist Teil eines sehr großen Projekts, ich habe einige 10000 Zeilen Java-Code geschrieben. Ich muss nur diese Funktion schreiben, damit mein Code funktioniert. –

+0

-1, um Ratschläge zu geben, die völlig unabhängig von der Lösung des Problems sind. – josefx

+0

+1, für nicht versuchen, C in Java zu schreiben. –

0

Ich habe keine Ahnung, was Ihr Code tun sollten. Für mich sieht es so aus, als ob es nur das untere Byte einer Abkürzung auf den gegebenen Wert setzt und die Verschiebung in Ihrem Java-Code scheint fehl am Platz zu sein. Da Sie aus irgendeinem Grunde kurz ersetzt [] mit int [] Ich weiß nicht, ob die folgende helfen:

void merge(int value,short[] outp, int x,int y, int width){ 
    int address = y*width +x; 
    short temp = outp[address]; 
    temp &= 0xFF00;//keep the high order bits of the old value 
    temp |= (short)(value & 0x00FF);//set the low order bits 
    outp[address] = temp; 

} 
0

Ihr C-Code sieht aus wie Pointer-Arithmetik die Adresse einer Zelle an einem bestimmten Ort zu finden in ein Raster, dann legen Sie den Wert an diesem Ort fest.

Für Ihren Java-Code würde ich einen völlig anderen Ansatz empfehlen. Welche Datenstruktur verwendet Ihr Calling Code für das Grid? Sie könnten eine Klasse verwenden, die das Gitter modelliert, und eine setValue (x, y) -Methode enthält. Wie die Klasse das Gitter intern modelliert, liegt bei Ihnen - es könnte ein zweidimensionales Array verwenden.

0

Als C-Programmierer, der versucht hat, Java für ein Projekt zu verwenden, kann ich mich mit Ihren Problemen identifizieren.

Um Ihr Problem zu lösen, würde ich lieber versuchen, auf Ihre 2D-Daten ein 1D Java Bytearray zuzugreifen.

Dies wird es trivial machen, auf das (row * col) -Byte zuzugreifen, und Sie werden die Notwendigkeit für diesen Wrapper-Code ersparen (der in einer Schleife sehr teuer sein wird).

Ob Sie das Array von Java oder von C zuweisen, hängt von Ihrem Projekt ab, aber JNI-Aufrufe machen beide Lösungen möglich.

Viel Glück!