有没有办法在另一个函数中使用main()中定义的静态数组,而不将其作为参数赋予函数?
例如:
main()定义了数组:
int Array[10];
填充整数。我想为qsort创建一个比较函数,它必须有这个标题:
int compar (const void* a, const void* b);
我想这样决定:
if Array[a]<Array[b] return 1
等...
此数组不能直接提供给qsort,但需要精确排序。
此外,此数组必须是静态的(无需重新分配)。
有没有人有任何想法?
答案 0 :(得分:3)
当然,唯一的方法是将数组的地址作为全局变量提供。
即使数组本身在main()
内,这也是可能的,但是你必须将全局初始化为正确范围的地址,并且当然要注意生命时间。
int *mains_array;
static int qsort_callback(const void *a, const void *b)
{
/* use mains_array */
}
int main(void)
{
int secret_array[100];
mains_array = secret_array;
qsort(something, something, qsort_callback);
}
这是一个非常难看的解决方案,应该多考虑一下。
答案 1 :(得分:1)
您无法从其他功能访问本地变量。您需要将其设置为全局或文件作用域。
全局:
/* Declare Array outside any function */
int Array[10];
int main(...
或,文件作用域:
/* Declare Array outside any function */
static int Array[10];
int main(...
注意:
您的比较函数将接收要比较的元素的指针。如果要对int
数组进行排序,则需要在比较函数中取消引用指针:
我假设Array
不是您要排序的数组,而是一个包含有关如何对数组进行排序的信息的数组。
int compare (const void * ap, const void * bp)
{
int a = *((int*)ap);
int b = *((int*)bp);
if (Array[a] < Array[b]) {
return 1;
}
if (Array[a] > Array[b]) {
return -1;
}
return 0;
}
答案 2 :(得分:0)
qsort
需要数组的地址,因此您无法选择。但是定义数组的位置无关紧要。你只需要能够参考它。
qsort
签名是:
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
所以你会通过以下方式来称呼它:
qsort(Array, 10, sizeof(int), compar);
你会像往常一样做比较功能:
int compar (const void* a, const void* b) {
return *((int*)a) - *((int*)b);
}
您需要了解传递给compar
的值不是索引,而是数组单元格的地址。因此,您不必使用Array
函数中的compar
,您已经拥有了所需的内容。
答案 3 :(得分:0)
你已经通过拨打
给了他你的阵列qsort (a, numberOfElements, sizeOfEachElement, compare);
比较功能需要做的是:
int compare (const void * a, const void * b)
{
//Here int can be other type
return ( *(int*)a - *(int*)b );
}