鱼C论坛

 找回密码
 立即注册
查看: 801|回复: 2

[已解决]数据与结构(c语言),代码运行不出来

[复制链接]
发表于 2023-6-5 10:53:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        下面是代码,求助一下。这个是一个窗口排队管理系统,我是新手,这些是小组一起做的,然后我们现在都不会找bug了。
#include <stdio.h>
#include "util.h"
#include "winman.h"
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <assert.h>
#include <time.h>

#definde MAXQSIZE 20
LNode* WIN_GetWinNodeById(SWinman &wm,WinId id);
void FreeLinkNode(void *p);

void FreeLinkNode(void *p)
{
    SWin *win = (SWin *)p;

    QueueFree(win->Q);
    delete win;
}

//窗口开业
bool WIN_OpenALL(SWinMan &wm)
{
    int id;
    char type;
    char szName[WIN_NAME_LEN_MAX];
    SWin *win = NULL;

    win.L=LL_Init();
    if (!win.L)  return false
     //
     win.C = WINCFG_Open();
    if(!win.C) return fase;
    while (WINCFG_MoveNext(win.C))
    {
        VERIFY(WINCFG_Read(win.C, id,type,szName));
        win = new SWin;

        memset(win,0, sizeof(SWin));
        win->id = id;
        win->pause = false;
        win->Q = QueueInit(MAXQSIZE,sizeof(SQElem));
        VERIFY(LL_AppendNode(win.L,win) !=NULL);

    }
    return true;
}



void WIN_CLoseALL(SWinMan &win)
{
    LL_Free(win.L,FreeLinkNode);
    WINCFG_Close(win.C);
    win.C = NULL;
}


void WIN_Pause(SWinMan &win, WinId id, bool puse)
{
    SWin *win = WIN_GetWinById(win,id);
    if (win) win->pause = pause;
}


bool WIN_New(SWinMan &win, char type, WinId);
{
    SWin *win = new SWin;
    mement(win,0, sizeof(SWin));
    if(!win) return false;
    if (!WINCFG_New(win.C, type,win->id))
    {
        delete win;
        return false;
    }
    win->pause = false;
    win->Q = QueueInit(MAXQSIZE,sizeof(SQElem));
    VERIFY(LL_AppenNode(win.l,win) !=NULL);

    id = win->id;
    return true;
}


bool WIN_Del(SWinMan &win,WinId id)
{
    LNode *p = WIN_GetWinNodeById(win, id);
    if (!p) return false;

    SWin *win = (SWin*)p->data;
    if(!QueueIsEmpty (win->Q)) return false;

    LL_DeleteNode(win.L, p, FreeLinkNode);
    WINCFG_Del(win.C, id);

    return true;
}

SWin* WIN_GetWinById(SWinMan &win,WinId id)
{
    LNode *p = WIN_GetWinNodeById(win,id);

    if (p) return (SWin *)p->data;
    return NULL;
}
LNode* WIN_GetWinNodeById(SWinMan & win,WinId id)
{
    LNode *p = LL_GetFirstNode(win.L);
    SWin *win
        while (p)
        {
                win = (SWin*)p->data;
                if(win->id == id) return p;
                p= LL_GetNode(win.L,p);
       
         }
         return NULL;
}


void OnWinShow(void *para);
void OnWinNew(void *para);
void OnWinDel(void *para);
void OnWinPause(void *para);
void OnWinResume(void *para);
void OnCustomerArrive(void *para);
void OnCustomerLeave(void *para);

