有关结构传值问题

sunyuqian 2010-01-26 03:50:26
大家好,这道题是有关飞机订票,对一个排序函数有点问题,用/**/标出,请高手解答

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LEN 10
#define MEMBER 4
#define SEATS 12
#define EMPTY 0
#define TAKEN 1

struct planestats
{
int num;
int status;
char fname[LEN];
char lname[LEN];
};

void list_assign(struct planestats pl[SEATS]);

int main()
{
struct planestats plane[MEMBER][SEATS]; //MEMBER代表航班,SEATS代表每个航班的座位
char choice;
int i,j;
int member,result;
FILE *fp;
size_t size = sizeof(struct planestats);
if((fp = fopen("air.txt","rb")) == NULL)
for(i=0; i<MEMBER; i++)
for(j=0; j<SEATS; j++)
{
plane[i][j].status = EMPTY;
plane[i][j].num = j+1;
}
else
{
for(i=0; i<MEMBER; i++)
fread(plane,size*4,SEATS,fp);
fclose(fp);
}

while((member = getmain()) != 5) //选择航班
{
result = getnum(member);
while((choice = getmenu()) != 'f')
{
switch(choice)
{
case 'a':
printf("航班: %d\n",result);
printf("空座位数: %d\n",count(plane[member-1]));
break;
case 'b':
printf("航班: %d\n",result);
show_empties(plane[member-1]);
break;
case 'c':
printf("航班: %d\n",result);
list_assign(plane[member-1]); /*问题*/
break;
case 'd':
printf("航班: %d\n",result);
assign_seat(plane[member-1]);
break;
case 'e':
printf("航班: %d\n",result);
delete_seat(plane[member-1]);
break;
}
}
}
if((fp = fopen("air.txt","wb")) == NULL)
{
printf("文件打不开\n");
exit(1);
}
else
{
fwrite(plane,size*4,SEATS,fp);
fclose(fp);
}
return 0;
}

void list_assign(struct planestats pl[SEATS]) //座位按名排序(lname)
{
if(count(pl) == SEATS)
printf("没有订座\n");
else
{
int i;
struct planestats *ps[SEATS];

ps = pl;
/*这有错,说 cannot convert from 'struct planestats []' to 'struct planestats *[12]'
这道题首先从main函数选择航班,确定数组起始地址,也就是哪个航班,然后传到函数里,
list_assign(plane[member-1]); 相当于这个航班的所有座位值传过来,我在函数形参里用
struct planestats pl[SEATS]接收,然后又定义了一个指针数组struct planestats *ps[SEATS],
用ps = pl去引用传来的值,我的想法是用指针引用去比较,用指针排序,如果用数组比较,会改变原来的数据,
但报错信息是类型不匹配,不知哪错了
*/

int top,search;
struct planestats *temp;
for(top=0; top<SEATS-1; top++)
for(search=top+1; search<SEATS; search++)
if(strcmp(ps[top]->lname,ps[search]->lname)>0)
{
temp = ps[top];
ps[top] = ps[search];
ps[search] = temp;
}
printf("订座信息:\n");
for(i=0; i<SEATS; i++)
if(ps[i]->status == TAKEN)
printf("%d %s %s\n",ps[i]->num,ps[i]->fname,ps[i]->lname);
}
}
...全文
73 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
陽洸膂珵 2010-01-26
  • 打赏
  • 举报
回复
struct planestats pl[SEATS]声明了一个结构数组
struct planestats *ps[SEATS]声明了12个指向结构的指针
sunyuqian 2010-01-26
  • 打赏
  • 举报
回复
谢谢了
SuperLy 2010-01-26
  • 打赏
  • 举报
回复
struct planestats pl[SEATS]声明了一个结构数组
struct planestats *ps[SEATS]声明了12个指向结构的指针

所以:ps是“planestats **”是个指向 指针的指针。
ps[0]、ps[1] .... 与 &pl[0],&pl[1]就是相同级别的了。

注意pl[SEATS]声明了一个结构数组,有数组存放空间;
*ps[SEATS]声明了12个指向结构的指针,仅仅有12个指针的存放空间(就是12*4Byte);
所以sizeof(pl)会比后者大得多。
sunyuqian 2010-01-26
  • 打赏
  • 举报
回复
struct planestats pl[SEATS]声明了一个结构数组
struct planestats *ps[SEATS]声明了12个指向结构的指针

pl应该和&pl[0]相等
ps引用首地址

看楼上的的回答,是不是我在哪想错了
traceless 2010-01-26
  • 打赏
  • 举报
回复
struct planestats pl[SEATS]

struct planestats *ps[SEATS];

清楚两个的区别否 ?
pengzhixi 2010-01-26
  • 打赏
  • 举报
回复
数组是不能相互赋值的,而且你这还是两个不同类型元素的数组。

69,377

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