2017-06-18 17 views
0

私は50×50の行列arr[50][50]を持っており、サブ配列arr[0]arr[1]の値を入れ替える必要があります。 すなわち、各サブアレイの50個の要素全体を交換する必要があります。任意の単純または短い方法があった場合、私は思っていたCの多次元配列のサブ配列を交換する

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

:これを行うには、私は考えることができる

唯一の方法は次のようにループを使用しているのですか?多分ポインターを使う?

「型 『int型*』から 『[2] int型』と入力して割り当てるときに互換性のない型」私は

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

のようなものを試してみましたが、それはおよそ最初の行でエラーが発生しました。 「タイプ 『INT *』から 『INT [50]』型に割り当てるときに互換性のない型」

は、それからアレイ

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

私は約二行目でエラーが発生しました。この時間へのポインタを試みました。

+0

第3の変数である 'arr [0] [i] = arr [0] [i]^arr [1] [i]を使う代わりに、xor式を使う方が速いでしょう。 arr [1] [i] = arr [0] [i]^arr [1] [i]; arr [0] [i] = arr [0] [i]^arr [1] [i]; '複雑さは同じですが、定数が変化します。 –

+3

'='でデータをコピーする唯一の方法は、単純な変数、単一の配列要素、または 'struct'からです。 'int temp [50]'と 'memcpy'を使うことを考えてください。 –

+0

行をコピーする(またはスワップする)必要があります。 'int tmp [50];' 'memcpy(tmp、arr [0]、50 * sizeof * tmp)のようなものを使うことができます。 memcpy(arr [0]、arr [1]、50 * sizeof * arr [0]); memcpy(arr [1]、tmp、50 * sizeof * arr [1]); ' –

答えて

4

マトリックスがarr[50][50]として実装されている場合、物理的に2つの行を物理的にスワップする唯一の方法は、物理的にメモリ内のデータを交換することです。あなたのサイクルはそれを行う一つの方法です。残りの部分は、そのアプローチの変種にすぎません。行列要素を1つずつ(サイクル)交換することができます。中間の行サイズのバッファ(memcpyアプローチ)を使用して行全体を入れ替えることができます。それらのすべてはまだ同じことをしています。その周りには道はない。あなたの配列が異なって実装された場合

- 「ギザギ​​ザ」の配列は、サブアレイへポインタの配列として実装し、次の2つのポインタを単に交換すると、それを使って行うことができるであろう、と言います。しかし、arr[50][50]の場合は不可能です。

希望の場合は、現在の配列を別の行ポインタ配列で「ギザギザ」に変換するだけで済みます。元a[50][50]aの物理的な構造にもかかわらず、あなたはまだそれで動作するようにa[i][j]構文を使用することができ、今で異なっていること、a_data

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"); 
} 

注になりますしながら、その行ポインタの配列は今、あなたの行列aになります。

+0

「ギザギザの」配列のトリックは私にとって初めてのことです。 –

0

memcpyでスワップするデータをコピーする必要があります。どのようにスワップすることができるかを示すためにサンプルを提供しました(つまり、スワップarr [0]と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私はもともと4×4行列を取っていましたが、今すぐ修正しました – Pras

+0

ありがとうございました –

1

としてはコメントで説明し、他の回答の中に、実際の2Dアレイ(ポインタの配列に並置されるように)の行を交換するために、あなたは、ソースからデータを移動/コピーする必要がありますメモリ内のターゲット行。これに近づける最も単純な方法は、要素を要素ごとにコピーしてスワップを行うためのループ、またはCライブラリによって提供されるメモリコピー機能を使用することです(例:memcpyまたはmemmove)。オーバー

#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'); 
    } 

} 

使用例/出力

$ ./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 

ルックものとなら、私が知っている:memcopyを使用して、簡単な実装では、(実施例の目的のためにアレイの3x10配列を示す)になりますあなたは何か質問があります。

+0

ありがとうございました! –