Qsort数组|警告:初始化从指针目标类型中丢弃限定符

时间:2016-11-03 12:58:58

标签: c arrays pointers qsort

我正在使用Wall命令在GCC中编译这个程序,它看起来很清楚。但我的大学在线平台正在给出编译时错误

9.c:在功能' compare_int': 9.c:8:警告:初始化从指针目标类型中丢弃限定符 9.c:9:警告:初始化从指针目标类型

中丢弃限定符

这是代码

#include <stdio.h>
#include <stdlib.h>
#define MAX 1000

int c=0;

int compare_int(const void *pa, const void *pb) {
  const int ((*a)[1]) = pa;
  const int ((*b)[1]) = pb;
  if ( (*a)[0] < (*b)[0] ) return -1;
  if ( (*a)[0] > (*b)[0] ) return +1;
  return 0;
}

void check(int m, int lastNum, int startIndex, int v[][2], int n){
  if (lastNum >= m) printf("%d\n", c);
  else{
    int i,max=0;
    for (i=startIndex;v[i][0]<=lastNum;i++){
      if (v[i][0] <= lastNum)
    if (v[i][1] > max) max = v[i][1];
    }
    c++;
    check(m, max, i,v, n);
  }
}

int main(){
  int m,n,i;
  int line[MAX][2];
  scanf("%d", &m);
  scanf("%d", &n);
  for (i=0;i<n;i++){
    scanf("%d %d", &line[i][0], &line [i][1]);
  }
  qsort(line, n, sizeof line[0], compare_int);
  check(m, 0, 0, line, n); 
  return 0;
}

该程序应该读取2个数字。第一个是从0开始的路径的长度,第二个是可以填充它的对的数量(未排序)。然后使用贪婪算法,它必须找到满足它所需的段数。这里的问题是用对快速排序矩阵,显然它有一些指针错误,但我无法在这里找到错误...我猜它有些基本但我可以&#39完全理解它。

请帮忙!

1 个答案:

答案 0 :(得分:1)

编译器抱怨此片段中的局部变量ab的初始化:

int compare_int(const void *pa, const void *pb) {
  const int ((*a)[1]) = pa;
  const int ((*b)[1]) = pb;

编译器是对的。居多。

考虑变量aCdecl如此解释其声明:

  

声明一个as指向const int

的数组1的指针

特别注意a本身不是const(无法声明数组const);相反,a的{​​em>元素是const。这是一个没有太大区别的区别,除了一个挑剔的编译器,它观察到函数参数pa被声明为指向const对象的指针,并且a被声明为指向a的constconst对象,因此将前者分配给后者会丢失(技术上)a - 对象。

最好的解决方案可能是停止尝试这么聪明。为什么将bint声明为指向单元素数组的指针,当整点是比较它们指向的对象时(如int compare_int(const void *pa, const void *pb) { int a = *(const int *)pa; int b = *(const int *)pb; if ( a < b ) return -1; // ... s)?您必须在局部变量声明中以及在使用值的任何位置推出棘手的语法。我只是这样做:

tr -s '\"," "\t' < filename | awk '{print $3}'