搜索
查看: 2638|回复: 20
打印 上一主题 下一主题

.》_《. 请高手帮忙看看怎么改

[复制链接]
跳转到指定楼层
楼主
发表于 2013-7-26 09:46:28 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
8啊哈币
标红的语句一直在提示:request for member ’order_form' in something not a structure or union -gcc 来着。
求高手搭救!

#include"ods.h"
#include <stdio.h>
#include <stdlib.h>
#include "treaty.h"

void show_menu(void)
{
        printf("\n----------------------------------\n");
        printf("\t\t点餐系统前台终端\n");
        printf("\t\tc.查询空桌列表\n");
        printf("\t\td.输入被占用空桌\n");
        printf("\t\ti.输入空出的餐桌\n");
        printf("\t\ts.汇总结账\n");
        printf("----------------------------------\n");
}
char msg;
void *read_all(void *arg)
{
        #define LEN        128
        int ret = 0;
        int fd = *(int *)arg;
        ods_msg msg;

        while(1){
                char buf[LEN];
                memset(buf, 0, LEN);
                ret = recv(fd, &msg, sizeof(ods_msg), 0);//不断的读从服务器发过来的信息
                if(ret == 0)
                {
                        printf("连接终止!\n");
                        exit(0);
                }

                printf("接收到信息:%s\n", buf);
        }
}





/*第一步:创建空桌列表,可查询、增删*/

int getop(void);
int getnum(void);
void insert(int); /* insert and delete do not cause an I/O action so no error-checking is needed. */
void delete(int);
void printary(void);
void flushbuffer(void);

static int array[10]={1,2,3,4,5,6,7,8,9,10};

int main(void)
{
    while(1){
        int num = 0;
        int op = getop();
        switch(op){
        case 'c':
            printary();
            break;
        case 'i':
            num = getnum();
            if(num>0 && num <11)
                insert(num);
            else
                puts("超出范围");
            break;
        case 'd':
            num = getnum();
            if(num>0 && num < 11)
                delete(num);
            else
                puts("超出范围");
            break;
        case 's':
                huizong();
            break;
        default:
            puts("错误输入");



        }
    }
    return 0;
}

int getop(void)
{
    int buffer = 0;
    scanf("%c", &buffer);
    flushbuffer();
    return buffer;
}

int getnum(void)
{
    int buffer = 0;
    scanf("%d", &buffer);
    flushbuffer();
    return buffer;
}

void insert(int a)
{
    array[a-1] = a;
}

void delete(int a)
{
    array[a-1] = 0;
}

void printary(void)
{
    int i;
    for(i=0; i<10; ++i)
            printf("%d ", array);

    printf("\n");
}

void flushbuffer(void)
{
    int c;
    while((c=getchar())!= '\n')
        ;

}



/*根据接收到的菜单进行汇总结账*/

int huizong(void)
{
    int sum;
        int food_count=msg.order_form.food_count;
        int i;
        for (i=0;i<food_count ;++i )
        {
                int food_price=msg.order_form.food.food_price;
                int food_num=msg.order_form.food.food_num;
                printf("菜名:%f 单价:%c 数量:%c 单款菜式小计:%c\n",msg.order_form.food.food_name,msg.order_form.food.food_price,msg.order_form.food.food_num,msg.order_form.food.food_price*msg.order_form.food.food_num);
                sum+=food_price*food_num;
        }
       
        printf("总价为 : %c\n", sum);
}


最佳答案

查看完整内容

话说这是你们课程作业还是? 你要把数据模型理清楚从这里看msg是个嵌套了好几层的结构体,而且你贴出的代码里面还是没有msg这个变量,只有一个叫msg的类型 这个huizong的函数不是你写的? 这程序现在是没关联的三个函数,我建议好好想一想查查手册再写⋯⋯
沙发
发表于 2013-7-26 09:46:29 | 只看该作者
ngx1991 发表于 2013-7-26 20:41
这是刚刚改的,但编译的时候提示:144:18:error:expected expression before ‘msg' -gcc

