2017-06-18 5 views
0

Ich habe eine 50 x 50-Matrix arr[50][50] und müssen die Werte in der Sub-Array arr[0] und arr[1] tauschen. dh die ganzen 50 Elemente in jedem Unterfeld müssen ausgetauscht werden.Swap-Sub-Arrays eines mehrdimensionalen Arrays in C

Die einzige Art, wie ich mir vorstellen kann, dies zu tun ist durch eine Schleife wie mit:

for(i=0; i<50; ++i) 
{ 
    int t = arr[0][i]; 
    arr[0][i] = arr[1][i]; 
    arr[1][i] = t; 
} 

ich mich gefragt, ob es irgendwelche einfachere oder kürzere Methoden waren? Zeiger vielleicht verwenden?

Ich habe versucht, Dinge wie

int *t = arr[0]; 
arr[0] = arr[1]; 
arr[1] = t; 

aber es gab Fehler in der ersten Zeile über „inkompatible Typen bei der Zuordnung‚int [2]‘vom Typ‚int *‘zu geben“.

Dann habe ich versuchte Zeiger auf ein Array

int (*t)[50] = arr[0]; 
arr[0] = arr[1]; 
arr[1] = t; 

Diesmal I error etwa bei der zweiten Zeile got "inkompatible Typen beim Zuweisen 'int [50] vom Typ 'int *' eingeben".

+0

Nun wäre ein schnellerer Weg, XOR-Ausdruck zu verwenden statt eine dritte Variable zu verwenden - 'arr [0] [i] = arr [0] [i]^arr [1] [i]; arr [1] [i] = arr [0] [i]^arr [1] [i]; arr [0] [i] = arr [0] [i]^arr [1] [i]; ', Die Komplexität wäre die gleiche, aber die konstanten Faktoren ändern sich. –

+3

Die einzige Möglichkeit, Daten mit dem '=' zu kopieren, stammt von einer einfachen Variablen, einem einzelnen Array-Element oder einer 'struct'. Überlegen Sie sich, 'int temp [50]' und 'memcpy' zu verwenden. –

+0

Sie müssen die Zeilen kopieren (oder tauschen Sie sie aus). Sie können etwas wie 'int tmp [50];' dann 'memcpy (tmp, arr [0], 50 * sizeof * tmp); memcpy (arr [0], arr [1], 50 * sizeof * arr [0]); memcpy (arr [1], tmp, 50 * sizeof * arr [1]); ' –

Antwort

4

Wenn Ihre Matrix als arr[50][50] implementiert ist, besteht die einzige Möglichkeit, zwei Zeilen physisch zu vertauschen, darin, Daten physisch im Speicher auszutauschen. Dein Zyklus ist eine Möglichkeit, dies zu tun. Der Rest wäre nur eine Variante dieses Ansatzes. Sie können Matrixelemente einzeln austauschen (Ihr Zyklus), Sie können die gesamten Zeilen mit einem Zwischenpuffer in der Zeilengröße austauschen (memcpy Ansatz). Alle machen immer noch dasselbe. Es gibt keinen Weg um ihn herum.

Wenn Ihr Array unterschiedlich umgesetzt wurden - sagen wir, ein „zackig“ Array als Array von Zeiger zu Subarrays umgesetzt, dann würden Sie in der Lage sein, nur tauschen zwei Zeiger auf und mit ihr geschehen. Aber im Fall von arr[50][50] ist es nicht möglich.

Wenn Sie möchten, können Sie Ihr aktuelles Array einfach durch ein separates Zeilenzeiger-Array in eine "gezackte" Version "konvertieren". Das Zeilenzeigerfeld jetzt Ihre Matrix a, während die ursprünglichen a[50][50]a_data werden wird werden wird

int a_data[50][50]; 

int *a[50]; 
for (unsigned i = 0; i < 50; ++i) 
    a[i] = a_data[i]; 

/* Fill the matrix */ 
for (unsigned i = 0; i < 50; ++i) 
    for (unsigned j = 0; j < 50; ++j) 
    a[i][j] = rand(); 

/* Print the matrix */ 
for (unsigned i = 0; i < 50; ++i) 
{ 
    for (unsigned j = 0; j < 50; ++j) 
    printf("%d ", a[i][j]); 
    printf("\n"); 
} 

