Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中对结构数组进行排序_C_Arrays_Sorting_Struct - Fatal编程技术网

在C中对结构数组进行排序

在C中对结构数组进行排序,c,arrays,sorting,struct,C,Arrays,Sorting,Struct,我们在课堂上被分配了一个任务,对结构数组进行排序。交作业后,我们讨论了使用数组指针进行排序,因为它比大多数人的排序方式更有效 我决定也尝试这样做,但是我遇到了一些我无法解决的问题 #包括 #包括 #包括 #包括 typedef struct stage2{//struct字段的标准dec 煤焦需求; 双环; (八),; 国际叔叔; 字符游戏; 双重战争; 国际列车; uint32张床位; 浮钩; 国际盛宴; int32_t兔; int32_t chin; 国际地面; 炭幕; uint32_t花

我们在课堂上被分配了一个任务,对结构数组进行排序。交作业后,我们讨论了使用数组指针进行排序,因为它比大多数人的排序方式更有效

我决定也尝试这样做,但是我遇到了一些我无法解决的问题

#包括
#包括
#包括
#包括
typedef struct stage2{//struct字段的标准dec
煤焦需求;
双环;
(八),;
国际叔叔;
字符游戏;
双重战争;
国际列车;
uint32张床位;
浮钩;
国际盛宴;
int32_t兔;
int32_t chin;
国际地面;
炭幕;
uint32_t花;
内部调整;
国际宠物;
}阶段2;
void usage(){//处理区域的使用方法
fprintf(stderr,“找不到文件”;//打印到stderr
退出(1);//退出程序
}
整数需求(常数无效*v1,常数无效*v2)
{
const stage2*p1=v1;
const stage2*p2=v2;
printf(“%c%c\n”,p1->need,p2->need);
返回0;
}
int main(int argc,字符**argv){
如果(argc!=3){//检查输入文件,则只有1
用法();//如果不是,则运行用法
}
int structSize=60;//以字节为单位的结构的大小,sizeof()不返回正确的val
char*fileName=argv[1];//拉入输入文件名
FILE*FILE=fopen(文件名,“r”);//以读取模式打开
fseek(文件,0,SEEK_END);//转到文件末尾
long fileSize=ftell(file);//保存文件大小
char*vals=malloc(fileSize);//根据数组的文件大小为其分配正确的大小
fseek(文件,0,SEEK_SET);//返回文件的开头
fread(vals,1,fileSize,file);//将文件读入字符数组vals
fclose(文件);//关闭文件
int structAmount=fileSize/structSize;//确定我们需要的结构数量
stage2 mainArray[structAmount];//使结构的数组大小正确
int j;//循环变量
int i;
printf(“需要、戒指、战斗、叔叔、游戏、战争、火车、床、骗子、宴会、兔子、下巴、地面、面纱、花朵、调整、宠物”);//打印我们的结构名称
对于(i=0;i对于(j=0;j,函数
需要
需要返回一个适合对数组中的项进行排序的值

int needS(const void *v1, const void *v2)
{
    const stage2 *p1 = v1;
    const stage2 *p2 = v2;
    printf("%c %c \n",p1->need,p2->need);

    // Something like:
    return (p1->need < p2->need);
}
int需要(const void*v1,const void*v2)
{
const stage2*p1=v1;
const stage2*p2=v2;
printf(“%c%c\n”,p1->need,p2->need);
//比如:
返回(p1->needneed);
}

函数
需要
返回一个适合对数组中的项目进行排序的值

int needS(const void *v1, const void *v2)
{
    const stage2 *p1 = v1;
    const stage2 *p2 = v2;
    printf("%c %c \n",p1->need,p2->need);

    // Something like:
    return (p1->need < p2->need);
}
int需要(const void*v1,const void*v2)
{
const stage2*p1=v1;
const stage2*p2=v2;
printf(“%c%c\n”,p1->need,p2->need);
//比如:
返回(p1->needneed);
}

您的问题在这一行:

int structSize = 60;  //size of structs in bytes, sizeof() doesn't return correct val
你错了;
sizeof()
确实返回了正确的大小。您所做的一切都是假的。您需要回到序列化的基础。您需要正确地写入数据。您应该能够在一次读取操作中将所有数据读取到数组中。如果输入中的每条记录都有60个字节,则会出现严重问题

请注意,在大多数系统上,内存中的结构布局在
char-need;
double-ring;
元素之间浪费了7个字节(在某些系统上浪费了3个字节)。在
char-game;
double-war;
之间也有类似的间隙,还有另一个间隙(通常为3个字节)在
int8\u t train;
uint32\u t beds;
之间,以及
char-veil;
uint32\u t flowers;
(因为
char-veil;
前面有
int8\u t ground;
,并且
int8\u t调节;
int16\u t pets;
之间的间隙为1;
-我不能保证我已经发现了所有的间隙)

若要了解有关结构布局和填充的详细信息,请参见


为了最大限度地减少浪费的空间,启发式方法是将具有较大基类型的成员放在具有较小基类型的成员之前。因此,所有
double
成员都应该放在任何
char
成员之前。如果成员是数组类型,则忽略数组并查看基类型的大小。例如,
char-fight[8]
最好与其他
char
成员一起放在末尾,尽管假定它是8字节的倍数,它可以保持在原来的位置,但保持一致更简单。指针在64位系统上需要被视为8字节,在32位系统上需要被视为4字节。将指针放在非指针类型之间,例如
long long long long
double
(通常每个8字节)和较小的非指针类型,如
int
uint32\u t
long
类型很麻烦;它可以是4或8字节,具体取决于(在Windows上是4字节,甚至是Windows 64位;在64位Unix上是8字节,在32位上是4字节,但在Unix上是4字节).

您的问题在这一行:

int structSize = 60;  //size of structs in bytes, sizeof() doesn't return correct val
你错了;
sizeof()
确实返回了正确的大小。您所做的一切都是假的。您需要回到序列化的基础。您需要正确地写入数据。您应该能够在一次读取操作中将所有数据读取到数组中。如果输入中的每条记录都有60个字节,则会出现严重问题

请注意,在大多数系统上,内存中的结构布局在
char-need;
double-ring;
元素之间浪费了7个字节(有些系统浪费了3个字节)。在
char-game;
double-war;
之间也有类似的间隙,而之间又有一个间隙(通常为3个字节)
stage2 *array = malloc(structAmount * sizeof(stage2));
qsort(array, structAmount, sizeof(stage2), needS);
#include <stdio.h>
#include <stdlib.h>

typedef struct stage2 {
    int need;
} stage2;

int needS(const void *v1, const void *v2)
{
    stage2 *const *p1 = v1;
    stage2 *const *p2 = v2;

    return ((*p1)->need - (*p2)->need) - ((*p2)->need - (*p1)->need);
}

int main(int argc, char **argv)
{
    stage2 mainArray[] = {
        {8}, {3}, {5}, {1}, {19}, {-2}, {8}, {0},{0}, {4}, {5}, {1}, {8}
    };
    int structAmount = sizeof(mainArray) / sizeof(*mainArray);

    int i;

    stage2 **array = malloc(structAmount * sizeof(*array));

    // Assign pointers
    for (i = 0; i < structAmount; i++) {
        array[i] = &mainArray[i];
    }

    qsort(array, structAmount, sizeof(*array), needS);

    puts("Original");
    for (i = 0; i < structAmount; i++) {
        printf("%d\n", mainArray[i].need);
    }

    puts("");
    puts("Sorted");
    for (i = 0; i < structAmount; i++) {
        printf("%d\n", array[i]->need);
    }

    free(array);

    return 0;
}