void OnWinManage(void *para)
{
        SCmd acmd[] = {{"WinShow",   "窗口状态",         OnWinShow},
                   {"WinNew",    "窗口新增",         OnWinNew},
                   {"WinDel",    "窗口删除",         OnWinDel},
                   {"WinPause",  "窗口业务暂停",     OnWinPause},
                   {"WinResume", "窗口业务恢复",     OnWinResume},
                   {"",                "",           NULL},
                   {"CustomerArrive",  "取号排队",   OnCustomerArrive},
                   {"CustomerLeave",   "办结离队",   OnCustomerLeave}
        };

   SWinMan win = [0];
   
   if (!WIN_OpenALL(win)) RETURN_MSG("模拟窗口排队系统")

        CmdLoop(acmd, numof(acmd), &win);
        WIN_CloseALL(win);
}

void OnWinShow(void *para)
{
    SWinMan &win = *(SWinMan*)para;
    LNode *p = LL_GetFirstNode(win.L);
    SWin *win;
    int num = 0;
    char type;
    char szName[WIN_NAME_LEN_MAX];
    char szWin [WIN_NAME_LEN_MAX + 5];
   
    PRINTF("窗口\t业务\t\状态\t排队人数\n");
    while (p)
    {
            win = (SWin*)p->data;
               
                VERIFY(WINCFG_ReadById(win.C,win->id,type,szName));
                sprintf(szWin,"%c-%s",type,szName);
                PRINTF("%d\t%s\t%d\n",win->id,szWin,win->Q);
                num += win->Q-》num;
                p=LL_GetNextNode(win.L,p);
                  
        }
   
    PRENTF("共有%d人排队.\n", num);
}

void OnWinNew(void *para)
{
    SWinMan &win = *(SWinMan*)para;
    WinId id;
    char szTip[256] = {0};
    char *p;
    char chType;
   
    strcpy(szTip,"请输入窗口类型(");
        p = szTip + strlen(szTip);
        WINCFG_DefDesc(p);
        strcat (szTip,"):");
       
        if (!InputChar(chType,szTip))  return;
        if (!WIN_NEW(win,chType, id))  RETURN_MSG("操作失败!\n");
}
  PRINTF("新增窗口%d成功!\n",id);