#include

话说这是你们课程作业还是?

你要把数据模型理清楚
  1. int food_price=msg.order_form.food[i].food_price;
复制代码
从这里看msg是个嵌套了好几层的结构体,而且你贴出的代码里面还是没有msg这个变量,只有一个叫msg的类型

这个huizong的函数不是你写的?
这程序现在是没关联的三个函数,我建议好好想一想查查手册再写⋯⋯
板凳
发表于 2013-7-26 11:03:27 | 只看该作者
把自定义的两个头文件贴出来
地板
发表于 2013-7-26 11:12:12 | 只看该作者
楼主厉害,思路不错
5#
发表于 2013-7-26 11:30:20 | 只看该作者
rosynirvana说得有道理,你不把自定义的头文件内容贴出来,别人无法帮你。
6#
 楼主| 发表于 2013-7-26 14:37:19 | 只看该作者
本帖最后由 ngx1991 于 2013-7-26 14:42 编辑
rosynirvana 发表于 2013-7-26 11:03
把自定义的两个头文件贴出来

ods.h
#ifndef __ods_h__
#define __ods_h__

#define MSG_REFRESH   1 //更新总菜单
#define MSG_OF_UPDATA 2 //更新订单
#define MSG_CHECK_OUT 3 //结帐

/* 菜单项目的三种状态 */
#define ITEM_TODO        100
#define ITEM_DOING        101
#define ITEM_DONE        102

/* 三种类型设备的接入 */
#define CLIENT_CON          1000
#define KITCHEN_CON  1001
#define FRONTEND_CON 1002

#define MAX_FOOD_NAME 128
#define MAX_MENU_ITEM 128

#define TABLE_NUM 10

typedef struct _food_
{
        int food_id;
        char food_name[MAX_FOOD_NAME];
        int food_price;
        int food_num;
        int food_state;
}ods_food;

typedef struct _order_form_
{
        ods_food food[MAX_MENU_ITEM];
        int food_count;
        int table_num;
        int food_doing; //用于表示当前正在加工的菜
}ods_order_form;

typedef struct _message_
{
        int fd;
        int ods_msg_type;
        ods_order_form order_form;
}ods_msg;

#endif
===============================================
treaty.h
/*
*此头文件是针对前台而定义的一些协议
*     c--check-->查询空桌表
*     d--delete-->删减已被占用空桌
*     i--insert-->添加空出的餐桌
*     s--sum-->汇总结账
*/

#ifndef __TREATY_H__
#define __TREATY_H__

#define  PORT            10001
#define  IP_ADDRESS      "127.0.0.1"

#define  CHECK_TYPE       'c'
#define  DEL_TYPE         'd'
#define  INT_TYPE         'i'
#define  SUM_TYPE         's'



#endif


不好意思啊,今早脑子有点混乱来着……

点评

这其实是一个点餐系统,我负责的部分是前台来着。要做的只是空桌列表的查看、更新,以及对菜单进行汇总结账。因为是初学者很多地方都弄得比较乱来着。  发表于 2013-7-26 14:41
7#
 楼主| 发表于 2013-7-26 14:37:54 | 只看该作者
brave163 发表于 2013-7-26 11:30
rosynirvana说得有道理,你不把自定义的头文件内容贴出来,别人无法帮你。

一时忘了,今早弄了一早上,头有点乱。。
8#
 楼主| 发表于 2013-7-26 14:39:02 | 只看该作者
超神级 发表于 2013-7-26 11:12
楼主厉害,思路不错

谢谢……虽然大部分都是请教别人的……
9#
发表于 2013-7-26 16:46:02 | 只看该作者
  1. int food_count=msg.order_form.food_count;
复制代码
这个msg的定义在哪里?
  1. char msg;
复制代码
这个?这里定义的msg是一个char,怎么能用成员操作符.呢?

还有就是
  1. typedef struct _food_
