1

C で 2D 配列の 2 つの要素を交換しようとしていますが、うまくいきません。

これまでの回答に感謝しますが、このコードを編集して、自分が何をしているのかを明確にしました。

typedef struct smystruct { /* stuff... */ } mystruct;

void nswap( mystruct ** a, mystruct ** b )
{
  mystruct * tmp = *a;
  *a = *b;
  *b = tmp;
}

void nqsort( mystruct ** h, int m, int n )
{
  double key = 0.0;
  int i = 0, j = 0, k = 0;

  if( m < n ) {
    // choose the pivot point...
    k = (m + n) / 2;

    nswap( &h[ n ], &h[ k ] );

    key = (*h+m)->prob;

    i = m + 1;
    j = n;

    while ( i <= j ) {
      while ( (i <= n) && (*h+i)->prob <= key )
        i++;
      while ( (j >= m) && (*h+j)->prob > key )
        j--;
      if ( i < j ) {
        nswap( &h[i], &h[j] );
      }
    }

    // swap two elements
    nswap( &h[m], &h[j] );

    // recursively sort the lesser list
    nqsort( h, m, j-1 );
    nqsort( h, j+1, n );
  }
}

int main()
{
  mystruct * p = NULL;

  // get the number of nodes (m)...
  fscanf( in, "%d", &m );

  // allocate memory for the node and connectivity matrix arrays...
  p = (mystruct*)malloc( sizeof( mystruct ) * m );

  // read in the location and associated probabilities!...
  for ( ; loop < m ; ++loop ) {
    mystruct * tmpnode = p + loop;
    tmpnode->str = (char*)malloc( sizeof( char ) * 1024 );
    fscanf( in, "%s %lf", (char *)tmpnode->str, &tmpnode->prob );
  }

  nqsort( &p, 0, m );
}

言うまでもなく、これは機能しません。例を検索しましたが、何も機能していないようです。n00b へのアドバイスをいただければ幸いです。

4

3 に答える 3

2

複数のものが間違っています。

1/ 2D 配列が正しく割り当てられていません (またはコードがありません)。2/ このような 2D 割り当てを行う適切な方法は、Iliffe ポインターを使用することです (C/C++ の数値レシピでアドバイスされているように)。

mystruct** alloc_array( int h, int w )
{
  int i;
  mystruct** m = malloc(h*sizeof(mystruct*));
  m[0] = malloc(h*w*sizeof(mystruct));
  for(i=1;i<h;i++) m[i] = m[i-1]+w;
  return m;
}

void release_array(mystruct** m)
{
  free( m[0] );
  free( m);
}

この割り当て方法により、メモリの連続したブロック (扱いやすく、キャッシュにやさしく、インデックス計算を行う必要がない) と [][] アクセスの両方が得られます。

スワップ関数は次のようになります。

void swap( mystruct* a, mystruct* b )
{
  mystruct tmp = *a
  *a = *b;
  *b = tmp;
}

次のように呼び出すことができます:

swap( &some_tab[i][j], &some_other_tab[u][v] );

完全な例では:

int main()
{
  mystruct** my_array = alloc_array(3,4); /* 3x4 mystruct array */

  /* fill the array */

  /* Swap some */

  swap( &my_array[2][1], &my_array[0][3] );


  release_array(my_array);
}
于 2011-06-19T14:56:55.420 に答える
2
  1. 最後の要素のインデックスcount-1は ではなくcountです。

    h[0]  h[1]  h[2]  h[3]  h[4]  h[5]  h[6]  h[7]  h[8]  h[9]
    ----------------------------------------------------------
                         total 10 elements
    
  2. とは何かわかりませfwnodesh

于 2011-06-19T14:33:20.000 に答える
0

配列へのポインタを関数に渡しています。つまりh、要素は 1 つしかありません。

swap( &p, 10 );

次のようにする必要があります。

swap( p, 10 );

つまり、 の配列を受け入れるように関数を変更するmystructp、 へのポインターの配列に変更する必要がありますmystruct

そして、KennyTM が示唆したように、最後の要素のインデックスは 10 ではなく 9 です。

于 2011-06-19T14:49:56.807 に答える