void OnWinDel(void *para)
{
    SWinMan &win =*(SWinMan*)para
    WinId id;
   
    SWinMan &win = *(SWinMan *)para;
    WinId id;
   
    if(!InputInteger(id,"请输入待删除窗口的窗口号:")
    if (!WIN_Del(win,id))  RETURN_MSG("操作失败!\n") ;
    PRINTF("窗口%d被成功删除!\n",id);
}

//窗口业务暂停
void OnWinPause(void *para)
{
    SWinMan &win =*(SWinMan*)para;
    WinId id;
   
    if (!InputInteger(id,"请输入待暂停窗口的窗口号:"))
        WIN_Pause(win,id,true);
       
        PRINTF("窗口%d被成功暂停!\n",id);
        OnWinShow(para);

         
}

//窗口业务恢复
void OnWinResume(void *para)
{
    SWinMan &win =*(SWinMan*)para;
    WinId id;
    SWin *win;
   
    if (!InputInteger(id,"请输入待暂停窗口的窗口号:"))
   
    win = WIN_GetWinById(win,id);
        if(!win) RETURN_MSG("指定窗口号不存在!\n") ;
       
        if (!win->puase) RETURN_MSG("该窗口已经是正常状态,恢复成功!\n")
        WIN_Pause(win,id,false);
        PRINTF("窗口%d被成功恢复!\n",id);
        OnWinShow(para);
       
}

void OnCustomerArrive(void *para)
{
   SWinMan &win = *(SwinMan*)para
   Swin *win,*winmin = NULL;
   LNode *node = LL_GetFirstNode(win.L);
   char szTip[256] = {0};
   char type,*p;
   SQElem qelem = {0};
   
   strcpy(szTip,"请输入需办理业务的类型(");
   p = szTip + strlen (szTip);
   WINCFG_DefDesc(p);
   strcat(szTip,"):");
   
   if (!InputChar(type,szTip)) return;
   type = UppercaseChar(type);
   
   while (node)
   {
            win = (SWin*)node->data;
            if ((!win->pause) && WINCFG_GetType(win.c,win->id))
            {
                    if (!winmin) winmin = win;
                    if (winmin->Q->num>win->Q->num,winmin=)
                   
                }
                 node=LL_GetNextNode(win.L,node);
   }
  if (!winmin)RETURN_MSG("当前无窗口可办理该业务!\n")
  
  if (QueueIsFull(winmin->Q)) RETURN_MSG("所以队列均满\n")
  
  winmin->nMaxQueueId++;
  PRINTF("您到%d窗口办理业务,排队号为%c-%d,您面前有%d个人,win.L")
  
  qelem.nId = winmin->nMaxQueueId;
  qelem.nEnterTick = GetTickCount ();
  
  if(QueueEnter(winmin->Q,&qelem,sizeof(qelem)) !=OK)
  
}




void OnCustomerLeave(void *para)
{
   SWinMan &win = *(SWinMan*)para;
   SWin *win , *winmin = NULL;
   LNode *node = LL_GetFirstNode(win.L);
   SQElem *a,*b,e;
   while(node)
   {
           win= (SWin*)node->data;
           if ((!win->pause) && (win->Q->num > 0))
           {
                   if(!winmin) winmin = win
                   a = (SQElem*)QueueGetHead(winmin->Q);
                b = (SQElem*)QueueGetHead(win->Q);
                if (a->nEnterTick > b->nEnterTick) winmin =
           }
           node = LL_GetNextNode(win.L,node);
          
   }
   
   if (!winmin) RETURN_MSG("各窗口无排队,无人离队!\n")
   a = (SQElem*)QueueGetHead(winmin->Q);
   if (QueueLeave(winmin->Q,&e, sizeof(e)) !=OK) RETURN_MSG("")
   
   PRINTF("%d号窗口%d号顾客离队!\n",winmin->id,e,nI)
}


最佳答案
2023-6-5 11:29:21
这段代码存在许多语法错误和潜在的逻辑错误。下面我列出了一些明显的问题:

1.  #definde MAXQSIZE 20  应该是  #define MAXQSIZE 20
2.  void WIN_CLoseALL(SWinMan &win)  中的函数名应为 void WIN_CloseALL(SWinMan &win) ,另外函数名和括号之间的全角字符应更改为半角字符。
3.  bool WIN_OpenALL(SWinMan &wm)  和其他函数中的  SWinMan &wm  这样的语法在 C 语言中是无效的,C 语言不支持引用,它只支持指针,所以应该改为  SWinMan *wm 。当你要更改  wm  的内容时,需要使用  wm->xxx  而不是  wm.xxx 。
4.  bool WIN_New(SWinMan &win, char type, WinId);  这行代码后面的分号是不需要的,而且函数的参数列表中  WinId  后面没有变量名。
5.  mement(win,0, sizeof(SWin));  这行代码中的  mement  应该是  memset 。
6.  return fase;  应该是  return false; 。
7.  PRINTF  应该是  printf ,在 C 语言中没有  PRINTF  这个函数,所有的字母都是小写的。
8. 类似  PRINTF("窗口\t业务\t\状态\t排队人数\n");  这样的代码中的转义字符  \  在  \状态  前面是多余的,应该是  "窗口\t业务\t状态\t排队人数\n" 。
9.  SWinMan win = [0];  这是错误的,C 语言中没有这种语法。你可能想要初始化  SWinMan  结构体的所有成员为 0,那么可以使用  SWinMan win = {0}; 。
10.  if (!WIN_OpenALL(win)) RETURN_MSG("模拟窗口排队系统")  这里  RETURN_MSG  是未定义的。这是你的自定义宏或函数吗?
11. 一些函数的定义和调用中混淆了  SWinMan &win  和  SWin *win ,这样很容易导致编译错误或者运行时错误。你应该更仔细地检查你的代码以确保你正在对正确的变量进行操作。
12. 多处用到的  VERIFY  宏或者函数也是未定义的。你需要提供这个宏或者函数的定义。
13. 在多个地方,如  while (WINCFG_MoveNext(win.C))  中, WINCFG_MoveNext  和其他  WINCFG  开头的函数没有在你的代码中定义。
14.  if (winmin->Q->num>win->Q->num,winmin=)  这里的赋值语句是不完整的。

这个代码存在大量的错误,需要进一步的修改才能运行。我强烈建议你在写代码的时候使用一些 IDE,如 Visual Studio Code、CLion 等,它们可以在你写代码的过程中发现这些基本的语法错误,甚至还有一些潜在的逻辑错误。我也建议你先学习一些 C 语言的基本知识,然后再尝试编写这种比较复杂的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-5 11:29:21 | 显示全部楼层    本楼为最佳答案   
这段代码存在许多语法错误和潜在的逻辑错误。下面我列出了一些明显的问题:

1.  #definde MAXQSIZE 20  应该是  #define MAXQSIZE 20
2.  void WIN_CLoseALL(SWinMan &win)  中的函数名应为 void WIN_CloseALL(SWinMan &win) ,另外函数名和括号之间的全角字符应更改为半角字符。
3.  bool WIN_OpenALL(SWinMan &wm)  和其他函数中的  SWinMan &wm  这样的语法在 C 语言中是无效的,C 语言不支持引用,它只支持指针,所以应该改为  SWinMan *wm 。当你要更改  wm  的内容时,需要使用  wm->xxx  而不是  wm.xxx 。
4.  bool WIN_New(SWinMan &win, char type, WinId);  这行代码后面的分号是不需要的,而且函数的参数列表中  WinId  后面没有变量名。
5.  mement(win,0, sizeof(SWin));  这行代码中的  mement  应该是  memset 。
6.  return fase;  应该是  return false; 。
7.  PRINTF  应该是  printf ,在 C 语言中没有  PRINTF  这个函数,所有的字母都是小写的。
8. 类似  PRINTF("窗口\t业务\t\状态\t排队人数\n");  这样的代码中的转义字符  \  在  \状态  前面是多余的,应该是  "窗口\t业务\t状态\t排队人数\n" 。
9.  SWinMan win = [0];  这是错误的,C 语言中没有这种语法。你可能想要初始化  SWinMan  结构体的所有成员为 0,那么可以使用  SWinMan win = {0}; 。
10.  if (!WIN_OpenALL(win)) RETURN_MSG("模拟窗口排队系统")  这里  RETURN_MSG  是未定义的。这是你的自定义宏或函数吗?
11. 一些函数的定义和调用中混淆了  SWinMan &win  和  SWin *win ,这样很容易导致编译错误或者运行时错误。你应该更仔细地检查你的代码以确保你正在对正确的变量进行操作。
12. 多处用到的  VERIFY  宏或者函数也是未定义的。你需要提供这个宏或者函数的定义。
13. 在多个地方,如  while (WINCFG_MoveNext(win.C))  中, WINCFG_MoveNext  和其他  WINCFG  开头的函数没有在你的代码中定义。
14.  if (winmin->Q->num>win->Q->num,winmin=)  这里的赋值语句是不完整的。

这个代码存在大量的错误,需要进一步的修改才能运行。我强烈建议你在写代码的时候使用一些 IDE,如 Visual Studio Code、CLion 等,它们可以在你写代码的过程中发现这些基本的语法错误,甚至还有一些潜在的逻辑错误。我也建议你先学习一些 C 语言的基本知识,然后再尝试编写这种比较复杂的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-5 11:42:01 | 显示全部楼层
isdkz 发表于 2023-6-5 11:29
这段代码存在许多语法错误和潜在的逻辑错误。下面我列出了一些明显的问题:

1.  #definde MAXQSIZE 20   ...

谢谢你,我们按照你指出的问题,尝试整改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 16:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表