复制代码
struct后面的名字叫做tag,没必要在前面加下划线的,struct tag有专有的namespace,不会和普通变量碰撞

10#
 楼主| 发表于 2013-7-26 17:20:14 | 只看该作者
rosynirvana 发表于 2013-7-26 16:46
这个msg的定义在哪里?这个?这里定义的msg是一个char,怎么能用成员操作符.呢?

还有就是struct后面的名 ...

msg那个,说来惭愧,正是因为编译的时候说msg初次使用,于是我先char了一个……至于struct加下划线的问题,那个是负责这个点餐系统的服务器那一部分的家伙写的。。。
11#
 楼主| 发表于 2013-7-26 17:25:17 | 只看该作者
ngx1991 发表于 2013-7-26 17:20
msg那个,说来惭愧,正是因为编译的时候说msg初次使用,于是我先char了一个……至于struct加下划线的问题 ...

这是最开始的版本:

#include<ods.h>
#include <stdio.h>
#include <stdlib.h>
#include "treaty.h"

int summer(ods_msg msg);

void show_menu(void)
{
        printf("\n----------------------------------\n");
        printf("\t\t点餐系统前台终端\n");
        printf("\t\tc.查询空桌列表\n");
        printf("\t\td.输入被占用空桌\n");
        printf("\t\ti.输入空出的餐桌\n");
        printf("\t\ts.汇总结账\n");
        printf("----------------------------------\n");
}

void *read_all(void *arg)
{
        #define LEN        128
        int ret = 0;
        int fd = *(int *)arg;
        ods_msg msg;

        while(1){
                char buf[LEN];
                memset(buf, 0, LEN);
                ret = recv(fd, &msg, sizeof(ods_msg), 0);//不断的读从服务器发过来的信息
                if(ret == 0)
                {
                        printf("连接终止!\n");
                        exit(0);
                }

                printf("接收到信息:%s\n", buf);
        }
}

char get_command(void)
{
        char com;

        scanf("%c", &com);
        getchar();

        return com;
}