/* Swap the rows */ 
int *temp = a[0]; 
a[0] = a[1]; 
a[1] = temp; 

/* Print the matrix */ 
for (unsigned i = 0; i < 50; ++i) 
{ 
    for (unsigned j = 0; j < 50; ++j) 
    printf("%d ", a[i][j]); 
    printf("\n"); 
} 

Hinweis, dass trotz der physikalischen Struktur von a jetzt anders ist, können Sie immer noch a[i][j] Syntax verwenden, mit ihm zu arbeiten.

+0

Das 'gezackte' Array-Trick ist neu für mich. –

0

Sie müssen die Daten kopieren, um mit memcpy ausgetauscht zu werden, ich habe Probe zum Programm zur Verfügung gestellt, um zu zeigen, wie Sie es tun können (dh Swap arr [0] und arr [1]).

int main(void) { 
    // your code goes here 
    int t[3]; 
    int arr[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 
    printf("\n%d %d %d",arr[0][0],arr[0][1],arr[0][2]); 
    printf("\n%d %d %d",arr[1][0],arr[1][1],arr[1][2]); 
    memcpy(t,arr[0],sizeof(t)); 
    memcpy(arr[0],arr[1],sizeof(t)); 
    memcpy(arr[1],t,sizeof(t)); 
    printf("\n%d %d %d",arr[0][0],arr[0][1],arr[0][2]); 
    printf("\n%d %d %d",arr[1][0],arr[1][1],arr[1][2]); 
    return 0; 
} 
+0

@weather Vane, True Ich hatte früher ursprünglich 4 * 4 Matrix genommen, korrigierte es jetzt – Pras

+0

Danke für das Beispiel –

1

Wie in den Kommentaren, und in den anderen Antworten, um Zeilen einer aktuellen 2D-Array zu tauschen (im Gegensatz zu einem Array von Zeigern apposed), müssen Sie die Daten von der Quelle kopieren/verschieben zu Zielzeile im Speicher. Der einfachste Weg, dies zu erreichen, ist entweder eine Schleife, um Element für Element in einen temporären Speicher zu kopieren, um den Austausch zu bewirken, oder die Speicherkopiefunktionen, die von der C-Bibliothek bereitgestellt werden (z. B. memcpy oder memmove).Eine einfache Implementierung memcopy (dargestellt mit einem 3x10 Array für Array für die Zwecke des Beispiels) unter Verwendung wäre:

#include <stdio.h> 
#include <string.h> 

enum { ROW = 3, COL = 10 }; 

void swaprow (int (*a)[COL], int c1, int c2); 
void prna (int (*a)[COL]); 

int main (void) { 

    int a[ROW][COL] = {{0}}; 

    for (int i = 0; i < ROW; i++) 
     for (int j = 0; j < COL; j++) 
      a[i][j] = i; 

    prna (a); 
    swaprow (a, 0, 1); 
    putchar ('\n'); 
    prna (a); 

    return 0; 
} 

void swaprow (int (*a)[COL], int c1, int c2) 
{ 
    int tmp[COL]; 

    memcpy (tmp, a[c1], COL * sizeof *tmp); 
    memcpy (a[c1], a[c2], COL * sizeof *a[c1]); 
    memcpy (a[c2], tmp, COL * sizeof *a[c2]); 
} 

void prna (int (*a)[COL]) 
{ 
    for (int i = 0; i < ROW; i++) { 
     for (int j = 0; j < COL; j++) 
      printf ("%2d", a[i][j]); 
     putchar ('\n'); 
    } 

} 

Beispiel Verwendung/Output

$ ./bin/array2d_swap_row 
0 0 0 0 0 0 0 0 0 0 
1 1 1 1 1 1 1 1 1 1 
2 2 2 2 2 2 2 2 2 2 

1 1 1 1 1 1 1 1 1 1 
0 0 0 0 0 0 0 0 0 0 
2 2 2 2 2 2 2 2 2 2 

Blick über Dinge und lassen Sie mich wissen, wenn Hast du irgendwelche Fragen.

+0

Danke für das Beispiel! –

Verwandte Themen