我正在使用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完全理解它。
请帮忙!
答案 0 :(得分:1)
编译器抱怨此片段中的局部变量a
和b
的初始化:
int compare_int(const void *pa, const void *pb) { const int ((*a)[1]) = pa; const int ((*b)[1]) = pb;
编译器是对的。居多。
考虑变量a
。 Cdecl如此解释其声明:
声明一个as指向const int
的数组1的指针
特别注意a
本身不是const
(无法声明数组const
);相反,a
的{em>元素是const
。这是一个没有太大区别的区别,除了一个挑剔的编译器,它观察到函数参数pa
被声明为指向const
对象的指针,并且a
被声明为指向a的const
非const
对象,因此将前者分配给后者会丢失(技术上)a
- 对象。
最好的解决方案可能是停止尝试这么聪明。为什么将b
和int
声明为指向单元素数组的指针,当整点是比较它们指向的对象时(如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}'