Qsort 数组 |警告:初始化丢弃指针目标类型的限定符
Qsort array | warning: initialization discards qualifiers from pointer target type
我正在 GCC 中编译这个程序,使用 Wall 命令,它看起来很清楚。但是我的大学在线平台出现编译时错误
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 开始的路径长度,第二个是可以填充它的对数(未排序)。然后使用贪心算法,它必须找到需要多少段来填充它。这里的问题是对矩阵进行快速排序,显然它有一些指针错误,但我找不到这里的问题......我想它有点基础但我根本无法理解它。
请帮忙!
编译器抱怨此片段中局部变量 a
和 b
的初始化:
int compare_int(const void *pa, const void *pb) {
const int ((*a)[1]) = pa;
const int ((*b)[1]) = pb;
编译器是对的。主要是。
考虑变量 a
。 Cdecl 像这样解释它的声明:
declare a as pointer to array 1 of const int
特别注意,不是a
本身就是const
(没有办法声明数组const
);相反,a
的 元素 是 const
。这是一个没有太大区别的区别,除了挑剔的编译器观察到函数参数 pa
被声明为指向 const
对象的指针,而 a
被声明为指向非 const
对象,因此将前者分配给后者会失去(技术上)const
-ness.
最好的解决办法可能是停止尝试变得如此聪明。为什么将 a
和 b
声明为指向单元素数组的指针,而重点是比较它们指向的对象(如 int
s)?您必须在局部变量声明中以及在使用这些值的任何地方使用棘手的语法。我会这样做:
int compare_int(const void *pa, const void *pb) {
int a = *(const int *)pa;
int b = *(const int *)pb;
if ( a < b ) return -1;
// ...
我正在 GCC 中编译这个程序,使用 Wall 命令,它看起来很清楚。但是我的大学在线平台出现编译时错误
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 开始的路径长度,第二个是可以填充它的对数(未排序)。然后使用贪心算法,它必须找到需要多少段来填充它。这里的问题是对矩阵进行快速排序,显然它有一些指针错误,但我找不到这里的问题......我想它有点基础但我根本无法理解它。
请帮忙!
编译器抱怨此片段中局部变量 a
和 b
的初始化:
int compare_int(const void *pa, const void *pb) { const int ((*a)[1]) = pa; const int ((*b)[1]) = pb;
编译器是对的。主要是。
考虑变量 a
。 Cdecl 像这样解释它的声明:
declare a as pointer to array 1 of const int
特别注意,不是a
本身就是const
(没有办法声明数组const
);相反,a
的 元素 是 const
。这是一个没有太大区别的区别,除了挑剔的编译器观察到函数参数 pa
被声明为指向 const
对象的指针,而 a
被声明为指向非 const
对象,因此将前者分配给后者会失去(技术上)const
-ness.
最好的解决办法可能是停止尝试变得如此聪明。为什么将 a
和 b
声明为指向单元素数组的指针,而重点是比较它们指向的对象(如 int
s)?您必须在局部变量声明中以及在使用这些值的任何地方使用棘手的语法。我会这样做:
int compare_int(const void *pa, const void *pb) {
int a = *(const int *)pa;
int b = *(const int *)pb;
if ( a < b ) return -1;
// ...