1

有没有办法在另一个函数中使用在 main() 中定义的静态数组,而不将它作为参数提供给函数?

例如:

main() 定义了数组:

int Array[10];

用整数填充。我想为 qsort 创建一个比较函数,它必须有这个标题:

int compar (const void* a, const void* b);

我希望它像这样决定:

if Array[a]<Array[b] return 1

ETC...

该数组不能直接提供给 qsort,但对于精确排序是必需的。

此外,这个数组必须是静态的(没有重新分配)。

有没有人有任何想法?

4

4 回答 4

3

当然,唯一的方法是使数组的地址可用作全局变量。

即使数组本身在 inside 也是可能的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);
}

这是一个非常丑陋的解决方案,应该多加考虑。

于 2013-11-14T12:29:01.990 回答
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;
}
于 2013-11-14T12:29:06.450 回答
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不是索引,而是数组单元格的地址。所以你不必使用Arrayfromcompar函数,你已经拥有了你需要的东西。

于 2013-11-14T12:28:35.600 回答
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 );
}
于 2013-11-14T12:29:45.657 回答