2017-04-18 1 views
1

Ich versuche, einen String-Wert in einem 5x5 2D char * -Array in c zu ersetzen. Ich habe es geschafft, den Wert an der richtigen Stelle zu ersetzen, aber aus irgendeinem Grund ist das Ersatzzeichen im Array immer ein 'p' anstelle des gewünschten Zeichens. Ich habe versucht, strcpy() und strcat() als Alternative zum Zuweisen des Werts zu verwenden, obwohl diese beiden Methoden leider einen Segmentierungsfehler verursachen. Irgendwelche Vorschläge würden sehr geschätzt werden. Der Code ist unten angehängt.String-Wert in 2D char * -Array ersetzen c/java jni

Der 2D-Array in Frage wie folgt aussieht:

char *map[5][5] = { 
       {".", ".", ".", ".", "."}, 
       {".", ".", ".", ".", "."}, 
       {".", ".", "G", ".", "."}, 
       {".", ".", ".", ".", "."}, 
       {".", ".", ".", ".", "."} }; 

Und die Methode, die ich das Zeichen an einer bestimmten Position zu ändern bin mit ist:

JNIEXPORT void JNICALL Java_MapJNI_replaceTile(JNIEnv *env, jobject jObject, jint x, jint y, jchar tile){ 
      char tileChar = (char)tile; 
      map[y][x] = &tileChar; 
    } 

Die Fliese aus einer Java-Klasse übergeben wird .

+1

Warum die '* char [] []' statt 'char [] []' – Sniper

+0

1. Das Problem, das ich sehe, ist, dass Sie einen Zeiger eines Zeigers eines Zeigers verwenden: char * Karte [5] [5]. 2. Sie möchten den Code in C, aber Sie verwenden JNDI, warum? – moldovean

Antwort

0

In C ist map[y][x] = &tileChar; fehlerhafter Code als einmal die Funktion endet, map[y][x] enthält einen ungültigen Zeiger

JNIEXPORT void JNICALL Java_MapJNI_replaceTile(
    JNIEnv *env, jobject jObject, jint x, jint y, jchar tile){ 
    char tileChar = (char)tile; 
    map[y][x] = &tileChar; // BAD 
} 

Initialisiere die map und keine Zeiger, sondern als einen 5x5-Array von char[2]

char map[5][5][2] = { 
      {".", ".", ".", ".", "."}, 
      {".", ".", ".", ".", "."}, 
      {".", ".", "G", ".", "."}, 
      {".", ".", ".", ".", "."}, 
      {".", ".", ".", ".", "."} }; 

Dann einfach zuweisen die erste char.

JNIEXPORT void JNICALL Java_MapJNI_replaceTile(
    JNIEnv *env, jobject jObject, jint x, jint y, jchar tile){ 
    char tileChar = (char)tile; 
    map[y][x][0] = tileChar; 
} 

Alliteratively, verwenden nur ein 5x5-Array von char@Sniper. Dies wird sich jedoch auf den restlichen OP-Code auswirken.

char map[5][5] = { 
     {'.', '.', '.', '.', '.'}, 
     {'.', '.', '.', '.', '.'}, 
     {'.', '.', 'G', '.', '.'}, 
     {'.', '.', '.', '.', '.'}, 
     {'.', '.', '.', '.', '.'} }; 

JNIEXPORT void JNICALL Java_MapJNI_replaceTile(
    JNIEnv *env, jobject jObject, jint x, jint y, jchar tile){ 
    char tileChar = (char)tile; 
    map[y][x] = tileChar; 
} 
0

Sie übergeben die Adresse der tileChar, ich denke, Sie möchten das Zeichen selbst übergeben.

map[y][x] = tileChar; 

EDIT: nicht bemerkte es ein Array von Zeigern ist, ignorieren, was ich oben gesagt.

Sie erstellen ein Zeichen im Stapel. Wenn Sie also von der Funktion zurückkehren, ist der Zeiger auf das von Ihnen erstellte Zeichen nicht mehr gültig. Sie müssen das Zeichen im Heap erstellen.

+0

Nein. Es ist ein Array von Zeigern – Sniper

+1

Deklaration der tileChar in den Haufen funktionierte perfekt. Vielen Dank! – edwardam