我们在课堂上获得了一项任务,对结构数组进行排序。在分配完成后,我们讨论了使用数组指针进行排序,因为它比大多数人的方式更有效。
我决定尝试这样做,但是我遇到了一些我无法解决的问题。
success
我一直在处理代码的链接。我的主要问题是,从我收集的内容来看,当使用排序比较方法#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
typedef struct stage2{//standard dec of the struct field
char need;
double ring;
char fight[8];
int32_t uncle;
char game;
double war;
int8_t train;
uint32_t beds;
float crook;
int32_t feast;
int32_t rabbits;
int32_t chin;
int8_t ground;
char veil;
uint32_t flowers;
int8_t adjustment;
int16_t pets;
} stage2;
void usage(){//usage method to handle areas
fprintf(stderr,"File not found\n");//prints to stderr
exit(1);//exits the program
}
int needS(const void *v1, const void *v2)
{
const stage2 *p1 = v1;
const stage2 *p2 = v2;
printf("%c %c \n",p1->need,p2->need);
return 0;
}
int main(int argc, char** argv){
if(argc != 3){//checks for a input files, only 1
usage();//if not runs usage
}
int structSize = 60;//size of structs in bytes, sizeof() doesnt return correct val
char* fileName = argv[1]; //pull input filename
FILE *file = fopen(fileName, "r");//opens in read mode
fseek(file, 0, SEEK_END); //goes to end of file
long fileSize = ftell(file); //saves filesize
char *vals = malloc(fileSize); //allocates the correct size for array based on its filesize
fseek(file, 0, SEEK_SET); //returns to start of file
fread(vals, 1, fileSize, file); //reads the file into char array vals
fclose(file); //closes file
int structAmount = fileSize/structSize; //determines amount of structs we need
stage2 mainArray[structAmount]; //makes array of structs correct size
int j;//loop variables
int i;
printf("need, ring, fight, uncle, game, war, train, beds, crook, feast, rabbits, chin, ground, veil, flowers, adjustment, pets\n");//prints our struct names
for(i = 0; i < structAmount; i ++){//initialises the array vals
mainArray[i].need = *(&vals[0+(i*60)]);
mainArray[i].ring = *((double *)&vals[1+(i*60)]);
for(j = 0;j<9;j++){
mainArray[i].fight[j] = *(&vals[j+9+(i*60)]);
}
mainArray[i].uncle = *((int32_t *)&vals[17+(i*60)]);
mainArray[i].game = *(&vals[21+(i*60)]);
mainArray[i].war = *((double *)&vals[22+(i*60)]);
mainArray[i].train = *((int8_t *)&vals[30+(i*60)]);
mainArray[i].beds = *((uint32_t *)&vals[31+(i*60)]);
mainArray[i].crook = *((float *)&vals[35+(i*60)]);
mainArray[i].feast = *((int32_t *)&vals[39+(i*60)]);
mainArray[i].rabbits = *((int32_t *)&vals[43+(i*60)]);
mainArray[i].chin = *((int32_t *)&vals[47+(i*60)]);
mainArray[i].ground = *((int8_t *)&vals[51+(i*60)]);
mainArray[i].veil = *(&vals[52+(i*60)]);
mainArray[i].flowers = *((uint32_t *)&vals[53+(i*60)]);
mainArray[i].adjustment = *((int8_t *)&vals[57+(i*60)]);
mainArray[i].pets = *((int16_t *)&vals[58+(i*60)]);
}
for(i = 0; i < structAmount; i ++){//prints
printf("%c, %f, %s, %d, %c, %f, %d, %u, %f, %d, %d, %d, %d, %c, %u, %d, %d \n",
mainArray[i].need,mainArray[i].ring,mainArray[i].fight,mainArray[i].uncle,mainArray[i].game,mainArray[i].war,mainArray[i].train,
mainArray[i].beds,mainArray[i].crook,mainArray[i].feast,mainArray[i].rabbits,mainArray[i].chin,mainArray[i].ground,mainArray[i].veil,
mainArray[i].flowers,mainArray[i].adjustment,mainArray[i].pets);//prints
}
free(vals);//frees the memory we allocated to vals
stage2 *array = malloc(structAmount * structSize);
for(i = 0; i < structAmount; i ++){
array[i] = mainArray[i];
}
printf("Before Sort\n\n");
for(i = 0; i < structAmount; i ++){
printf("%c, %f, %s, %d, %c, %f, %d, %u, %f, %d, %d, %d, %d, %c, %u, %d, %d \n",
array[i].need,array[i].ring,array[i].fight,array[i].uncle,array[i].game,array[i].war,array[i].train,
array[i].beds,array[i].crook,array[i].feast,array[i].rabbits,array[i].chin,array[i].ground,array[i].veil,
array[i].flowers,array[i].adjustment,array[i].pets);//prints
}
qsort(array, structAmount,structSize,needS);
printf("After Sort\n\n");
for(i = 0; i < structAmount; i ++){
printf("%c, %f, %s, %d, %c, %f, %d, %u, %f, %d, %d, %d, %d, %c, %u, %d, %d \n",
array[i].need,array[i].ring,array[i].fight,array[i].uncle,array[i].game,array[i].war,array[i].train,
array[i].beds,array[i].crook,array[i].feast,array[i].rabbits,array[i].chin,array[i].ground,array[i].veil,
array[i].flowers,array[i].adjustment,array[i].pets);//prints
}
FILE *my_file = fopen(argv[2], "wb");
for(i = 0; i < structAmount; i ++){
fwrite(&mainArray[i].need, sizeof(char), 1, my_file);
fwrite(&mainArray[i].ring, sizeof(double), 1, my_file);
fwrite(&mainArray[i].fight, sizeof(char[8]), 1, my_file);
fwrite(&mainArray[i].uncle, sizeof(int32_t), 1, my_file);
fwrite(&mainArray[i].game, sizeof(char), 1, my_file);
fwrite(&mainArray[i].war, sizeof(double), 1, my_file);
fwrite(&mainArray[i].train, sizeof(int8_t), 1, my_file);
fwrite(&mainArray[i].beds, sizeof(uint32_t), 1, my_file);
fwrite(&mainArray[i].crook, sizeof(float), 1, my_file);
fwrite(&mainArray[i].feast, sizeof(int32_t), 1, my_file);
fwrite(&mainArray[i].rabbits, sizeof(int32_t), 1, my_file);
fwrite(&mainArray[i].chin, sizeof(int32_t), 1, my_file);
fwrite(&mainArray[i].ground, sizeof(int8_t), 1, my_file);
fwrite(&mainArray[i].veil, sizeof(char), 1, my_file);
fwrite(&mainArray[i].flowers, sizeof(uint32_t), 1, my_file);
fwrite(&mainArray[i].adjustment, sizeof(int8_t), 1, my_file);
fwrite(&mainArray[i].pets, sizeof(int16_t), 1, my_file);
}
fclose(my_file);
return 0;//return statement
}
(第31行)进行排序的第一次执行时,它应该返回数组中前两个结构的第一个字段并打印它们(我知道这不是一个有效的排序方法,但想确保变量符合我的预期。然而,这不是发生的事情; needS
变量将打印出我期望的内容,但p1
变量不会。从这一点开始,每次使用它都会返回垃圾(我认为)值。
我有什么遗漏或做错了吗?
答案 0 :(得分:0)
你混淆了#34;打包&#34;数据文件中的结构大小与您分配的内存中结构数组(默认情况下,filename
将有额外的填充以有效地对齐数据类型)。这一行是问题所在:
struct stage2
应该是:
stage2 *array = malloc(structAmount * structSize);
您对stage2 *array = malloc(structAmount * sizeof(stage2));
的来电也需要相应更新:
qsort