void *input_command(void *arg)
{
        int num = 0;
        int fd = *(int *)arg;
        com command;
        char str[LEN];

        while(1){
                num = read(fd, &command, sizeof(command));
                if(num < 0){
                        perror("read");
                        exit(1);
                }
                if(num == 0)
                        break;
                printf("new command: %c\n", command.type);
                /*根据命令的类型type做相应处理*/

/*第一步:创建空桌列表,可查询、更改、保存*/


int getop(void);
int getnum(void);
void insert(int); /* insert and delete do not cause an I/O action so no error-checking is needed. */
void delete(int);
void printary(void);
void flushbuffer(void);

static int array[10]={1,2,3,4,5,6,7,8,9,10};

int main(void)
{
    while(1){
        int num = 0;
        int op = getop();
        switch(op){
        case 'c':
            printary();
            break;
        case 'i':
            num = getnum();
            if(num>0 && num <11)
                insert(num);
            else
                puts("超出范围");
            break;
        case 'd':
            num = getnum();
            if(num>0 && num < 11)
                delete(num);
            else
                puts("超出范围");
            break;
        default:
            puts("错误输入");
        }
    }
    return 0;
}

int getop(void)
{
    int buffer = 0;
    scanf("%c", &buffer);
    flushbuffer();
    return buffer;
}

int getnum(void)
{
    int buffer = 0;
    scanf("%d", &buffer);
    flushbuffer();
    return buffer;
}

void insert(int a)
{
    array[a-1] = a;
}

void delete(int a)
{
    array[a-1] = 0;
}

void printary(void)
{
    int i;
    for(i=0; i<10; ++i)
            printf("%d ", array);

    printf("\n");
}

void flushbuffer(void)
{
    int c;
    while((c=getchar())!= '\n')
        ;

}



/*创建函数sum,根据菜单进行汇总结账*/
int sum(ods_msg msg);
int main(void)
{
        int food_count = msg.order_form.food_count;
        int sum = 0;
        int i;
        for (i=0;i<food_count ;++i )
        {
                int food_price = msg.order_form.food.food_price;
                int food_num = msg.order_form.food.food_num;
                printf("菜名:%f 单价:%c 数量:%d 菜式总价:%c\n",msg.order_form.food.food_name,msg.order_form.food.food_price,msg.order_form.food.food_num,msg.order_form.food.food_price*msg.order_form.food.food_num);
                sum+ = food_price*food_num;
        }
       
        printf("总价为 : %c\n", sum);
}

点评

中间char get_command(void)那一段最后发觉似乎没必要于是都删掉了。。。  发表于 2013-7-26 17:30
12#
发表于 2013-7-26 19:10:31 | 只看该作者
>>>小学生看不懂~<<<
13#
 楼主| 发表于 2013-7-26 20:32:03 | 只看该作者
这是刚刚改的,但编译的时候提示:144:18:error:expected expression before ‘msg' -gcc

#include <stdio.h>
#include <stdlib.h>
#include "ods.h"
#include "treaty.h"
#define NAMESIZE   20
#define LEN        128

void show_menu(void)
{
        printf("\n----------------------------------\n");
        printf("\t\t点餐系统前台终端\n");
        printf("\t\tc.查询空桌列表\n");
        printf("\t\td.输入被占用空桌\n");
        printf("\t\ti.输入空出的餐桌\n");
        printf("\t\ts.汇总结账\n");
        printf("----------------------------------\n");
}

typedef struct msg
{
        char type;
        char name[NAMESIZE];
        char buf[LEN];
}msg;


/*1.从服务器接受信息*/
void *read_all(void *arg)
{
        int ret = 0;
        int fd = *(int *)arg;
        ods_msg msg;

        while(1){
                char buf[LEN];
                memset(buf, 0, LEN);
                ret = recv(fd, &msg, sizeof(ods_msg), 0);
                if(ret == 0)
                {
                        printf("连接终止!\n");
                        exit(0);
                }

                printf("接收到信息:%s\n", buf);
        }
}


/*2.创建空桌列表,可查询、增删*/
int getop(void);
int getnum(void);
void insert(int); /* insert and delete do not cause an I/O action so no error-checking is needed. */
void delete(int);
void printary(void);
void flushbuffer(void);

static int array[10]={1,2,3,4,5,6,7,8,9,10};

int main(void)
{
    while(1){
        int num = 0;
        int op = getop();
        switch(op){
        case 'c':
            printary();
            break;
        case 'i':
            num = getnum();
            if(num>0 && num <11)
                insert(num);
            else
                puts("超出可增加空桌范围");
            break;
        case 'd':
            num = getnum();
            if(num>0 && num < 11)
                delete(num);
            else
                puts("超出可减少空桌范围");
            break;
        case 's':
                huizong();
            break;
        default:
            puts("错误输入");

        

        }
    }
    return 0;
}

int getop(void)
{
    int buffer = 0;
    scanf("%c", &buffer);
    flushbuffer();
    return buffer;
}

int getnum(void)
{
    int buffer = 0;
    scanf("%d", &buffer);
    flushbuffer();
    return buffer;
}

void insert(int a)
{
    array[a-1] = a;
}

void delete(int a)
{
    array[a-1] = 0;
}

void printary(void)
{
    int i;
    for(i=0; i<10; ++i)
            printf("%d ", array[i]);

    printf("\n");
}

void flushbuffer(void)
{
    int c;
    while((c=getchar())!= '\n')
        ;

}


/*3.根据接收到的菜单进行汇总结账*/
int huizong(void)
{
    long sum;
    int food_count;
    food_count = msg.order_form.food_count;
        int i;
        for (i=0;i<food_count ;++i )
        {
                int food_price=msg.order_form.food[i].food_price;
                int food_num=msg.order_form.food[i].food_num;
                printf("菜名:%f 单价:%c 数量:%c 单款菜式小计:%c\n",msg.order_form.food[i].food_name,msg.order_form.food[i].food_price,msg.order_form.food[i].food_num,msg.order_form.food[i].food_price*msg.order_form.food[i].food_num);
                sum+=food_price*food_num;
        }
       
        printf("总价为 : %c\n", sum);
}



14#
 楼主| 发表于 2013-7-26 20:41:28 | 只看该作者
这是刚刚改的,但编译的时候提示:144:18:error:expected expression before ‘msg' -gcc

#include <stdio.h>
#include <stdlib.h>
#include "ods.h"
#include "treaty.h"
#define NAMESIZE   20
#define LEN        128

void show_menu(void)
{
        printf("\n----------------------------------\n");
        printf("\t\t点餐系统前台终端\n");
        printf("\t\tc.查询空桌列表\n");
        printf("\t\td.输入被占用空桌\n");
        printf("\t\ti.输入空出的餐桌\n");
        printf("\t\ts.汇总结账\n");
        printf("----------------------------------\n");
}

typedef struct msg
{
        char type;
        char name[NAMESIZE];
        char buf[LEN];
}msg;


/*1.从服务器接受信息*/
void *read_all(void *arg)
{
        int ret = 0;
        int fd = *(int *)arg;
        ods_msg msg;

        while(1){
                char buf[LEN];
                memset(buf, 0, LEN);
                ret = recv(fd, &msg, sizeof(ods_msg), 0);
                if(ret == 0)
                {
                        printf("连接终止!\n");
                        exit(0);
                }

                printf("接收到信息:%s\n", buf);
        }
}


/*2.创建空桌列表,可查询、增删*/
int getop(void);
int getnum(void);
void insert(int); /* insert and delete do not cause an I/O action so no error-checking is needed. */
void delete(int);
void printary(void);
void flushbuffer(void);

static int array[10]={1,2,3,4,5,6,7,8,9,10};

int main(void)
{
    while(1){
        int num = 0;
        int op = getop();
        switch(op){
        case 'c':
            printary();
            break;
        case 'i':
            num = getnum();
            if(num>0 && num <11)
                insert(num);
            else
                puts("超出可增加空桌范围");
            break;
        case 'd':
            num = getnum();
            if(num>0 && num < 11)
                delete(num);
            else
                puts("超出可减少空桌范围");
            break;
        case 's':
                huizong();
            break;
        default:
            puts("错误输入");

        

        }
    }
    return 0;
}

int getop(void)
{
    int buffer = 0;
    scanf("%c", &buffer);
    flushbuffer();
    return buffer;
}

int getnum(void)
{
    int buffer = 0;
    scanf("%d", &buffer);
    flushbuffer();
    return buffer;
}

void insert(int a)
{
    array[a-1] = a;
}

void delete(int a)
{
    array[a-1] = 0;
}

void printary(void)
{
    int i;
    for(i=0; i<10; ++i)
            printf("%d ", array[i]);

    printf("\n");
}

void flushbuffer(void)
{
    int c;
    while((c=getchar())!= '\n')
        ;

}


/*3.根据接收到的菜单进行汇总结账*/
int huizong(void)
{
    long sum;
    int food_count;
    food_count = msg.order_form.food_count;
        int i;
        for (i=0;i<food_count ;++i )
        {
                int food_price=msg.order_form.food[i].food_price;
                int food_num=msg.order_form.food[i].food_num;
                printf("菜名:%f 单价:%c 数量:%c 单款菜式小计:%c\n",msg.order_form.food[i].food_name,msg.order_form.food[i].food_price,msg.order_form.food[i].food_num,msg.order_form.food[i].food_price*msg.order_form.food[i].food_num);
                sum+=food_price*food_num;
        }
       
        printf("总价为 : %c\n", sum);
}







15#
 楼主| 发表于 2013-7-26 20:42:40 | 只看该作者
ngx1991 发表于 2013-7-26 20:41
这是刚刚改的,但编译的时候提示:144:18:error:expected expression before ‘msg' -gcc

#include

头文件还是5楼那两个。。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表