我试图在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将不胜感激。
答案 0 :(得分:2)
最后一个元素的索引为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
我不知道fwnodes
是什么,也许你的意思是h
。
答案 1 :(得分:2)
那里有多个错误。
1 /您的2D数组分配错误(或代码丢失)。 2 /进行这种2D分配的正确方法是使用Iliffe指针(如C / C ++中的Numrical Recipes中所建议的那样)。
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);
}
答案 2 :(得分:0)
您正在将指向数组的指针传递给您的函数。这意味着h
只有一个元素。
swap( &p, 10 );
应该是:
swap( p, 10 );
这意味着您需要更改函数以接受mystruct
数组或将p
更改为指向mystruct
的数组。
而且,正如KennyTM建议最后一个元素的索引9不是10。