我想根据(*double)[3]
列0
对pnt[i][0]
类型的指针进行排序。例如来自
4 3 4
2 1 2
9 4 5
我想要
2 1 2
4 3 4
9 4 5
我打电话给快速排序功能
qsort (pnt, numOfRows, sizeof(double), forQs);
withQs如下
int forQs (const void *x, const void *y)
{
const double **k = (const double **)x;
const double **l = (const double **)y;
return (*k)[0] - (*l)[0];
}
我最终遇到了分段错误,valgrind说这是因为forQs。我之前正在探索如何创建它,因为我不知道qsort
,但我看不出有任何错误。有人可以帮忙吗?
编辑:我也用过:
pnt = (double (*)[3]) malloc(100 * sizeof(*pnt));
答案 0 :(得分:0)
我试着制作两个样本,因为你不够好不知名。 请参考它。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int forQs (const void *x, const void *y)
{
const double **k = (const double **)x;
const double **l = (const double **)y;
return (*k)[0] - (*l)[0];
}
int main(){
double **pnt = malloc(100*sizeof(double(*)[3]));
int i, j;
for(i=0;i<3;++i)
pnt[i] = malloc(sizeof(double[3]));
memcpy(pnt[0], (double [3]){4.0, 3.0, 4.0}, sizeof(double[3]));
memcpy(pnt[1], (double [3]){2.0, 1.0, 2.0}, sizeof(double[3]));
memcpy(pnt[2], (double [3]){9.0, 4.0, 5.0}, sizeof(double[3]));
{//print before sort
int i,j;
for(i=0;i<3;++i){
for(j=0;j<3;++j)
printf("%g ", pnt[i][j]);
printf("\n");
}
printf("\n");
}
int numOfRows = 3;
// qsort(pnt, numOfRows, sizeof(double*), forQs);
qsort(pnt, numOfRows, sizeof(*pnt), forQs);
{//print after sort
int i,j;
for(i=0;i<3;++i){
for(j=0;j<3;++j)
printf("%g ", pnt[i][j]);
printf("\n");
}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int forQs (const void *x, const void *y)
{
const double (*k)[3] = *(const double (**)[3])x;
const double (*l)[3] = *(const double (**)[3])y;
return (*k)[0] - (*l)[0];
}
int main(){
double (**pnt)[3] = malloc(100*sizeof(*pnt));
int i, j;
for(i=0;i<3;++i)
pnt[i] = malloc(sizeof(double[3]));
memcpy(pnt[0], (double [3]){4.0, 3.0, 4.0}, sizeof(double[3]));
memcpy(pnt[1], (double [3]){2.0, 1.0, 2.0}, sizeof(double[3]));
memcpy(pnt[2], (double [3]){9.0, 4.0, 5.0}, sizeof(double[3]));
{//print before sort
int i,j;
for(i=0;i<3;++i){
for(j=0;j<3;++j)
printf("%g ", (*(pnt[i]))[j]);
printf("\n");
}
printf("\n");
}
int numOfRows = 3;
//qsort(pnt, numOfRows, sizeof(double(*)[3]), forQs);
qsort(pnt, numOfRows, sizeof(*pnt), forQs);
{//print after sort
int i,j;
for(i=0;i<3;++i){
for(j=0;j<3;++j)
printf("%g ", (*(pnt[i]))[j]);
printf("\n");
}
}
return 0;
}
答案 1 :(得分:0)
Protip:typedef
你想要合作的东西并坚持下去。
想要3个双打的向量?
typedef double vec3[3];
现在,当您根据vec3
重写代码时,问题就变得很明显了。
qsort (pnt, numOfRows, sizeof(double), forQs); /* was */
qsort (pnt, numOfRows, sizeof(vec3), forQs); /* now */
const double **k = (const double **)x; /* was */
const vec3* k = (const vec3*)x; /* now */
这样您就可以自动获得正确的代码,而无需考虑数组如何以及何时成为指针(提示:它们不会)。