Qsort不工作-把数组完全搞乱了
qsort not working - messing up array completely
那么,我有一个结构体,由3个整数组成。这个结构体代表我的"表"中的一行。表格基本上是行数组,称为"v"因为我的任务,我需要使用这种格式而不是2d数组之类的。现在,我需要根据x、y和z"按字典顺序对行进行排序"。问题在于qsort函数——它在某种程度上搞乱了我的整个数组"v",变得毫无用处。我不知道这是什么原因。compare函数根据x比较行,然后根据y比较行,然后根据z比较行(我认为是正常的字典排序)。函数打印只是打印表。
#include <iostream>
#include <stdlib.h>
using namespace std;
struct row {
int x, y, z;
};
int compar(const void* p1, const void* p2){
if(((row*)p1)->x < ((row*)p2)->x){
return -1;
}
if(((row*)p1)->x = ((row*)p2)->x){
if(((row*)p1)->y < ((row*)p2)->y){
return -1;
}
if(((row*)p1)->y = ((row*)p2)->y){
if(((row*)p1)->z < ((row*)p2)->z){
return -1;
}
if(((row*)p1)->z = ((row*)p2)->z){
return 0;
}
if(((row*)p1)->z > ((row*)p2)->z){
return 1;
}
}
if(((row*)p1)->y > ((row*)p2)->y){
return 1;
}
}
if(((row*)p1)->x > ((row*)p2)->x){
return 1;
}
}
void printing(row v[], int p){
cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl;
for (int i = 0; i < p; i++){
cout << v[i].x << " " << v[i].y<< ' ' << v[i].z << endl;
}
cout << "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" << endl;
}
int main(void){
int numOfRows;
cin >> numOfRows; //format of input needs this
row v[numOfRows];
for (int i = 0; i < numOfRows; i++) {
cin >> v[i].x >> v[i].y >> v[i].z;
}
qsort(v,numOfRows,sizeof(row),compar);
printing(v,numOfRows);
}
现在我将输入与输出一起发布,您可以清楚地看到,在排序过程中有些行是重复的,有些行完全丢失。
3
1 2 3
1 4 5
1 2 4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1 2 3
1 2 4
1 2 4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
下一个输入和输出是:
4
100 100 100
100 100 100
100 99 99
99 99 100
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
99 99 99
99 99 99
99 99 99
99 99 100
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
看起来应该是这样的,例如:
3
1 2 3
1 4 5
1 2 4
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
1 2 3
1 2 4
1 4 5
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
这将是我的qsort的正确输出。任何帮助将不胜感激,因为我完全不知道为什么会发生这种情况。我整个下午都在想办法解决这个问题,但是我毫无头绪。谢谢大家
你的很多比较有=
而不是==
,这将导致值被复制到他们不应该的地方。如果你把编译器的警告级别设置得足够高,它就会发出警告。
函数compar
最后没有返回值。它会导致未定义的行为。
可以简化为:
int compar(const void* p1, const void* p2)
{
row const* row1 = (row const*)p1;
row const* row2 = (row const*)p2;
if ( row1->x != row2->x )
{
return (row1->x - row2->x);
}
if ( row1->y != row2->y )
{
return (row1->y - row2->y);
}
return (row1->z - row2->z);
}
相关文章:
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 数组填充了不正确的值
- 我是否不正确地集中了这些字符数组?
- 尽管直接设置了指针数组,但仍为空
- 我正在尝试传递DMA数组及其大小作为参数,但它给出了错误
- 数组为此合并排序函数提供了正确的输出,但向量给出了不正确的输出.出了什么问题?
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 我编写了一个程序来显示数组的内容,但它显示的是它的地址
- 我的旋转数组代码给出了大数组大小的错误
- 调用delete[]时,某些东西导致堆损坏,但我已正确设置了数组的维度
- 将数据分配给了数组分配,但程序显示了以缓冲区超支的输出
- 是什么导致了数组越界运行时错误?
- strlen() 给出了数组中空字节的错误大小原因
- 为什么我得到了数组的垃圾总数
- OpenGL 批处理:为什么我的绘制调用超出了数组缓冲区边界
- 生成了数组编译时
- Qsort不工作-把数组完全搞乱了
- 优化了数组元素的计算和设置