子函数打开文件如何返回指针?

如何在子函数中打开文件并将打开的指针返回来?
具体过程如下,但是返回的文件句柄是不对的,求指导!!非常感激!!

如:
void test(FILE *fp)
{
fp=fopen(temp,"wt");
}

void main ()
{
FILE *fp;

test(fp);

}

2个回答

 FILE **fp;
test(fp);

void test(FILE **fp)
{
*fp=fopen(temp,"wt");
}
主程序通过 *fp接收指针

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复cycsalad: 嗯。如果问题得到解决,还请麻烦点下我回答右边的采纳,谢谢
3 年多之前 回复
cycsalad
cycsalad 非常感谢,你这种方法需要申请内存。 我用下面的也可以,谢谢了! FILE *fp; test(&fp); void test(FILE **fp) { *fp=fopen(temp,"wt"); }
3 年多之前 回复

非常感谢,你这种方法需要申请内存。
我用下面的也可以,谢谢了!
FILE *fp;
test(&fp);

void test(FILE **fp)
{
*fp=fopen(temp,"wt");
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
汇编dos调用打开文件为什么显示文件不存在呢

代码如下 路径什么的都是对的 就是打不开 希望好心人能帮帮忙 BUFFLEN=50 DSEG SEGMENT INFOR1 DB 'Please input the path and the goal file(*:\*.*):$' INFOR2 DB 'Please input the path and the source file(*:\*.*):$' INFOR3 DB 'Copy success!$';操作命令提示 ERROR1 DB'Can not open the file! Please make sure whether the source file is exit!',07H,'$' ERROR2 DB 'Can not creat the file!',07H,'$' ERROR3 DB 'Reading error!',07H,'$' ERROR4 DB 'Writing error!',07H,'$' ;错误命令提示 HANDLE1 DW 0 HANDLE2 DW 0 BUFFER DB BUFFLEN DB ? DB BUFFLEN DUP(0);定义一个缓存区 DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START:MOV AX,DSEG MOV DS,AX MOV DX,OFFSET INFOR2 CALL DMESS;调用DMESS子程序 MOV DX,OFFSET BUFFER MOV AH,0AH ;输入字符串 INT 21H ;调用NEWLINE子程序 CALL NEWLINE LEA SI,BUFFER;将BUFFER的有效地址传个SI MOV AL,[SI+1] XOR AH,AH;AH清零 ADD SI,2;调整指针 ADD SI,AX MOV BYTE PTR[SI],0 MOV DX,OFFSET BUFFER+2;将BUFFER+2的有效地址传给DX MOV AX,3D00H INT 21H JNC OPENOK;进位标志被清转移到OPENOK MOV DX,OFFSET ERROR1 CALL DMESS JMP OVER OPENOK:MOV HANDLE1,AX MOV DX,OFFSET INFOR1 CALL DMESS MOV DX,OFFSET BUFFER MOV AH,0AH INT 21H CALL NEWLINE LEA SI,BUFFER;将BUFFER的有效地址传给SI MOV AL,[SI+1] XOR AH,AH ADD SI,2 ADD SI,AX MOV BYTE PTR [SI],0 MOV DX,OFFSET BUFFER+2 MOV CX,0 MOV AH,3CH;建立文件 INT 21H JNC CREAOK MOV BX,HANDLE1 MOV AH,3EH;关闭文件 INT 21H MOV DX,OFFSET ERROR2 CALL DMESS JMP OVER CREAOK:MOV HANDLE2,AX CONT:MOV DX,OFFSET BUFFER MOV CX,BUFFLEN MOV BX,HANDLE1 MOV AH,3FH;读文件 INT 21H JC READERR OR AX,AX;进位标志CF清0 JZ COPY_OK MOV CX,AX MOV BX,HANDLE2 MOV AH,40H;写文件 INT 21H JC WRITERR JMP CONT READERR:MOV SI,OFFSET ERROR3 CALL DMESS JMP COPY_OK WRITERR:MOV SI,OFFSET ERROR4 CALL DMESS COPY_OK:MOV BX,HANDLE1 MOV AH,3EH INT 21H MOV BX,HANDLE2 MOV AH,3EH;关闭文件 INT 21H MOV DX,OFFSET INFOR3 CALL DMESS OVER:MOV AH,4CH INT 21H ;函数NEWLINE实现在串字符后输出一个回车换行: ;功能:显示由DX所指的提示信息 ;入口参数:DS:DX=需要输出字符串的首地址,字符串以S为结束标志 ;出口参数:无 DMESS PROC MOV AH,9;显示字符串 INT 21H RET;段内返回 DMESS ENDP ;功能:形成回车和换行 ;出口参数:无 ;入口参数:无 NEWLINE PROC PUSH AX PUSH DX;保护寄存器 MOV DL,0DH MOV AH,2;显示输出 INT 21H MOV DL,0AH MOV AH,2 INT 21H POP DX POP AX RET NEWLINE ENDP CSEG ENDS END START;程序结束`

关于c语言从文件中读取学生信息,处理并打印

![图片说明](https://img-ask.csdn.net/upload/201712/07/1512617928_774992.png) b) 建议函数流程: i. 打开数据文件,失败返回-1; ii. 从头到尾扫描数据文件(即预读一遍)获得学生人数; iii. 根据学生人数,利用malloc和sizeof等函数或运算符为struct student** pStudents分配内存; iv. 利用rewind函数,定位到文件头; v. 读取数据文件,并把每一条记录通过数组下标法或指针法保存到结构体数组pStudents中; vi. 关闭文件; vii. 返回学生人数。 c) 数据文件格式说明: 一行一条学生信息的记录,不同属性用空格隔开,输入数据中无总成绩记录,例如: 张三 通信 89 93 95 李四 网络 88 91 94 王五 物联网 71 94 88 3. 编写统计函数: a) 函数定义void Count(struct student pStudents[], int num)。输入参数分别为保存学生的结构体数组和学生人数。 b) 功能为:统计所有学生的总成绩和每个专业(假定一共三个专业:通信,网络,物联网)的平均成绩;输入参数包括学生信息结构体数组,学生人数,返回的每个学生的总成绩直接填充到对应的输入结构体数组对应字段中。统计信息包括三个专业的总人数、平均成绩数组,用全局变量来表示。访问每个学生信息的时候,用指针来指向当前正在处理的学生。 c) 设计一个或者三个带参数的宏,判断输入的字符串是否是指定的专业名称,并在函数Count中使用。 5. 编写main函数实现: a) 定义变量,其中保存学生信息的数据文件直接在源代码中初始化; b) 读取学生信息,如果失败,打印失败信息并退出程序; c) 统计学生信息; d) 输出统计信息。 e) 释放内存。 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> struct student{ char name[15]; char major[15]; int Eng_sco; int cal_sco; int c_sco; int sum; }; int tx_per=0,tx_ave,tx_sum=0; int wl_per=0,wl_ave,wl_sum=0; int wlw_per=0,wlw_ave,wlw_sum=0; int ReadStudentInfo(const char* filename, struct student** pStudents); void Count(struct student pStudents[], int num); int main() { int count; int m; struct student *list; count=ReadStudentInfo("readme.txt", &list); printf("学生信息: \n"); printf("----------------------------------------------------\n"); printf("序号 姓 名 专业名称 英语成绩 线性代数成绩 c语言成绩 总成绩\n"); for(m=1;m<=count;m++) { printf("%4d %s %s %4d %4d %4d %4d\n",m,(list+m-1)->name,(list+m-1)->major,(list+m-1)->Eng_sco,(list+m-1)->cal_sco,(list+m-1)->c_sco,(list+m-1)->sum); } Count(list, count); printf("\n统计信息 :\n"); printf("----------------------------------------------------\n"); printf("序号 专业名称 学生人数 平均成绩\n"); printf(" 1 通信 %d %d\n",tx_per,tx_ave); printf(" 2 网络 %d %d\n",wl_per,wl_ave); printf(" 3 物联网 %d %d\n",wlw_per,wlw_ave); return 0; } int ReadStudentInfo(const char* filename, struct student** pStudents) { FILE *fp; char ch; int i=1,j; fp=fopen(readme.txt,"r"); if(fp==NULL) { printf("cann't open the file"); exit(-1); } ch=fgetc(fp); while(ch!=EOF) { if(ch=='\n') { i++; } ch=fgetc(fp); } rewind(fp); *pStudents=(struct student*)malloc(sizeof(** pStudents)*i); for(j=0;j<i;j++) { fread(&*pStudents[j],sizeof(struct student)-sizeof(int),1,fp); (*pStudents+j)->sum=((*pStudents+j)->Eng_sco+(*pStudents+j)->cal_sco+(*pStudents+j)->c_sco); } fclose(fp); return i; } void Count(struct student pStudents[], int num) { int n=1; for(n=1;n<=num;n++) { if(!strcmp((pStudents+n-1)->major,"通信")) { tx_per++; tx_sum=tx_sum+(pStudents+n-1)->sum; } if(!strcmp((pStudents+n-1)->major,"网络")) { wl_per++; wl_sum=wl_sum+(pStudents+n-1)->sum; } if(!strcmp((pStudents+n-1)->major,"物联网")) { wlw_per++; wlw_sum=wlw_sum+(pStudents+n-1)->sum; } tx_ave=tx_sum/tx_per; wl_ave=wl_sum/wl_per; wlw_ave=wlw_sum/wlw_per; } free(pStudents); } ``` 运行不起来,是哪里出问题了?

一个CWnd对象的onpaint函数中,动态Create两个子窗口时造成wincore.cpp中的断言错误。

一个对话框子类CViewDlg 在onpaint函数中需要再动态创建两个子窗口 void CViewDlg::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 CRect rect; GetClientRect(&rect); m_wnd1->Create( NULL, //缺省的窗口 NULL, //无窗口名称 WS_CHILD|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_VISIBLE, //定义窗口风格 rect, // 窗口的大小 this, // 指定当前对话框为其父窗口指针 0); CRect wndRect(0, rect.Height()*0.25, rect.Width()*0.25,rect.bottom); m_wnd2->Create(NULL, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VISIBLE, wndRect, this, 0); } 以上代码会造成wincore.cpp文件638行的断言错误。 之前只需要动态创建一个窗口时,没有错误,请大牛指点!

MFC父对话框控件如何控制子对话框?

我在MFC建立了两个对话框,我想实现点击确定按钮后,判断父对话框的输入的EDIT的值,然后打开子对话框,并在picture空间上显示出不同的图片 ![图片说明](https://img-ask.csdn.net/upload/201805/11/1526042461_528318.png)![图片说明](https://img-ask.csdn.net/upload/201805/11/1526042443_253482.png) 我在确定按钮的消息处理函数中加了这段代码,不知道在子函数的文件中应该怎么写代码,麻烦各位帮忙看看 ``` void CATCDialog::OnBnClickedOk() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); CIEEE9DIALOG dlg; this->UpdateData(true); CWnd *pWnd = NULL; if (this->m_busnum == "9" && this->m_loadfactor == "0.8") { m_bitmap.LoadBitmap(IDB_9_08); dlg.DoModal(); } else if (this->m_busnum == "9" && this->m_loadfactor == "1.0") { m_bitmap.LoadBitmap(IDB_9_10); dlg.DoModal(); } else if (this->m_busnum == "9" && this->m_loadfactor == "1.2") { m_bitmap.LoadBitmap(IDB_9_12); dlg.DoModal(); } } ```

请问一下,为什么这两段程序会出现访问冲突?

``` void Linklist::save_stu_info() { string class_name; string class_name_suffix; Node *pt; pt = pHead; cout << "请输入保存班级名称:"; cin >> class_name; class_name_suffix = class_name + ".dat"; ofstream outfile(class_name_suffix, ios::binary); if (!outfile) { cerr << "open error!" << endl; abort(); } for (int i = 0; i < count; i++) { outfile.write((char *)pt, sizeof(Node)); pt = pt->pNext; } cout << "保存成功!" << endl; outfile.close(); } void Linklist::load_stu_info() { string class_name; string class_name_suffix; Node *pt; pt = pHead; cout << "请输入读取班级名称:"; cin >> class_name; class_name_suffix = class_name + ".dat"; ifstream infile(class_name_suffix, ios::binary); if (!infile) { cerr << "open error!" << endl; abort(); } cout << "请输入该班学生人数:" << endl; cin >> count; for (int i = 0; i < count; i++) { infile.read((char *)pt, sizeof(Node)); pt = pt->pNext; } cout << "读取成功!" << endl; infile.close(); } ```第一个函数是我用来保存链表的各个节点的指针到一个dat文件中,第二个函数是把dat文件中的指针读取出来,但是当我运行就会报错 0x659D4B89 (vcruntime140d.dll)处(位于 studentmanage.exe 中)引发的异常: 0xC0000005: 写入位置 0x00546448 时发生访问冲突。

EXCEL中使用VB语言写程序,调用函数时参数传递的问题

Application.Onkey"{Enter}","HanShu",使用这个语句实现当在特定单元格按下回车键时,可以调用模块HanShu,但我现在想要通过这个语句传递参数,比如我想写成Application.Onkey"{Enter}","HanShu(CanShu1,CanShu2)",但程序报错,请教各位大神这个应该靠什么功能实现参数传递?

这是职工管理系统的源代码,问题主要是无法以正确格式输出文件内容和修改函数不起作用,希望得到指导。

#include<stdio.h> //标准输入输出函数库 #include<string.h> //strcmp函数使用的头文件 #include<stdlib.h> //标准库头文件system(cls)函数需用到 #include<windows.h> //Sleep函数使用的头文件 #include<conio.h> //getch函数使用的头文件 //宏定义 #define LEN_EMPLOYEE sizeof(struct employee)//employee结构体的长度 #define LEN_ADM sizeof(struct adm)//adm结构体的长度 #define EMPLOYEE_NUM 500//职工的数组大小 #define ADM_NUM 10//管理员的数组大小 #define EMPLOYEE_DATA employeer[i].num,employeer[i].name,employeer[i].sex,employeer[i].age,employeer[i].xueli,employeer[i].wage,employeer[i].addr,employeer[i].tel #define ADM_DATA admer[i].account,admer[i].password //结构体的定义 struct employee { int num; //职工号 char name[20]; //姓名 char sex[10]; //性别 int age; //年龄 char xueli[30]; //学历 int wage; //工资 char addr[30]; //家庭住址 char tel[20]; //联系电话 }; struct adm { int num; //管理员的编号 char account[20]; //管理员的账户 char password[20]; //管理员的密码 }; //全局变量 struct employee employeer[EMPLOYEE_NUM]; struct adm admer[ADM_NUM]; //函数声明部分 void showmainmenu();//显示主菜单 void manager_in();//主管登录 void adm_in();//管理员登录 void employee_in();//职工登录 void managermenu();//主管菜单 void employee_display();//浏览职工信息 int employee_search();//查找职工信息 void employee_del();//删除职工信息 void employee_add();//添加职工信息 void employee_xiugai();//修改职工信息 void adm_add();//添加管理员信息 void adm_display();//浏览管理员信息 void adm_del();//删去管理员信息 void adm_xiugai();//修改管理员信息 int employeefile(char * pcMode);//职工文件函数 void saveemployeefile(int employeeid);//保存职工信息文件函数 void showemployee_xiugaimenu();//显示职工修改菜单 int admfile(char * pcMode);//管理员文件 int adm_search();//管理员查找 void showadm_xiugaimenu();//显示管理员修改菜单 void saveadmfile(int admid);//管理员保存文件函数 void admmenu();//管理员菜单 //主函数 int main() { int n; showmainmenu();/*调用showmainmenu函数绘制界面*/ scanf("%d",&n);/*提示用户输入数字*/ getchar(); while(n)/*当n为0时直接退出程序*/ { switch(n) { case 1: manager_in(); break; case 2: adm_in(); break; case 3: employee_in(); break; default: printf("\t\t请输入正确的数字!\n\t\t程序将于3秒后跳转到主菜单"); Sleep(3000); } showmainmenu(); scanf("%d",&n); getchar(); } return 0; } void showmainmenu() { system("cls"); printf("\n\n\n\n\n"); printf("\t|------------------欢迎进入-----------------------|\n"); printf("\t| 职工管理系统 |\n"); printf("\t| 主菜单 |\n"); printf("\t| 身份选择 |\n"); printf("\t| 1.manager |\n"); printf("\t| 2.administrator |\n"); printf("\t| 3.employee |\n"); printf("\t| 0.退出系统 |\n"); printf("\t|-------------------------------------------------|\n"); printf("\n"); printf("\t\t请选择(0-3):"); } void manager_in() { int n,i,j=0; char managername[10]; char managerpassword[20]; printf("将于3秒后转至manager登录界面"); Sleep(3000); system("cls"); for(i=0;i<3;i++) { printf("\n\t\t\t请输入你的用户名:"); scanf("%s",managername); printf("\n\t\t\t请输入你的密码:"); scanf("%s",managerpassword); if(strcmp(managername,"limengqi")==0&&strcmp(managerpassword,"123456")==0) { printf("\n\t\t\t登录成功!"); Sleep(1000); j=1; managermenu(); break; } else printf("\t\t\t输入用户名或者密码错误!"); continue; } scanf("%d",&n); getchar(); while(n) { switch(n) { case 1: employee_display(); break; case 2: employee_search(); break; case 3: employee_del(); break; case 4: employee_add(); break; case 5: employee_xiugai(); break; case 6: adm_add(); break; case 7: adm_display(); break; case 8: adm_del(); break; case 9: adm_xiugai(); break; default: printf("\t\t请输入正确的数字!"); } printf("|按任意键返回子菜单|"); getch(); managermenu(); scanf("%d",&n); getchar(); } } void managermenu() { system("cls"); printf("\n\n\n\n\n"); printf("\t|------------------欢迎进入-----------------------|\n"); printf("\t| 职工管理系统 |\n"); printf("\t| 子菜单 |\n"); printf("\t| 1.浏览职工信息 |\n"); printf("\t| 2.查询职工信息 |\n"); printf("\t| 3.删除职工信息 |\n"); printf("\t| 4.添加职工信息 |\n"); printf("\t| 5.修改职工信息 |\n"); printf("\t| 6.添加管理员信息 |\n"); printf("\t| 7.浏览管理员信息 |\n"); printf("\t| 8.删除管理员信息 |\n"); printf("\t| 9.修改管理员信息 |\n"); printf("\t| 0.返回主菜单 |\n"); printf("\t|-------------------------------------------------|\n"); printf("\n"); printf("\t\t请选择(0-9):"); } void employee_display() { int i,employee_record; system("cls"); employee_record=employeefile("rb"); if(employee_record==-1) printf("文件打开失败,请先添加职工信息!\n"); else if(employee_record==0) printf("文件中没有职工信息!\n"); else { printf("\t|----------------------------------------------------------|\n"); printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话"); for(i=0;i<employee_record;i++) printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n",EMPLOYEE_DATA); printf("\t|----------------------------------------------------------|\n"); } } void employee_add() { FILE *pfemployee;//文件指针 int employee_record,iflagexist,i; char cFlag; system("cls"); employee_record=employeefile("ab+");//ab+追加方式打开或重建二进制文件 if(employee_record==-1) { printf("文件打开失败!\n"); return; } else if(employee_record==0) printf("文件中没有职工信息!\n"); else employee_display();//如果职工信息不为0则显示所有职工信息 /*以下代码为循环录入职工信息*/ printf("请选择是否要输入职工信息(y/n):"); cFlag=getchar(); getchar(); if(cFlag=='n') return; pfemployee=fopen("employee.txt","ab+"); if( pfemployee==NULL) { printf("文件打开失败!\n"); return; } while(cFlag=='y') { if(employee_record>=EMPLOYEE_NUM)//超过容量范围不能继续写入 { printf("记录已满!"); fclose(pfemployee); return; } printf("请输入职工编号:"); do{ iflagexist=0; scanf("%d",&employeer[employee_record].num); getchar(); for(i=0;i<employee_record;i++) { if(employeer[i].num==employeer[employee_record].num) { iflagexist=1; printf("该职工编号已存在,请重新输入:"); break; } } }while( iflagexist==1); //新增的职工基本信息 printf("请输入职工号:"); scanf("%-6d",&employeer[employee_record].num); getchar(); printf("请输入姓名:"); gets(employeer[employee_record].name); printf("请输入性别:"); scanf("%-10s",&employeer[employee_record].sex); getchar(); printf("请输入年龄:"); scanf("%-6d",&employeer[employee_record].age); getchar(); printf("请输入学历:"); gets(employeer[employee_record].xueli); printf("请输入工资:"); scanf("%-16d",&employeer[employee_record].wage); getchar(); printf("请输入住址:"); gets(employeer[employee_record].addr); printf("请输入电话:"); gets(employeer[employee_record].tel); /*将新增的职工信息写入文件中*/ if(fwrite(&employeer[employee_record],LEN_EMPLOYEE,1,pfemployee)!=1) { printf("无法保存该信息!\n"); return; } else { printf("%d号职工信息已保存!\n",employeer[employee_record].num); employee_record++; } printf("继续输入信息吗(y/n)"); cFlag=getchar(); getchar(); } fclose(pfemployee); printf("添加职工信息执行完毕\n"); } int employee_search() { int employeenum,employee_record,employeeid,i; system("cls"); employee_record=employeefile("rb");//以"rb"形式打开文件,如果失败则返回 if(employee_record==-1) { printf("文件打开失败!\n"); printf("|按任意键返回子菜单|"); getch(); return -2;//文件打开失败,返回-2 } else if(employee_record==0) { printf("文件中没有职工信息!\n"); printf("|按任意键返回子菜单|"); getch(); return -3;//文件打开失败,返回-3 } //以下进入查找程序 printf("请输入职工号:"); scanf("%d",&employeenum); getchar(); for(i=0;i<employee_record;i++) { if(employeenum==employeer[i].num ) { employeeid=i;//找到职工记录,返回记录号 printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话"); printf("\t %-6d %-10s %-10c %-6d %-10s %-16d %-16s %-20s\n",EMPLOYEE_DATA); printf("\t|----------------------------------------------------------|\n"); break; } } if(i==employee_record)//遍历循环,没有找到记录,提示用户 { printf("找不到%d号职工信息!\n",employeenum); employeeid=-1; } return employeeid; } void employee_del() { FILE *pfemployee; int employeeid,employee_record,i; char cFlag;//字符型变量用于选择 system("cls"); employeeid=employee_search();//调用查找函数获得职工记录号 if(employeeid==-1) return; employee_record=employeefile("rb"); printf("已找到该职工,是否删除?(y/n)"); cFlag=getchar(); getchar(); if(cFlag=='n') return; else if(cFlag=='y') { for(i=employeeid;i<employee_record-1;i++) employeer[i]=employeer[i+1];//数组依次前移 employee_record--; } pfemployee=fopen("employee.txt","wb"); if(pfemployee!=NULL) { for(i=0;i<employee_record;i++) { if(fwrite(&employeer[i],LEN_EMPLOYEE,1,pfemployee)!=1) { printf("无法保存该信息!\n"); return; } } fclose(pfemployee); printf("该职工信息已删除!\n"); } } void employee_xiugai() { int employeeid,employee_record,iflagexist,n,num,i; system("cls"); employeeid=employee_search();//调用查找函数获得职工记录号 if(employeeid==-1)//未找到该序号的职工,直接返回 return; //找到该序号的职工,可以进行修改操作 employee_record=employeefile("rb"); showemployee_xiugaimenu();//显示修改选项的菜单 scanf("%d",&n); getchar(); switch(n) { case 1: printf("请输入职工编号:"); do { iflagexist=0; scanf("%d",&n); getchar(); for(i=0;i<employee_record;i++) { if(num==employeer[i].num&&i!=employeeid) { iflagexist=1; printf("错误,该职工编号已存在,请重新输入:"); break; } } }while(iflagexist==1); employeer[employeeid].num=num; break; case 2: printf("请输入职工姓名:"); gets(employeer[employee_record].name); break; case 3: printf("请输入性别:"); scanf("%-10s",employeer[employee_record].sex); getchar(); break; case 4: printf("请输入年龄:"); scanf("%-10d",&employeer[employee_record].age); getchar(); break; case 5: printf("请输入学历:"); gets(employeer[employee_record].xueli); break; case 6: printf("请输入工资:"); scanf("%-16d",&employeer[employee_record].wage); getchar(); break; case 7: printf("请输入住址:"); gets(employeer[employee_record].addr); break; case 8: printf("请输入电话:"); gets(employeer[employee_record].tel); break; } //调用saveemployeefile函数将修改记录存入文件 saveemployeefile(employeeid); printf("职工信息修改成功!\n"); } void showemployee_xiugaimenu() { printf("\n"); printf("\t| 1.职工号 |\n"); printf("\t| 2.姓名 |\n"); printf("\t| 3.性别 |\n"); printf("\t| 4.年龄 |\n"); printf("\t| 5.学历 |\n"); printf("\t| 6.工资 |\n"); printf("\t| 7.住址 |\n"); printf("\t| 8.电话 |\n"); printf("\n"); printf("请输入所要修改的信息(输入相应的数字:1-5):"); } int employeefile(char * pcMode)//该函数负责从文件中读取所有的职工信息,并记录employee_record的值 { int employee_record=0; FILE *pfemployee; pfemployee=fopen("employee.txt",pcMode); if(pfemployee==NULL) return -1; while(!feof(pfemployee)) { if(fread(&employeer[employee_record],LEN_EMPLOYEE,1,pfemployee)) employee_record++; } fclose(pfemployee); return employee_record; } void saveemployeefile(int employeeid)//该函数专门负责将职工记录号为employeeid的职工信息写入到文件中 { FILE *pfemployee; pfemployee=fopen("employee.txt","a+"); if(pfemployee!=NULL) { fseek(pfemployee,LEN_EMPLOYEE * employeeid,SEEK_SET); if(fwrite(&employeer[employeeid],LEN_EMPLOYEE,1,pfemployee)!=1) printf("无法保存该信息!\n"); } fclose(pfemployee); } void adm_add() { FILE *pfadm;//文件指针 int adm_record,iflagexist,i; char cFlag; system("cls"); adm_record=admfile("ab+");//ab+追加方式打开或重建二进制文件 if(adm_record==-1) { printf("文件打开失败!\n"); return; } else if(adm_record==0) printf("文件中没有职工信息!\n"); else adm_display();//如果职工信息不为0则显示所有职工信息 /*以下代码为循环录入职工信息*/ printf("请选择是否要输入职工信息(y/n):"); cFlag=getchar(); getchar(); if(cFlag=='n') return; pfadm=fopen("adm.txt","ab+"); if( pfadm==NULL) { printf("文件打开失败!\n"); return; } while(cFlag=='y') { if(adm_record>=ADM_NUM)//超过容量范围不能继续写入 { printf("记录已满!"); fclose(pfadm); return; } printf("请输入管理员编号:"); do{ iflagexist=0; scanf("%d",&admer[adm_record].num); getchar(); for(i=0;i<adm_record;i++) { if(admer[i].num==admer[adm_record].num) { iflagexist=1; printf("该管理员编号已存在,请重新输入:"); break; } } }while( iflagexist==1); //新增的管理员的账户和密码 printf("请输入管理员号:"); scanf("%-6d",&admer[adm_record].num); getchar(); printf("请输入账户:"); gets(admer[adm_record].account); printf("请输入密码:"); gets(admer[adm_record].password); /*将新增的管理员的账户和密码写入文件中*/ if(fwrite(&admer[adm_record],LEN_ADM,1,pfadm)!=1) { printf("无法保存该信息!\n"); return; } else { printf("%d号职工信息已保存!\n",admer[adm_record].num); adm_record++; } printf("继续输入信息吗(y/n)"); cFlag=getchar(); getchar(); } fclose(pfadm); printf("添加管理员账户和密码执行完毕\n"); } void adm_display() { int i,adm_record; system("cls"); adm_record=admfile("rb"); if(adm_record==-1) printf("文件打开失败,请先添加管理员信息!\n"); else if(adm_record==0) printf("文件中没有管理员信息!\n"); else { printf("\t|----------------------------------------------------------|\n"); printf("\t %-6s %-20s %-20s\n","管理员编号","账户","密码"); for(i=0;i<adm_record;i++) printf("\t %-6d %-20s %-20s\n",ADM_DATA); printf("\t|----------------------------------------------------------|\n"); } } void adm_del() { FILE *pfadm; int admid,adm_record,i; char cFlag;//字符型变量用于选择 system("cls"); admid=adm_search();//调用查找函数获得管理员记录号 if(admid==-1) return; adm_record=admfile("rb"); printf("已找到该管理员,是否删除?(y/n)"); cFlag=getchar(); getchar(); if(cFlag=='n') return; else if(cFlag=='y') { for(i=admid;i<adm_record-1;i++) admer[i]=admer[i+1];//数组依次前移 adm_record--; } pfadm=fopen("adm.txt","wb"); if(pfadm!=NULL) { for(i=0;i<adm_record;i++) { if(fwrite(&admer[i],LEN_ADM,1,pfadm)!=1) { printf("无法保存该信息!\n"); return; } } fclose(pfadm); printf("%d号管理员信息已删除!\n",admer[i].num); } } void adm_xiugai() { int admid,adm_record,iflagexist,n,num,i; system("cls"); admid=adm_search();//调用查找函数获得管理员记录号 if(admid==-1)//未找到该序号的管理员,直接返回 return; //找到该序号的管理员,可以进行修改操作 adm_record=admfile("rb"); showadm_xiugaimenu();//显示修改选项的菜单 scanf("%d",&n); getchar(); switch(n) { case 1: printf("请输入管理员编号:"); do { iflagexist=0; scanf("%d",&n); getchar(); for(i=0;i<adm_record;i++) { if(num==admer[i].num&&i!=admid) { iflagexist=1; printf("错误,该管理员编号已存在,请重新输入:"); break; } } }while(iflagexist==1); admer[admid].num=num; break; case 2: printf("请输入管理员账户:"); gets(admer[adm_record].account); break; case 3: printf("请输入管理员密码:"); gets(admer[adm_record].password); break; } //调用saveadmfile函数将修改记录存入文件 saveadmfile(admid); printf("管理员信息修改成功!\n"); } void showadm_xiugaimenu() { printf("\n"); printf("\t| 1.管理员编号 |\n"); printf("\t| 2.账户 |\n"); printf("\t| 3.密码 |\n"); printf("\n"); printf("请输入所要修改的信息(输入相应的数字:1-3):"); } int admfile(char * pcMode)//该函数负责从文件中读取所有的管理员信息,并记录adm_record的值 { int adm_record=0; FILE * pfadm; pfadm=fopen("adm.txt",pcMode); if(pfadm==NULL) return -1; while(!feof(pfadm)) { if(fread(&admer[adm_record],LEN_ADM,1,pfadm)) adm_record++; } fclose(pfadm); return adm_record; } void saveadmfile(int admid)//该函数专门负责将管理员记录号为admid的管理员信息写入到文件中 { FILE *pfadm; pfadm=fopen("adm.txt","r+"); if(pfadm!=NULL) { fseek(pfadm,LEN_ADM * admid,SEEK_SET); if(fwrite(&admer[admid],LEN_ADM,1,pfadm)!=1) printf("无法保存该信息!\n"); } fclose(pfadm); } int adm_search() { int admnum,adm_record,admid,i; system("cls"); adm_record=admfile("rb");//以"rb"形式打开文件,如果失败则返回 if(adm_record==-1) { printf("文件打开失败!\n"); printf("|按任意键返回子菜单|"); getch(); return -2;//文件打开失败,返回-2 } else if(adm_record==0) { printf("文件中没有职工信息!\n"); printf("|按任意键返回子菜单|"); getch(); return -3;//文件打开失败,返回-3 } //以下进入查找程序 printf("请输入职工号:"); scanf("%d",&admnum); getchar(); for(i=0;i<adm_record;i++) { if(admnum==admer[i].num ) { admid=i;//找到职工记录,返回记录号 printf("\t %-6d %-20s %-20s\n","管理员编号","账户","密码"); printf("\t %-6d %-20s %-20s\n",ADM_DATA); printf("\t|----------------------------------------------------------|\n"); break; } } if(i==adm_record)//遍历循环,没有找到记录,提示用户 { printf("找不到%d号职工信息!\n",admnum); admid=-1; } return admid; } void adm_in() { int i,n,k,j=-1,adm_record; char admaccount[20]; char admpassword[20]; FILE *fpadm; adm_record=admfile("rb"); printf("将于3秒后转至administrator登录界面"); Sleep(3000); system("cls"); for(k=0;k<3;k++) { printf("\n\t\t\t请输入你的账户名:"); scanf("%s",admaccount); printf("\n\t\t\t请输入你的登入密码:"); scanf("%s",admpassword); for(i=0;i<adm_record;i++) { if(strcmp(admer[i].account,admaccount)==0&&strcmp(admer[i].password,admpassword)==0) { printf("\n\t\t\t登入成功!"); j=1; admmenu(); goto loop; } else printf("\t\t\t用户名或者密码错误,请重新输入:"); break; } } if(j==-1) { printf("\t连续输入错误3次,即将退出程序\n"); Sleep(1000); exit(0); } loop: scanf("%d",&n); getchar(); while(n) { switch(n) { case 1: employee_display(); break; case 2: employee_search(); break; case 3: employee_del(); break; case 4: employee_add(); break; case 5: employee_xiugai(); break; default: printf("\t\t请输入正确的数字!"); } printf("|按任意键返回子菜单|"); getch(); admmenu(); scanf("%d",&n); getchar(); } } void admmenu() { system("cls"); printf("\n\n\n\n\n"); printf("\t|------------------欢迎进入-----------------------|\n"); printf("\t| 职工管理系统 |\n"); printf("\t| 子菜单 |\n"); printf("\t| 1.浏览职工信息 |\n"); printf("\t| 2.查询职工信息 |\n"); printf("\t| 3.删除职工信息 |\n"); printf("\t| 4.添加职工信息 |\n"); printf("\t| 5.修改职工信息 |\n"); printf("\t| 0.返回主菜单 |\n"); printf("\t|-------------------------------------------------|\n"); printf("\n"); printf("\t\t请选择(0-5):"); } void employee_in() { int n,employee_record; system("cls"); printf("\n\n\n\n\n"); employee_record=employeefile("rb"); if(employee_record==-1) printf("文件打开失败,你的信息还没有被添加!\n"); else if(employee_record==0) printf("文件中没有你的信息!\n"); else { printf("\t|----------------------------------------------------------|\n"); printf("\t %-6s %-10s %-10s %-6s %-10s %-16s %-16s %-20s\n","职工号","姓名","性别","年龄","学历","工资","住址","电话"); printf("请输入你的职工号:\n"); scanf("%d",&n); printf("\t %-6d %-10s %-10c %-6d %-10s %-16d %-16s %-20s\n",employeer[n-1].num,employeer[n-1].name,employeer[n-1].sex,employeer[n-1].age,employeer[n-1].xueli,employeer[n-1].wage,employeer[n-1].addr,employeer[n-1].tel); printf("\t|----------------------------------------------------------|\n"); } }

C++程序编译报错,是软件的问题吗?

1.编译报错如下: 1>------ 已启动生成: 项目: 04带头结点的线性链表, 配置: Debug Win32 ------ 1>生成启动时间为 2019/8/14 22:24:35。 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(147,5): error MSB6003: 指定的任务可执行文件“CL.exe”未能运行。文件“C:\Users\erm\AppData\Local\Temp\tmp4e93c8c83e9e4057aa4e2f17f0f92198.rsp”正由另一进程使用,因此该进程无法访问此文件。 1> 1>生成失败。 1> 1>已用时间 00:00:00.37 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 2.调试过程回顾: (1)编译正常,代码运行正常,VS2010 (2)编写子函数模块如下: Status ListTraverse(LinkList L,Status (* visit)(LinkList)) { //依次对L的每个元素调用函数visit().一旦visit()失败,则操作失败 if(!visit) //visit不为空,宏定义#define NULL 0 =》vistit!=NULL return ok; //visit是一个指针变量,可以指向任何函数,注意参数类型 //Status c=(*visit)(L); //指针指向函数 (*visit)(L); return 0; }; (3)修改完成,无语法错误,运行出现报错 3.尝试解决 (1)重新编译,问题未能解决 (2)删除\Users\erm\AppData\Local\Temp\tmp4路径下所有文件,编译,问题未能解决 (3)尝试关闭软件,重新编译,以管理者运行方式打开,重新编译,问题未能解决

虹膜识别出现错误识别,识别成其他人的问题

void CTestBioDlg::OnBTNBioIDMatch() { // TODO: Add your control notification handler code here // 数组初始化,用于保存员工编号 m_strArrayWorkerNo.RemoveAll(); // read try { //打开数据库操作 CString strSQL = "select * from mwsswork"; m_useBLOB.Open(CRecordset::snapshot, strSQL); if(m_useBLOB.IsOpen()) { //将记录逐条读进缓存区 m_useBLOB.MoveFirst(); CString strFileName = _T("c:\\Iris.txt"); CString strText = _T(""); CFile outFile(strFileName, CFile::modeCreate|CFile::modeWrite); //员工总人数 IrisDatabaseSize =0; while (!m_useBLOB.IsEOF()) { //统计员工总人数 IrisDatabaseSize++; //员工编号写进数组 strText = m_useBLOB.m_workerno; //除去字符串右边的字符 strText.TrimRight(_T(" ")); m_strArrayWorkerNo.Add(strText); //分配内存区,并将虹膜信息逐条写进c:\\Iris.txt LPSTR buffer = (LPSTR)GlobalLock(m_useBLOB.m_workerpicture.m_hData); outFile.WriteHuge(buffer,m_useBLOB.m_workerpicture.m_dwDataLength); GlobalUnlock(m_useBLOB.m_workerpicture.m_hData); //读取下一条记录 m_useBLOB.MoveNext(); } outFile.Close(); } m_useBLOB.Close(); } catch(CException* pE) { pE->ReportError(); pE->Delete(); return; } //分配缓存区 CFile FileIris("c:\\Iris.txt",CFile::modeRead); DWORD Length = FileIris.GetLength(); //指向缓存区的指针P p=::GlobalAlloc(0,Length); if(p==NULL) { this->MessageBox("分配缓冲区出错"); } FileIris.ReadHuge(p,Length); long* IrisTemplatesDatabase; //m_dlgsyssetting系统参数设置对话框 算法设置 CString ComboAlgorithm = m_dlgsyssetting.m_strComboAlgorithm; //数据格式转换 long ISOIEC197946Segment = _ttol(ComboAlgorithm); m_ctrlBIO.BioIDSetISOIEC197946Segment(ISOIEC197946Segment); //识别间隔时间 m_dlgsyssetting系统参数设置对话框 CString EditTime = m_dlgsyssetting.m_strEditTime; //数据格式转换 long Sleep = _ttol(EditTime); //识别模式 Mode=0为一对一识别 long Mode = 0; if (m_dlgsyssetting.m_strCheckMatch == "TRUE") { Mode = 1; } //指针类型转换 void far *p 转换为 (long*)(p) IrisTemplatesDatabase = (long*)(p); //调用虹膜识别函数 //BioIDMatchIris(long*IrisTemplatesDatabase,long IrisDatabaseSize,long Mode,long Sleep) //通过调用控件对应的虹膜识别函数来实现虹膜识别的功能 m_ctrlBIO.BioIDMatchIris(IrisTemplatesDatabase,IrisDatabaseSize, Mode,Sleep); } 我这边现在可以判断的是采集的虹膜信息是没问题的,我把从数据库里面读出来的虹膜信息替换了厂家提供的软件下根目录里的采集的虹膜特征文件,这个时候可以正常识别的。 下面这个是识别函数对应的消息事件响应 void CTestBioDlg::BioIDMatchIrisEvent(long RecordID, long MatchResult) { // TODO: Add your control notification handler code here if (MatchResult == 1) { CString strMsg; //匹配员工编号 matchID = m_strArrayWorkerNo[RecordID]; strMsg = "员工工号为【" + matchID + "】,识别成功!"; MessageBox(strMsg, "提示", MB_ICONINFORMATION | MB_OK); ::GlobalFree(p); m_bDialogMode = TRUE; // int nResponse = m_dlgexam.DoModal(); m_dlgexam.DoModal(); } } 已经困扰了很久,求大神帮忙解答

c++编写旅店信息管理系统

在运行过程中Restaurant 文件出现乱码,不知该如何解决? 源代码如下: #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> #define MIN 1 //宏定义房间序号的最小值 #define MAX 30 //宏定义房间序号的最大值 #define LEN sizeof(struct Hotel) //用LEN代替结构体的"长度" char menu_select(); //函数声明 struct Hotel * regeist(); void in_information(); void out_information(); void search_number(); void show_all(); void search_name(); struct Hotel * change_change(); void change_save(struct Hotel *Q); void change(); void fire(); struct Hotel * fire_delet(); void fire_save(struct Hotel *Q); void check(int n); struct Hotel *load(); struct Hotel //定义全局结构体变量 { int room_number; char name [20]; char sex[10]; char ID [20]; float paid[10]; int inyear ; int inmonth ; int inday ; struct Hotel *next ; }; char menu_select () //定义menu_select函数,用来完成菜单功能 { char select ; printf ("\n\n--------------------------欢迎使用旅店信息管理系统---------------------------\n\n"); printf ("1.创建旅店信息\n2.查看旅店信息\n3.查看某一房间信息\n4.查看旅客信息\n"); printf ("5.查找某一旅客信息\n6.旅客入住\n7.旅客换房\n8.旅客退房\n9.退出管理系统\n"); printf ("\n-----------------------------------------------------------------------------\n"); select=getch(); return select ; //返回select的值 } void in_information() //定义in_information函数,完成创建旅店信息功能 { FILE *fp; //定义文件指针 char ch,choice[2]; printf ("\n确定创建新的旅店信息吗?该操作将清除现有的旅店信息!(y/n):"); scanf ("%s",choice); if((strcmp(choice,"Y")!=0)&&(strcmp(choice,"y")!=0)) return; if ((fp=fopen("information.txt","w"))==NULL) { printf ("无法打开文件!\n"); getch(); exit(0); } printf("\n请创建新的旅店信息(以#结束):\n"); //提示输入旅店信息 ch=getchar(); while (ch!='#') //判断是否结束输入信息 { fputc(ch,fp); ch=getchar(); } fclose (fp); printf ("\n创建信息成功!"); //提示创建信息成功 } void out_information() //定义out_information函数,完成查看旅店信息功能 { FILE *fp; char ch ; if ((fp=fopen("information.txt","r"))==NULL) { printf ("无法打开文件!\n"); getch(); exit(0); } ch=fgetc(fp); system("cls"); printf("\n\n\t\t\t旅店信息介绍: (若没有信息请返回创建)"); //开始输出旅店信息 printf ("\n-------------------------------------------------------------------------------\n\n\t"); while (ch!=EOF) { putchar(ch); ch=fgetc(fp); } fclose(fp); //文件用后一定要关闭 } struct Hotel * regeist () //定义regeist函数,用来完成旅客入住功能 { FILE *fp ; //定义文件指针 char ch[2] ; int number ; struct Hotel *head,*p1,*p2 ; head=NULL ; if((fp=fopen("resturant.txt","a+"))==NULL) { printf ("无法打开文件!\n"); getch(); exit(0); } do { p1=(struct Hotel *)malloc(LEN); //开辟新的节点 p2=(struct Hotel *)malloc(LEN); if ((p1==NULL)||(p2==NULL)) { printf ("动态内存分配失败!\n"); //如果动态内存分配失败,返回失败信息 getch(); exit(0); } printf ("\n请登记入住信息!\n"); //开始登记旅客信息 printf ("roomnumber(%d~%d):",MIN,MAX); scanf ("%d",&number); if (number<MIN||number>MAX) //假设该旅店只有1~30间房间 { printf ("\a\nError !"); return 0; } check (number); //检查该房间是否已经有旅客入住了 p1->room_number=number ; //在该房间没有旅客时,登记入住 printf ("name:\t"); scanf ("%s",&p1->name); printf ("sex:\t"); scanf ("%s",&p1->sex); printf ("ID:\t"); scanf ("%s",&p1->ID); printf ("paid:\t"); scanf ("%s",&p1->paid); printf ("date(年月日空格隔开):"); scanf ("%d %d %d",&p1->inyear,&p1->inmonth,&p1->inday); p1->next=NULL ; if(head==NULL) //将输入的信息保存到链表 { head=p1; p2=p1 ; } else { p2->next=p1; p2=p1 ; } fwrite(p2,LEN,1,fp); //将链表信息保存到磁盘文件 printf ("\n请选择是否继续登记信息 (y/n):"); //判断是否继续登记旅客信息 scanf ("%s",ch); if((strcmp(ch,"Y")!=0)&&(strcmp(ch,"y")!=0)) { fclose (fp); printf ("\n登记旅客入住信息成功!"); return(0); } }while(1) ; return (head) ; //登记完成后返回头链表指针 } void search_number () //定义search_number函数,用来完成查看某一房间的信息 { char ch[2] ; int room_number ; //room_number用来储存需要查询的roomnumber struct Hotel *head, *pa ; head=load(); printf ("\n请输入需要查看的房间序号:(%d~%d):",MIN,MAX); scanf ("%d",&room_number); pa= head->next; if (room_number<MIN||room_number>MAX) //Error时,容错判断 { printf ("\a\nError!"); return ; } for(;;) //for语句循环 { if (pa) { if(room_number==pa->room_number) //遍历链表,如果找到相应信息,则输出 { printf ("\n"); printf ("roomnumber:\t%d",pa->room_number); printf ("\n"); printf ("name:\t\t%s",pa->name); printf ("\n"); printf ("sex:\t\t%s",pa->sex); printf ("\n"); printf ("ID:\t\t%s",pa->ID); printf ("\n"); printf ("paid:\t\t%s",pa->paid); printf ("\n"); printf ("%d %d %d",pa->inyear,pa->inmonth,pa->inday); printf ("\n"); printf ("\n请选择是否继续查看信息(y/n):\n"); //提示是否继续查看 scanf ("%s",ch); if((strcmp(ch,"Y")!=0)&&(strcmp(ch,"y")!=0)) { getch(); return; } else { printf ("\n请输入需要查看的房间序号:(%d~%d):",MIN,MAX); scanf ("%d",&room_number); pa= head->next; if (room_number<MIN||room_number>MAX) { printf ("\a Error !"); return; } continue ; //跳出该层循环 } } pa = pa->next; //时pa的下一个指针赋值给pa } else { printf ("\n该房间还没有旅客入住"); //如果该房间还没有旅客入住,返回相应信息 return; } } } void show_all() //定义是show_all函数,用来显示所有旅客信息 { struct Hotel *head, *pa ; head=load(); pa= head->next; printf ("\n所有入住旅客的信息如下:\n"); while (pa) //显示所有的旅客信息 { printf ("\n"); printf ("roomnumber:\t%d",pa->room_number); printf ("\n"); printf ("name:\t\t%s",pa->name); printf ("\n"); printf ("sex:\t\t%s",pa->sex); printf ("\n"); printf ("ID:\t\t%s",pa->ID); printf ("\n"); printf ("paid:\t\t%s",pa->paid); printf ("\n"); printf ("date:\t\t%d %d %d",pa->inyear,pa->inmonth,pa->inday); printf ("\n"); pa = pa->next; } } void search_name () //定义search_name函数,用来完成查看某一旅客的信息 { char ch[2] ; char inname[20] ; //用数组inname[20]来储存需要查询的旅客name struct Hotel *head, *pa ; head=load(); printf ("\n请输入需要查看的旅客姓名:"); scanf ("%s",inname); pa= head->next; for (;;) { if (pa) { if(strcmp(inname,pa->name)==0) { printf ("\n"); printf ("roomnumber:\t%d",pa->room_number); printf ("\n"); printf ("name:\t\t%s",pa->name); printf ("\n"); printf ("sex:\t\t%s",pa->sex); printf ("\n"); printf ("ID:\t\t%s",pa->ID); printf ("\n"); printf ("paid:\t\t%s",pa->paid); printf ("\n"); printf ("date:\t\t%d %d %d",pa->inyear,pa->inmonth,pa->inday); printf ("\n"); printf ("\n请选择是否继续查看信息(y/n):\n"); scanf ("%s",ch); if((strcmp(ch,"Y")!=0)&&(strcmp(ch,"y")!=0)) { getch(); return; } else { printf ("\n请输入需要查看的旅客姓名:"); scanf ("%s",inname); pa= head->next; continue ; } } pa = pa->next; } else { printf ("\n没有查到该旅客的信息"); //没有此人时,返回相应信息 return ; } } } void change() { struct Hotel *M ; M=change_change(); change_save(M); } struct Hotel * change_change () { int room_number ; //room_number用来储存需要换房的roomnumber int newroom_number ; struct Hotel *head, *pa ; head=load(); printf ("\n请输入需要换房的房间序号:(%d~%d):",MIN,MAX); scanf ("%d",&room_number); if (room_number<MIN||room_number>MAX) //容错判断 { printf ("\aError!"); exit(0) ; } pa= head->next; for (;;) //for语句循环 { if (pa) { if(room_number==pa->room_number) { printf ("\n"); printf ("roomnumber:\t%d",pa->room_number); printf ("\n"); printf ("name:\t\t%s",pa->name); printf ("\n"); printf ("sex:\t\t%s",pa->sex); printf ("\n"); printf ("ID:\t\t%s",pa->ID); printf ("\n"); printf ("paid:\t\t%s",pa->paid); printf ("\n"); printf ("date:\t\t%d %d %d",pa->inyear,pa->inmonth,pa->inday); printf ("\n"); printf ("\n请输入需要换到的房间序号:(%d~%d):",MIN,MAX); scanf ("%d",&newroom_number); if (newroom_number<MIN||newroom_number>MAX) { printf ("\aError!"); exit(0); } check (newroom_number); pa->room_number=newroom_number ; break ; } pa = pa->next; } else { printf ("\n该房间还没有旅客入住!\n"); exit(0); } } return (head) ; } void change_save(struct Hotel *Q) { FILE *fp ; struct Hotel *L ; L=Q->next ; if((fp=fopen("resturant.txt","wb"))==NULL) { printf ("无法打开文件!\n"); getch(); exit(0); } while(L) { fwrite(L,LEN,1,fp); L=L->next ; } fclose(fp); printf ("\n换房成功!"); } void fire() { struct Hotel *M ; M=fire_delet(); fire_save(M); } struct Hotel * fire_delet() { char inname[20] ; //用数组inname[20]来储存需要退房旅客name struct Hotel *head, *previous,*pa ; head=load(); previous=(struct Hotel *)malloc(LEN); //开辟新的节点 if (previous==NULL) { printf ("动态内存分配失败!\n"); //如果动态内存分配失败,返回失败信息 getch(); exit(0); } printf ("\n请输入需要退房的旅客姓名:"); scanf ("%s",inname); pa=head->next ; for(;;) { if (pa) { if(strcmp(inname,pa->name)==0) { printf ("\n"); printf ("roomnumber:\t%d",pa->room_number); printf ("\n"); printf ("name:\t\t%s",pa->name); printf ("\n"); printf ("sex:\t\t%s",pa->sex); printf ("\n"); printf ("ID:\t\t%s",pa->ID); printf ("\n"); printf ("paid:\t\t%s",pa->paid); printf ("\n"); printf ("date:\t\t%d %d %d",pa->inyear,pa->inmonth,pa->inday); printf ("\n"); if(pa==head) { head=pa->next; return head ; } else { previous=head ; while(previous->next != pa) //找到需要查找节点的前一个节点 previous=previous->next ; if (pa->next==NULL) previous->next=NULL ; else previous->next=pa->next ; break ; } } pa = pa->next; } else { printf ("\n没有查找到该旅客的信息!\n"); getch(); exit(0); } } return (head) ; } void fire_save(struct Hotel *Q) { FILE *fp ; struct Hotel *L ; L=Q->next ; if((fp=fopen("resturant.txt","wb"))==NULL) { printf ("无法打开文件!\n"); getch(); exit(0); } while(L) { fwrite(L,LEN,1,fp); L=L->next ; } fclose(fp); printf ("\n退房成功!"); } void check(int n) //定义check函数,用来检查登记时房间是否已经有旅客入住 { FILE *fp ; struct Hotel *head, *pa,*pb, *s ; pa=(struct Hotel *)malloc(LEN); //开辟新的节点 pb=(struct Hotel *)malloc(LEN); s =(struct Hotel *)malloc(LEN); head = pb; if((pa==NULL)||(pb==NULL)||(s==NULL)) { printf ("内存分配失败!\n"); getch(); exit(0); } if((fp=fopen("resturant.txt","rb"))==NULL) { printf ("无法打开文件!\n"); getch(); exit(0); } while (fread (s,LEN,1,fp)) //读取当前的信息,并存到链表中 { pb->next = s; pb = s; s = (struct Hotel *)malloc(LEN); } pb->next =NULL; pa=head ; while (pa) { if (pa->room_number==n) { printf ("\n%d号房间已经有旅客入住了!\n",n); getch(); exit(0); } pa=pa->next ; } } struct Hotel *load() //定义load函数读取当前的信息,并存到链表中 { FILE *fp ; struct Hotel *head,*pb, *s ; pb=(struct Hotel *)malloc(LEN); //开辟新的节点 s =(struct Hotel *)malloc(LEN); if((pb==NULL)||(s==NULL)) { printf ("动态内存分配失败!\n"); getch(); exit(0); } if((fp=fopen("resturant.txt","rb"))==NULL) { printf ("无法打开文件!\n"); getch(); exit(0); } head = pb; while (fread (s,LEN,1,fp)) //读取当前的信息,并存到链表中 { pb->next = s; pb = s; s = (struct Hotel *)malloc(LEN); } pb->next =NULL; return head ; //返回链表的头指针 } int main () //主函数部分,调用若干子函数完成相应的功能 { char choice ; do { choice=menu_select(); switch (choice) //switch 语句,选择判断 { case '1':in_information();break; case '2':out_information();break; case '3':search_number();break; case '4':show_all();break; case '5':search_name();break; case '6':regeist();break; case '7':change();break; case '8':fire();break; case '9':exit(0);break; //退出旅店信息管理系统 default :printf ("\aError !");break ; //default 语句 } printf ("\n\n请按任意键继续 !\n"); getch(); system("cls"); }while(1); return 0 ; }

caffe生成解决方案时出错

编译环境:win10 vs2017 15.5.6 boost_1_70_0 主要报错: Unknown compiler version - please run the configure tests and report the results 再次点生成解决方案时的主要报错: for each 语句不能在“std::array *”类型的变量上操作 ; “std::array”: 模板 参数太少 ; 无法打开文件“libboost_date_time-vc140-mt-gd-1_59.lib” 等等; 因为只能一条条复制,所以如有需要,可提供详细错误; 下面是重新生成解决方案的具体报错,有大佬来救救我吗,感激不尽!需要更详细信息可以直说。 报错:1>------ 已启动全部重新生成: 项目: libcaffe, 配置: Debug x64 ------ 1>ProtoCompile.cmd : Create proto temp directory "C:\Users\Kay Chow\Documents\caffe-master\windows\..\src\caffe\proto\temp" 1>ProtoCompile.cmd : Generating "C:\Users\Kay Chow\Documents\caffe-master\windows\..\src\caffe\proto\temp\caffe.pb.h" and "C:\Users\Kay Chow\Documents\caffe-master\windows\..\src\caffe\proto\temp\caffe.pb.cc" 1>ProtoCompile.cmd : Create proto include directory 1>子目录或文件 C:\Users\Kay Chow\Documents\caffe-master\windows\..\include\caffe\proto 已经存在。 1>ProtoCompile.cmd : Compare newly compiled caffe.pb.h with existing one 1>blob.cpp 1>common.cpp 1>data_reader.cpp 1>data_transformer.cpp 1>internal_thread.cpp 1>layer.cpp 1>absval_layer.cpp 1>accuracy_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>argmax_layer.cpp 1>base_conv_layer.cpp 1>base_data_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>batch_norm_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>batch_reindex_layer.cpp 1>bias_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>bnll_layer.cpp 1>box_annotator_ohem_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>concat_layer.cpp 1>contrastive_loss_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>conv_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>crop_layer.cpp 1>cudnn_conv_layer.cpp 1>cudnn_lcn_layer.cpp 1>cudnn_lrn_layer.cpp 1>cudnn_pooling_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>cudnn_relu_layer.cpp 1>cudnn_sigmoid_layer.cpp 1>cudnn_softmax_layer.cpp 1>cudnn_tanh_layer.cpp 1>data_layer.cpp 1>deconv_layer.cpp 1>dropout_layer.cpp 1>dummy_data_layer.cpp 1>eltwise_layer.cpp 1>elu_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>embed_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>euclidean_loss_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>exp_layer.cpp 1>filter_layer.cpp 1>flatten_layer.cpp 1>hdf5_data_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>hdf5_output_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>hinge_loss_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>im2col_layer.cpp 1>image_data_layer.cpp 1>infogain_loss_layer.cpp 1>inner_product_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>input_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>log_layer.cpp 1>loss_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>lrn_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>memory_data_layer.cpp 1>multinomial_logistic_loss_layer.cpp 1>mvn_layer.cpp 1>neuron_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>parameter_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>pooling_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>power_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>prelu_layer.cpp 1>psroi_pooling_layer.cpp 1>reduction_layer.cpp 1>relu_layer.cpp 1>reshape_layer.cpp 1>scale_layer.cpp 1>sigmoid_cross_entropy_loss_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>sigmoid_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>silence_layer.cpp 1>slice_layer.cpp 1>smooth_l1_loss_layer.cpp 1>smooth_L1_loss_ohem_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>softmax_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>softmax_loss_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>softmax_loss_ohem_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>split_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>spp_layer.cpp 1>tanh_layer.cpp 1>threshold_layer.cpp 1>tile_layer.cpp 1>window_data_layer.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>layer_factory.cpp 1>net.cpp 1>parallel.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>caffe.pb.cc 1>solver.cpp 1>adadelta_solver.cpp 1>adagrad_solver.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>adam_solver.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>nesterov_solver.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>rmsprop_solver.cpp 1>sgd_solver.cpp 1>syncedmem.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>benchmark.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>blocking_queue.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>cudnn.cpp 1>db.cpp 1>db_leveldb.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>db_lmdb.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>hdf5.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>im2col.cpp 1>insert_splits.cpp 1>io.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>math_functions.cpp 1>signal_handler.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>upgrade_proto.cpp 1>Unknown compiler version - please run the configure tests and report the results 1>Unknown compiler version - please run the configure tests and report the results 1>libcaffe.vcxproj -> C:\Users\Kay Chow\Documents\caffe-master\windows\..\Build\x64\Debug\libcaffe.lib 1>BinplaceCudaDependencies : CPU only build, don't copy cuda dependencies. 2>------ 已启动全部重新生成: 项目: caffe, 配置: Debug x64 ------ 3>------ 已启动全部重新生成: 项目: caffe.managed, 配置: Debug x64 ------ 4>------ 已启动全部重新生成: 项目: convert_cifar_data, 配置: Debug x64 ------ 5>------ 已启动全部重新生成: 项目: classification, 配置: Debug x64 ------ 6>------ 已启动全部重新生成: 项目: convert_mnist_data, 配置: Debug x64 ------ 7>------ 已启动全部重新生成: 项目: convert_mnist_siamese_data, 配置: Debug x64 ------ 8>------ 已启动全部重新生成: 项目: upgrade_net_proto_binary, 配置: Debug x64 ------ 9>------ 已启动全部重新生成: 项目: upgrade_net_proto_text, 配置: Debug x64 ------ 2>caffe.cpp 9>upgrade_net_proto_text.cpp 2>Unknown compiler version - please run the configure tests and report the results 4>convert_cifar_data.cpp 3>Stdafx.cpp 9>Unknown compiler version - please run the configure tests and report the results 5>classification.cpp 6>convert_mnist_data.cpp 7>convert_mnist_siamese_data.cpp 4>Unknown compiler version - please run the configure tests and report the results 5>Unknown compiler version - please run the configure tests and report the results 8>upgrade_net_proto_binary.cpp 6>Unknown compiler version - please run the configure tests and report the results 8>Unknown compiler version - please run the configure tests and report the results 7>Unknown compiler version - please run the configure tests and report the results 3>AssemblyInfo.cpp 3>caffelib.cpp 3>caffelib.cpp(61): error C2976: “std::array”: 模板 参数太少 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(62): error C3699: “^”: 不能在类型“std::array”上使用此间接寻址 3>caffelib.cpp(62): note: 编译器将“^”替换为“*”以继续进行分析 3>caffelib.cpp(68): error C2976: “std::array”: 模板 参数太少 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(68): error C3699: “^”: 不能在类型“std::array”上使用此间接寻址 3>caffelib.cpp(68): note: 编译器将“^”替换为“*”以继续进行分析 3>caffelib.cpp(69): error C3699: “^”: 不能在类型“std::array”上使用此间接寻址 3>caffelib.cpp(69): note: 编译器将“^”替换为“*”以继续进行分析 3>caffelib.cpp(127): error C2976: “std::array”: 模板 参数太少 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(128): error C3699: “^”: 不能在类型“std::array”上使用此间接寻址 3>caffelib.cpp(128): note: 编译器将“^”替换为“*”以继续进行分析 3>caffelib.cpp(136): error C2976: “std::array”: 模板 参数太少 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(136): error C3699: “^”: 不能在类型“std::array”上使用此间接寻址 3>caffelib.cpp(136): note: 编译器将“^”替换为“*”以继续进行分析 3>caffelib.cpp(137): error C3699: “^”: 不能在类型“std::array”上使用此间接寻址 3>caffelib.cpp(137): note: 编译器将“^”替换为“*”以继续进行分析 3>caffelib.cpp(64): error C2976: “std::array”: 模板 参数太少 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(64): error C2027: 使用了未定义类型“std::array” 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(64): error C3536: “outputs”: 初始化之前无法使用 3>caffelib.cpp(64): error C2109: 下标要求数组或指针类型 3>caffelib.cpp(65): error C2440: “return”: 无法从“int”转换为“std::array *” 3>caffelib.cpp(65): note: 从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换 3>caffelib.cpp(71): error C3285: for each 语句不能在“std::array *”类型的变量上操作 3>caffelib.cpp(72): error C2065: “name”: 未声明的标识符 3>caffelib.cpp(74): error C2976: “std::array”: 模板 参数太少 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(74): error C3699: “^”: 不能在类型“std::array”上使用此间接寻址 3>caffelib.cpp(74): note: 编译器将“^”替换为“*”以继续进行分析 3>caffelib.cpp(74): error C2027: 使用了未定义类型“std::array” 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(78): error C2976: “std::array”: 模板 参数太少 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(78): error C2027: 使用了未定义类型“std::array” 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(78): error C3536: “values”: 初始化之前无法使用 3>caffelib.cpp(78): error C2109: 下标要求数组或指针类型 3>caffelib.cpp(79): error C3536: “outputs”: 初始化之前无法使用 3>caffelib.cpp(79): error C2109: 下标要求数组或指针类型 3>caffelib.cpp(81): error C2440: “return”: 无法从“int”转换为“std::array *” 3>caffelib.cpp(81): note: 从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换 3>caffelib.cpp(132): error C2976: “std::array”: 模板 参数太少 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(132): error C2027: 使用了未定义类型“std::array” 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(132): error C3536: “outputs”: 初始化之前无法使用 3>caffelib.cpp(132): error C2109: 下标要求数组或指针类型 3>caffelib.cpp(133): error C2440: “return”: 无法从“int”转换为“std::array *” 3>caffelib.cpp(133): note: 从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换 3>caffelib.cpp(141): error C3285: for each 语句不能在“std::array *”类型的变量上操作 3>caffelib.cpp(142): error C2065: “name”: 未声明的标识符 3>caffelib.cpp(144): error C2976: “std::array”: 模板 参数太少 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(144): error C3699: “^”: 不能在类型“std::array”上使用此间接寻址 3>caffelib.cpp(144): note: 编译器将“^”替换为“*”以继续进行分析 3>caffelib.cpp(144): error C2027: 使用了未定义类型“std::array” 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(148): error C2976: “std::array”: 模板 参数太少 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(148): error C2027: 使用了未定义类型“std::array” 3>D:\VS2017\VC\Tools\MSVC\14.12.25827\include\utility(474): note: 参见“std::array”的声明 3>caffelib.cpp(148): error C3536: “values”: 初始化之前无法使用 3>caffelib.cpp(148): error C2109: 下标要求数组或指针类型 3>caffelib.cpp(149): error C3536: “outputs”: 初始化之前无法使用 3>caffelib.cpp(149): error C2109: 下标要求数组或指针类型 3>caffelib.cpp(151): error C2440: “return”: 无法从“int”转换为“std::array *” 3>caffelib.cpp(151): note: 从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换 3>已完成生成项目“caffe.managed.vcxproj”的操作 - 失败。 4>LINK : fatal error LNK1104: 无法打开文件“libboost_thread-vc140-mt-gd-1_59.lib” 10>------ 已启动全部重新生成: 项目: upgrade_solver_proto_text, 配置: Debug x64 ------ 4>已完成生成项目“convert_cifar_data.vcxproj”的操作 - 失败。 6>LINK : fatal error LNK1104: 无法打开文件“libboost_thread-vc140-mt-gd-1_59.lib” 6>已完成生成项目“convert_mnist_data.vcxproj”的操作 - 失败。 10>upgrade_solver_proto_text.cpp 7>LINK : fatal error LNK1104: 无法打开文件“libboost_thread-vc140-mt-gd-1_59.lib” 7>已完成生成项目“convert_mnist_siamese_data.vcxproj”的操作 - 失败。 10>Unknown compiler version - please run the configure tests and report the results 9>LINK : fatal error LNK1104: 无法打开文件“libboost_date_time-vc140-mt-gd-1_59.lib” 9>已完成生成项目“upgrade_net_proto_text.vcxproj”的操作 - 失败。 8>LINK : fatal error LNK1104: 无法打开文件“libboost_date_time-vc140-mt-gd-1_59.lib” 8>已完成生成项目“upgrade_net_proto_binary.vcxproj”的操作 - 失败。 5>LINK : fatal error LNK1104: 无法打开文件“libboost_date_time-vc140-mt-gd-1_59.lib” 5>已完成生成项目“classification.vcxproj”的操作 - 失败。 2>LINK : fatal error LNK1104: 无法打开文件“libboost_date_time-vc140-mt-gd-1_59.lib” 2>已完成生成项目“caffe.vcxproj”的操作 - 失败。 11>------ 已启动全部重新生成: 项目: compute_image_mean, 配置: Debug x64 ------ 12>------ 已启动全部重新生成: 项目: convert_imageset, 配置: Debug x64 ------ 13>------ 已启动全部重新生成: 项目: extract_features, 配置: Debug x64 ------ 14>------ 已启动全部重新生成: 项目: test_all, 配置: Debug x64 ------ 15>------ 已启动全部重新生成: 项目: pycaffe, 配置: Debug x64 ------ 16>------ 已启动全部重新生成: 项目: matcaffe, 配置: Debug x64 ------ 15>Skipping project pycaffe, Python support is not enabled in CommonSettings.props. 16>Skipping project matcaffe, Matlab support is not enabled in CommonSettings.props. 12>convert_imageset.cpp 11>compute_image_mean.cpp 13>extract_features.cpp 14>test_accuracy_layer.cpp 14>test_argmax_layer.cpp 14>test_batch_norm_layer.cpp 14>test_batch_reindex_layer.cpp 14>test_benchmark.cpp 14>test_bias_layer.cpp 14>test_blob.cpp 14>test_caffe_main.cpp 14>Unknown compiler version - please run the configure tests and report the results 13>Unknown compiler version - please run the configure tests and report the results 12>Unknown compiler version - please run the configure tests and report the results 11>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 10>LINK : fatal error LNK1104: 无法打开文件“libboost_date_time-vc140-mt-gd-1_59.lib” 10>已完成生成项目“upgrade_solver_proto_text.vcxproj”的操作 - 失败。 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 11>LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc140-mt-gd-1_59.lib” 11>已完成生成项目“compute_image_mean.vcxproj”的操作 - 失败。 12>LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc140-mt-gd-1_59.lib” 12>已完成生成项目“convert_imageset.vcxproj”的操作 - 失败。 13>LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc140-mt-gd-1_59.lib” 13>已完成生成项目“extract_features.vcxproj”的操作 - 失败。 14>test_common.cpp 14>test_concat_layer.cpp 14>test_contrastive_loss_layer.cpp 14>test_convolution_layer.cpp 14>test_crop_layer.cpp 14>test_data_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>test_data_transformer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_db.cpp 14>test_deconvolution_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_dummy_data_layer.cpp 14>test_eltwise_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_embed_layer.cpp 14>test_euclidean_loss_layer.cpp 14>test_filler.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>test_filter_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_flatten_layer.cpp 14>test_gradient_based_solver.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_hdf5data_layer.cpp 14>test_hdf5_output_layer.cpp 14>test_hinge_loss_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_im2col_layer.cpp 14>test_image_data_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>test_infogain_loss_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_inner_product_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_internal_thread.cpp 14>test_io.cpp 14>test_layer_factory.cpp 14>test_lrn_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_math_functions.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>test_maxpool_dropout_layers.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_memory_data_layer.cpp 14>test_multinomial_logistic_loss_layer.cpp 14>test_mvn_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>test_net.cpp 14>test_neuron_layer.cpp 14>test_platform.cpp 14>test_pooling_layer.cpp 14>test_power_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>test_protobuf.cpp 14>test_random_number_generator.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_reduction_layer.cpp 14>c:\users\kay chow\documents\caffe-master\src\caffe\test\test_net.cpp(1010): error C2220: 警告被视为错误 - 没有生成“object”文件 14>c:\users\kay chow\documents\caffe-master\src\caffe\test\test_net.cpp(992): note: 编译 类 模板 成员函数 "void caffe::NetTest_TestLossWeightMidNet_Test<T>::TestBody(void)" 时 14> with 14> [ 14> T=Type 14> ] 14>c:\users\kay chow\documents\caffe-master\src\gtest\gtest.h(7341): note: 参见对正在编译的 类 模板 实例化 "caffe::NetTest_TestLossWeightMidNet_Test<T>" 的引用 14> with 14> [ 14> T=Type 14> ] (编译源文件 ..\..\src\caffe\test\test_net.cpp) 14>c:\users\kay chow\documents\caffe-master\src\gtest\gtest.h(7327): note: 编译 类 模板 成员函数 "bool testing::internal::TypeParameterizedTest<caffe::NetTest,testing::internal::TemplateSel<caffe::NetTest_TestLossWeightMidNet_Test>,caffe::gtest_type_params_NetTest_>::Register(const char *,const char *,const char *,int)" 时 (编译源文件 ..\..\src\caffe\test\test_net.cpp) 14>c:\users\kay chow\documents\caffe-master\src\caffe\test\test_net.cpp(992): note: 参见对正在编译的函数 模板 实例化“bool testing::internal::TypeParameterizedTest<caffe::NetTest,testing::internal::TemplateSel<caffe::NetTest_TestLossWeightMidNet_Test>,caffe::gtest_type_params_NetTest_>::Register(const char *,const char *,const char *,int)”的引用 14>c:\users\kay chow\documents\caffe-master\src\caffe\test\test_net.cpp(992): note: 参见对正在编译的 类 模板 实例化 "testing::internal::TypeParameterizedTest<caffe::NetTest,testing::internal::TemplateSel<caffe::NetTest_TestLossWeightMidNet_Test>,caffe::gtest_type_params_NetTest_>" 的引用 14>c:\users\kay chow\documents\caffe-master\src\caffe\test\test_net.cpp(1010): warning C4838: 从“double”转换到“Dtype”需要收缩转换 14>c:\users\kay chow\documents\caffe-master\src\caffe\test\test_net.cpp(961): warning C4838: 从“double”转换到“Dtype”需要收缩转换 14>c:\users\kay chow\documents\caffe-master\src\caffe\test\test_net.cpp(941): note: 编译 类 模板 成员函数 "void caffe::NetTest_TestLossWeight_Test<T>::TestBody(void)" 时 14> with 14> [ 14> T=Type 14> ] 14>c:\users\kay chow\documents\caffe-master\src\gtest\gtest.h(7341): note: 参见对正在编译的 类 模板 实例化 "caffe::NetTest_TestLossWeight_Test<T>" 的引用 14> with 14> [ 14> T=Type 14> ] (编译源文件 ..\..\src\caffe\test\test_net.cpp) 14>c:\users\kay chow\documents\caffe-master\src\gtest\gtest.h(7327): note: 编译 类 模板 成员函数 "bool testing::internal::TypeParameterizedTest<caffe::NetTest,testing::internal::TemplateSel<caffe::NetTest_TestLossWeight_Test>,caffe::gtest_type_params_NetTest_>::Register(const char *,const char *,const char *,int)" 时 (编译源文件 ..\..\src\caffe\test\test_net.cpp) 14>c:\users\kay chow\documents\caffe-master\src\caffe\test\test_net.cpp(941): note: 参见对正在编译的函数 模板 实例化“bool testing::internal::TypeParameterizedTest<caffe::NetTest,testing::internal::TemplateSel<caffe::NetTest_TestLossWeight_Test>,caffe::gtest_type_params_NetTest_>::Register(const char *,const char *,const char *,int)”的引用 14>c:\users\kay chow\documents\caffe-master\src\caffe\test\test_net.cpp(941): note: 参见对正在编译的 类 模板 实例化 "testing::internal::TypeParameterizedTest<caffe::NetTest,testing::internal::TemplateSel<caffe::NetTest_TestLossWeight_Test>,caffe::gtest_type_params_NetTest_>" 的引用 14>test_reshape_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>test_scale_layer.cpp 14>test_sigmoid_cross_entropy_loss_layer.cpp 14>test_slice_layer.cpp 14>test_softmax_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>test_softmax_with_loss_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>test_solver.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_solver_factory.cpp 14>test_split_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_spp_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_stochastic_pooling.cpp 14>test_syncedmem.cpp 14>test_tanh_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_threshold_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>Unknown compiler version - please run the configure tests and report the results 14>test_tile_layer.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>test_upgrade_proto.cpp 14>test_util_blas.cpp 14>gtest-all.cpp 14>Unknown compiler version - please run the configure tests and report the results 14>已完成生成项目“test_all.vcxproj”的操作 - 失败。 ========== 全部重新生成: 成功 3 个,失败 13 个,跳过 0 个 ==========

修改程序:信源编解码(c语言)

修改程序:问题1。源文件source文本空间太长汉字太多无法运行2,未按频度要求排序 问题描述: 信源编解码是通信系统的重要组成部分。本实验旨在通过程序设计实现基于哈夫曼编码的信源编解码算法。程序具备以下功能: 对于给定的源文档 SourceDoc.txt, 1) 统计其中所有字符的频度(某字符的频度等于其出现的总次数除以总字符数) , 包括字母(区分大小写) 、标点符号及格式控制符(空格、回车等) 。 2) 按频度统计结果生成哈夫曼编码码表。 3) 基于哈夫曼码表进行编码,生成对应的二进制码流,并输出到文件 Encode.dat。 4) 对二进制码流进行哈夫曼解码,把结果输出到文件 DecodeDoc.txt。 5) 判断DecodeDoc.txt与SourceDoc.txt内容是否一致,以 验证编解码系统的正确性。 要求: 1) 用 C 语言实现。 2) 用子函数实现各功能模块。 3) 输出文件 Statistic.txt,包含的信息有:按频度大小排序的字符表,及各字符出现 的次数、频度及哈夫曼编码。 4) 应至少包含链表、二叉树的数据结构。 5) 不能用冒泡排序算法。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> #define N 10000 int count = 0; //每增加一个新的字符, count增加1, 可表示a中的字符种类数, 也即哈夫曼树叶子点个数 /*定义哈夫曼树结构体*/ typedef struct HuffmanTree{ int weight; int parent; int Lchild; int Rchild; }HuffmanTree[2*N]; /*定义储存字符及其出现次数的结构体*/ typedef struct DifferentCharacter{ char char_date; int num; //相同字符出现的次数 char a_code[100]; //每种字符对应的编码 }difcha[N]; /*在一定范围内选择两个weight最小的结点, 并将两个结点的序号赋给s1, s2*/ void select_two(HuffmanTree ht, int j, int *s1, int *s2) { int i = 1, temp; int min1 = 0, min2 = 0; while( (ht[i].parent != 0) && (i <= j) ) i++; *s1 = i; min1 = ht[i++].weight; while( (ht[i].parent != 0) && (i <= j) ) i++; *s2 = i; min2 = ht[i++].weight; if(min1 > min2){ temp = min1; min1 = min2; min2 = temp; } for(; i <= j; i++){ //遍历parent不为0的结点 if(ht[i].parent != 0) continue; if(ht[i].weight <= min1){ min2 = min1; min1 = ht[i].weight; *s2 = *s1; *s1 = i; } else if( (ht[i].weight < min2) && (ht[i].weight > min1) ) { min2 = ht[i].weight; *s2 = i; } } } /*建哈夫曼树*/ void EstHuffmanTree(HuffmanTree ht, int *w, int n){ int i; int s1 = 0, s2 = 0; for(i = 1; i <= n; i++){ //初始化哈夫曼树, 前n个单元存放叶子点 ht[i].weight = w[i]; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ //后n-1个单元存放非叶子点 ht[i].weight = 0; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ select_two(ht, i-1, &s1, &s2); //创建非叶子点, 建立哈夫曼树, 每次在ht[1]~ht[i-1]范围内选两个最小的weight结点,并将其序号赋给s1, s2 ht[i].weight = ht[s1].weight + ht[s2].weight; ht[i].Lchild = s1; ht[i].Rchild = s2; ht[s1].parent = i; ht[s2].parent = i; } //哈夫曼树建立完毕 } /*求哈弗曼编码*/ void CrtHuffmanCode(HuffmanTree ht, char **hcd, int n){ int start = 0, c = 0, p = 0, i; char *cd = (char*)malloc(n*sizeof(char)); //分配求当前编码的工作空间 cd[n-1] = '\0'; //从左向右存放编码 for(i = 1; i <= n; i++) { start = n-1; //初始化编码起始指针 c = i; p = ht[i].parent; while(p != 0){ start--; if(ht[p].Lchild == c) cd[start] = '0'; //左分支标0 else cd[start] = '1'; //右分支标1 c = p; //向上倒推 p = ht[c].parent; } hcd[i] = (char*)malloc((n-start)*sizeof(char)); strcpy(hcd[i], &cd[start]); } free(cd); } /*自定义错误处理函数*/ void my_err(char *err_string, int line){ printf("Line %d:\n", line); perror(err_string); exit(1); } /*从 buf_read 中统计每个字符出现的次数,将次数作为该字符的权值*/ void Statistics(difcha a, char *buf_read){ int i, j = 0; for(i = 0; i < strlen(buf_read) ; i++){ //对buf_read中的字符遍历 for(j = 0; j < count; j++){ //检查是否是新的字符 if(a[j].char_date == buf_read[i]){ a[j].num++; //若是旧字符, 则num++; break; } } if(j == count){ //若是新字符, 则记录到a中, 且对应的num++ a[count].char_date = buf_read[i]; a[count].num++; count++; //更新count } } } /*从 SourceDoc.txt 读取数据到 buf_read */ void ReadFile(char *pathName, char *buf_read){ int fd_date; int len = 0; if( (fd_date = open(pathName, O_RDWR)) < 0) //以读写方式打开SourceDoc.txt文件 my_err("open SourceDoc.txt", __LINE__); if(lseek(fd_date, 0, SEEK_END) < 0) //获取文件长度,并保持文件读写指针在文件开始处 my_err("lseek", __LINE__); if( (len = lseek(fd_date, 0, SEEK_CUR)) < 0 ) my_err("lseek", __LINE__); if(lseek(fd_date, 0, SEEK_SET) < 0) my_err("lseek", __LINE__); if(read(fd_date, buf_read, len) > len) //从SourceDoc.txt中读取内容 my_err("read SourceDoc.txt", __LINE__); } /*将 buf_code 写入 Encode.dat 中*/ void WriteFile(char *pathName, char *buf_code){ int fd_code; if((fd_code = open(pathName, O_CREAT|O_TRUNC|O_RDWR, S_IRWXU)) < 0) //创建Encode.dat文件 my_err("open Encode.dat", __LINE__); if( write(fd_code, buf_code, strlen(buf_code)) != strlen(buf_code) ) //将 buf_code 写入Encode.dat my_err("write Encode.dat", __LINE__); } /*主函数*/ void main(){ char buf_read[N] = {'\0'}; char buf_code[N] = {'\0'}; char buf_yima[N] = {'\0'}; char *hcd[N]; char temp[50] = {'\0'}; difcha a; int i, j, n, k = 0, m = 0; int w[N] = {0}; HuffmanTree ht; ReadFile("SourceDoc.txt", buf_read); Statistics(a, buf_read); for(i = 0; i < count; i++) w[i+1] = a[i].num; EstHuffmanTree(ht, w, count); //建HuffmanTree CrtHuffmanCode(ht, hcd, count); //对树中字符进行编码 for(i = 1; i <= count; i++) //将每个字符对应的编码存入结构体 a 中 strcpy(a[i-1].a_code, hcd[i]); FILE *fp1; fp1=fopen("Statistic.txt","w"); for(i = 0; i < count; i++) //查看每个字符的权值和对应的编码 fprintf(fp1,"%c %d %s\n", a[i].char_date, a[i].num, a[i].a_code); fclose(fp1); for(i = 0; i < strlen(buf_read) ; i++){ //遍历 buf_read, 给 SourceDoc.txt 中每个字符匹配编码, 存入 buf_code 中 for(j = 0; j < count; j++){ if(buf_read[i] == a[j].char_date){ strcat(buf_code, a[j].a_code); break; } } if(j == count) //匹配异常 printf("Unknown Character: %c\n", buf_read[i]); } WriteFile("Encode.dat", buf_code); //将 buf_code 写入 Encode.dat 中 ReadFile("Encode.dat", buf_read); //从 Encode.dat 中读取全部编码 n = strlen(buf_read); for(i = 0; i < n; i++){ //为 Encode.dat 中的编码匹配字符 temp[k++] = buf_read[i]; for(j = 0; j < count; j++){ if(strcmp(temp, a[j].a_code) == 0){ buf_yima[m++] = a[j].char_date; break; } } if(j < count){ //匹配成功, 对 temp 初始化 for(;k > 0; k--) temp[k] = '\0'; } } FILE *fp2; fp2=fopen("DecodeDoc.txt","w"); fprintf(fp2,"%s", buf_yima); fclose(fp2); }

有关VC++运行SGA程序出错,自动关闭程序的问题。

大家好,在用VC++(绿色版)运行SGA程序的时候,显示出现了“一个不能解决的问题”,即关闭。请大家帮帮忙,让程序能顺利运行~第一次进论坛,谢谢大家啦! 程序如下:(主要是后面的适应度函数) (目标是对工序排列,使工人总的工资成本最低。每道工序时间不同,工人工资也不同) #include <stdio.h> #include<stdlib.h> #include<time.h> #include<math.h> #include<conio.h> #define N 5 #define M 2 //5个工序,2个工人 #define POPSIZE 500 int u[N]={1,2,1,2,1}; //不同工序持续时间 int c[M]={2,5}; //工人每小时工作成本 int T[M]={3,2}; //每个工人参与工序的总次数 int J[M][N]; //记录工人在某个工序参加与否 int a[M][N]={{1,2,3},{3,4,5}}; //每个工人参加的工序集 int popsize ; //种群大小 int maxgeneration; //最大世代数 double pcross = 0.0; //交叉率 double pmutation = 0.0; //变异率 double sumfitness; //种群个体适应值累计 struct individual //定义染色体个体结构体 { int chrom[N]; //定义染色体二进制表达形式 double fitness; //染色体的适应值 }; int generation; //当前执行的世代数 int best_index; //本世代最好的染色体索引序号 struct individual bestindividual; //最佳染色体个体 struct individual currentbest; //当前最好的染色体个体 currentbest int bestgeneration; //当前最好染色体个体产生的代数 struct individual oldpop[POPSIZE];//种群数组 struct individual newpop[POPSIZE];//新种群数组 /* 随机数发生器使用的静态变量 */ static double oldrand[55]; static int jrand; static double rndx2; static int rndcalcflag; //函数声明 void printline(FILE *); void initialoldpop(FILE *ffp); //初始化当代种群 void generatenextpop(FILE *ffp); //产生下一代种群 void evaluateoldpop(); //评价种群 void calculateobjectfitness(); //计算种群适应度 void findbestindividual(); //寻找最好的染色体个体 int select(); //选择操作 //将p中移除掉q中位置在j1,j2之间的元素,其余元素前移,返回剩下元素的数量 int searchanddelete(int *p,int* q,int j1,int j2); void crossover(int *,int *,int *,int *,FILE *ffp); //交叉操作 void mutation(int *); //变异操作 void input(); //输入接口 void outputtextreport(FILE *ffp); //每代输出文字报告 void report(FILE *ffp); //输出最终结果报告 //以下为一些随机数相关函数 void advance_random(); int flip(double);int rnd(int, int); void randomize(); double randomnormaldeviate(); float randomperc();float rndreal(float,float); void warmup_random(float); void main() //主函数 (函数主体开始) { int i; FILE *fp; //指针文件 //打开文本文件 if((fp= fopen("Result.txt","w+"))==NULL) { printf("Can not open file!\n"); } fprintf(fp,"本程序为使用基本SGA求解\n"); generation=0; //初始化generation当前执行的代 input(); //初始化种群大小、交叉率、变异率 randomize(); // 初始化随机数发生器 initialoldpop(fp); //产生初始化种群 evaluateoldpop(); while(generation<maxgeneration) //小于最大世代数,执行循环体 { generation++; generatenextpop(fp); //生成子代种群(A.选择; B.交叉; C.变异) for(i = 0 ; i < popsize ; i++) { oldpop[i]=newpop[i]; } evaluateoldpop(); //评价新生子代种群 outputtextreport(fp); //输出当前子代种群统计报告 } report(fp);//输出最终报告 fclose(fp); //关闭fp指向的文件句柄,防止句柄泄露 printf("计算结果已输出到Result.txt文件中。"); getch(); } void printline(FILE *ffp) { fprintf(ffp,"\n*************************************************************\n"); } void initialoldpop(FILE *ffp) //种群初始化,对种群中每条染色体,生成1-5的不重复序列 { int i,j,p,q,r; int l=0; int a[N]; srand( (unsigned)time( NULL ) ); for (i=0;i<popsize; i++) { for(j=0;j<N;j++) a[j]=j; //对oldpop[i]染色体生成随机序列 p=N; q=0; while(p> 0) { r=rand(); r%=p; oldpop[i].chrom[l]=a[r]; a[r]=a[p-1]; // 把后一个拷贝到刚生成的位置 q++; p--; } } } void generatenextpop(FILE *ffp) //生成下一代 { int mate1,mate2,j=0; do{ //挑选交叉配对 mate1=select(); mate2=select(); crossover(oldpop[mate1].chrom,oldpop[mate2].chrom,newpop[j].chrom,newpop[j+1].chrom,ffp); mutation(newpop[j].chrom); mutation(newpop[j+1].chrom); j=j+2; } while(j<(popsize-1)); } void evaluateoldpop() //评价种群 { calculateobjectfitness(); //计算种群个体的适应度 findbestindividual(); //找到最好和最差的染色体个体 } void calculateobjectfitness() //计算染色体个体适应值 { int i,j,k,l,r,x; int p=0; int temp=0; int X[M]; for(i=0;i<popsize;i++) { oldpop[i].fitness=0.0; for(l=0;l<N;l++) { r=oldpop[i].chrom[l]; temp=u[r]; u[r]=u[l]; u[l]=temp; } for(j=0;j<M;j++) { for(k=0;k<N;k++) for(l=0;l<N;l++) { if(a[j][k]==oldpop[i].chrom[l]) J[j][l]=1; else J[j][l]=0; //记录各个工人在随机情景序列中的参与位置 } while(J[j][p]!=1) { p++; } x=1; X[j]=u[p]; while(x<T[j]) { p++; X[j]+=u[p]; if(J[j][p]==1) x++; } } for(j=0;j<M;j++) oldpop[i].fitness+=X[j]*c[j]; } } void findbestindividual( ) //求最佳个体 { int i; sumfitness=0.0; bestindividual=oldpop[0]; best_index=0; sumfitness+=oldpop[0].fitness; currentbest.fitness=oldpop[0].fitness; for(generation=0;generation<maxgeneration;generation++) for (i=1;i<popsize; i++) { if (oldpop[i].fitness<bestindividual.fitness) //依次比较,找出最佳个体 { bestindividual=oldpop[i]; //(选适应值最小的) best_index=i; } sumfitness+=oldpop[i].fitness; // 存放种群总体适应值 } if(bestindividual.fitness<currentbest.fitness)//第n代最好的,通过比较小于以往最好个体的话,暂时存放在currentbest { currentbest=bestindividual; bestgeneration=generation; } } 谢谢大家~

PL0编译器调用procedure无限循环

如题,自己参照网上的例子做了一个C语言的PL0编译器,能跑通,但是遇到调用procedure的时候,就会一直循环无限调用,查错查了好久,还是没有找到,希望有大神能为我解答一下!谢谢~ 代码如下,有点长。。 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> using namespace std; #define MAXERR 20//最多错误次数 #define AL 12//标识符最大长度 #define NORW 14//保留字个数 #define NUMMAX 14//最大数字位数 #define TXMAX 100//符号表容量 #define AMAX 2048//地址上界 #define CXMAX 200//最多的虚拟机代码数 #define stacksize 500//运行时数据栈元素最多为500个 #define symnum 32 #define fctnum 8 enum symbol //符号 { nul, ident, number, pluss, minuss, times, slash, oddsym, eql, neq, lss, leq, gtr, geq, lparen, rparen, comma, semicolon, period, becomes, beginsym, endsym, ifsym, thensym, elsesym, whilesym, writesym, readsym, dosym, callsym, constsym, varsym, procsym, }; enum object //符号表类型 { constant, variable, procedure, }; enum fct //虚拟机指令 { LIT, OPR, LOD, STO, CAL, INT, JMP, JPC, }; struct instruction //虚拟机代码结构 { enum fct f;//虚拟机指令 int l;//引用层与声明层层次差 int a;//根据f的不同而不同 }; FILE * fin; FILE * fout; FILE * fv;//虚拟机代码 FILE * fo;//源代码 FILE * fr;//代码运行结果 FILE * ft;//符号表 char fname[AL]; char ch;//存放当前字符 int cc, ll;//getch计数器,cc表示ch的位 int cx;//虚拟机代码指针 int num;//当前数字 int err;//错误计数器 char a[AL+1];//临时符号 char id[AL+1];//当前ident char line[81];//行缓冲区 char word[NORW][AL];//保留字 enum symbol sym;//当前符号 enum symbol wsym[NORW];//保留字对应符号值 enum symbol ssym[256];//单字符符号值 struct instruction code[CXMAX];//存放虚拟机代码的数组 char mnemonic[fctnum][5];//虚拟机代码指令名称 bool declbegsys[symnum];//表示声明开始的符号集合 bool statbegsys[symnum];//表示语句开始的符号集合 bool facbegsys[symnum];//表示因子开始的符号集合 struct tablestruct //符号表结构 { char name[AL];//名字 enum object kind;//类型 int val;//数值 int level;//所处层 int addr;//地址 int size;//需要分配的数据区空间 }; struct tablestruct table[TXMAX];//符号表 void init(); int inset(int e, bool* s); int addset(bool* sr, bool* s1, bool* s2, int n); int subset(bool* sr, bool* s1, bool* s2, int n); int mulset(bool* sr, bool* s1, bool* s2, int n); void error(int n); void getsym(); void getch(); void gen(enum fct x, int y, int z); void test(bool* s1, bool* s2, int n); void block(int lev, int tx, bool* fsys); void enter(enum object k, int* ptx, int lev, int* pdx); int position(char* idt, int tx); void constdeclaration(int* ptx, int lev, int* pdx); void vardeclaration(int* ptx, int lev, int* pdx); void listcode(int cx0); void statement(bool* fsys, int* ptx, int lev); void expression(bool* fsys, int* ptx, int lev); void term(bool* fsys, int* ptx, int lev); void factor(bool* fsys, int* ptx, int lev); void condition(bool* fsys, int* ptx, int lev); void interpret(); int base(int l, int* s, int b); void init() { int i; for(i=0; i<255; i++) //单字符符号 { ssym[i] = nul; } ssym['+'] = pluss; ssym['-'] = minuss; ssym['*'] = times; ssym['/'] = slash; ssym['('] = lparen; ssym[')'] = rparen; ssym['='] = eql; ssym[','] = comma; ssym['.'] = period; ssym[';'] = semicolon; //保留字名字 strcpy(&(word[0][0]), "begin"); strcpy(&(word[1][0]), "call"); strcpy(&(word[2][0]), "const"); strcpy(&(word[3][0]), "do"); strcpy(&(word[4][0]), "else"); strcpy(&(word[5][0]), "end"); strcpy(&(word[6][0]), "if"); strcpy(&(word[7][0]), "odd"); strcpy(&(word[8][0]), "procedure"); strcpy(&(word[9][0]), "read"); strcpy(&(word[10][0]), "then"); strcpy(&(word[11][0]), "var"); strcpy(&(word[12][0]), "while"); strcpy(&(word[13][0]), "write"); //保留字符号 wsym[0] = beginsym; wsym[1] = callsym; wsym[2] = constsym; wsym[3] = dosym; wsym[4] = elsesym; wsym[5] = endsym; wsym[6] = ifsym; wsym[7] = oddsym; wsym[8] = procsym; wsym[9] = readsym; wsym[10] = thensym; wsym[11] = varsym; wsym[12] = whilesym; wsym[13] = writesym; //指令名称 strcpy(&(mnemonic[LIT][0]), "LIT"); strcpy(&(mnemonic[OPR][0]), "OPR"); strcpy(&(mnemonic[LOD][0]), "LOD"); strcpy(&(mnemonic[STO][0]), "STO"); strcpy(&(mnemonic[CAL][0]), "CAL"); strcpy(&(mnemonic[INT][0]), "INT"); strcpy(&(mnemonic[JMP][0]), "JMP"); strcpy(&(mnemonic[JPC][0]), "JPC"); //符号集 for(i=0; i<symnum; i++) { declbegsys[i] = false; statbegsys[i] = false; facbegsys[i] = false; } //声明开始符号集 declbegsys[constsym] = true; declbegsys[varsym] = true; declbegsys[procsym] = true; //语句开始符号集 statbegsys[beginsym] = true; statbegsys[callsym] = true; statbegsys[ifsym] = true; statbegsys[whilesym] = true; //因子开始符号集 facbegsys[ident] = true; facbegsys[number] = true; facbegsys[lparen] = true; } /* *用数组实现集合的集合运算 */ int inset(int e, bool* s) { return s[e]; } int addset(bool* sr, bool* s1, bool* s2, int n) { int i; for(i=0; i<n ;i++) { sr[i] = s1[i] || s2[i]; } return 0; } int subset(bool* sr, bool* s1, bool* s2, int n) { int i; for(i=0; i<n; i++) { sr[i] = s1[i] && (!s2[i]); } return 0; } int mulset(bool* sr, bool* s1, bool* s2, int n) { int i; for(i=0; i<n; i++) { sr[i] = s1[i] && s2[i]; } return 0; } //error处理:输出报错位置以及错误编号 void error(int n) { cc--;//出错时当前符号已经读完,cc-1 //printf("错误编号:%d\n",n); cout<<"错误编号:"<<n<<endl; fprintf(fo, "错误编号:%d\n", n); err++; if(err > MAXERR) { exit(1); } } //读取字符 void getch() { if(cc == ll)//判断缓冲区中是否有字符,若无字符,则读入下一行字符到缓冲区中 { if(feof(fin)) { cout<<"程序不完整"<<endl; exit(1); } ll = 0; cc = 0; printf("%d ", cx); fprintf(fo, "%d ", cx); ch = ' '; while(ch != 10)//读取一行字符到缓冲区 { //fscanf(fin,"%c",&ch) if(EOF == fscanf(fin, "%c", &ch)) { line[ll] = 0; break; } printf("%c", ch); //cout<<ch; fprintf(fo, "%c", ch); line[ll] = ch; ll++; } } ch = line[cc]; cc++; } //词法分析 void getsym() { int i, j, k; while(ch==' ' || ch==10 || ch==9)//过滤掉空格、换行符 { getch(); } if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z')) { i = 0; do{ if(i < AL) { a[i] = ch; i++; } getch(); } while((ch>='a' && ch<='z') || (ch>='A' && ch<='Z') || (ch>='0' && ch<='9')); a[i] = 0; strcpy(id, a); /* for(j = 0; j < 13; j++) { if(strcmp(id, word[i]) == 0) break; } */ //改为用二分法查找保留字 j = 0; k = NORW - 1; do { i=(j + k) / 2; if(strcmp(id, word[i])<=0) { k = i - 1; } if(strcmp(id, word[i])>=0) { j = i + 1; } } while(j <= k); if(j - 1 > k)//单词为保留字 { sym = wsym[i]; } else//单词为标识符 { sym = ident; } } else { if(ch>='0' && ch<='9')//单词为数字 { i = 0; num = 0; sym = number; do { num = 10 * num + ch - '0'; i++; getch(); } while(ch>='0' && ch<='9'); //获取数字的值 i--; if(i > NUMMAX)//数字位数太大 { error(30); } } else { if(ch == ':')//检测赋值符号 { getch(); if(ch == '=') { sym = becomes; getch(); } else { sym = nul;//不能识别的符号 } } else { if(ch == '<')//检测小于或小于等于符号以及不等号 { getch(); if(ch == '=') { sym = leq; getch(); } else if(ch=='>')//检测不等号 { sym = neq;//构成不等号<> getch(); } else { sym = lss; } } else { if(ch == '>')//检测大于或大于等于符号 { getch(); if(ch == '=') { sym = geq; getch(); } else { sym = gtr; } } else { sym = ssym[ch];//当符号不满足上述条件时,全部按照单字符号处理 if(sym != period) { getch(); } } } } } } } //生成P-code即虚拟机代码 void gen(enum fct x, int y, int z ) { if (cx >= CXMAX) { cout<<"虚拟机代码长度过长!"<<endl; exit(1); } if ( z >= AMAX) { cout<<"地址偏移越界!"<<endl; exit(1); } code[cx].f = x; code[cx].l = y; code[cx].a = z; cx++; } //测速当前符号单词是否合法 void test(bool* s1, bool* s2, int n) { if(!inset(sym, s1)) { error(n);//当检测不通过时,不停获取符号,直到它属于S1或S2 while((!inset(sym, s1)) && (!inset(sym, s2))) { getsym(); } } } //分程序分析处理 void block(int lev, int tx, bool* fsys) { int i; int dx;//名字分配到的相对地址 int tx0;//保留初始tx int cx0;//保留初始cx bool nxtlev[symnum]; dx = 3;//分别存放SL,DL和返回地址 tx0 = tx;//本层标识符初始位置 table[tx].addr = cx;//当前层代码开始位置 gen(JMP, 0, 0);//生成跳转指令 do{ if(sym == constsym)//常量声明符号,处理常量声明 { getsym(); do{ constdeclaration(&tx, lev, &dx); while(sym == comma)//逗号,继续读取 { getsym(); constdeclaration(&tx, lev, &dx); } if(sym == semicolon)//分号,结束读取 { getsym(); } else { error(5);//漏掉逗号或者分号 } }while(sym == ident); } if(sym == varsym)//变量声名符号,处理变量声名 { getsym(); do{ vardeclaration(&tx, lev, &dx); while(sym == comma)//逗号,继续读取 { getsym(); vardeclaration(&tx, lev, &dx); } if(sym == semicolon)//分号,结束读取 { getsym(); } else { error(5);//漏掉逗号或者分号 } }while(sym == ident); } while(sym == procsym)//过程声名符号,处理过程声名 { getsym(); if(sym == ident) { enter(procedure, &tx, lev, &dx);//过程名字 getsym(); } else { error(4);//procedure后应为标识符 } if(sym == semicolon)//分号,结束读取 { getsym(); } else { error(5);//漏掉分号 } memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[semicolon]=true; block(lev+1, tx, nxtlev);//递归 if(sym == semicolon) { getsym(); memcpy(nxtlev, statbegsys, sizeof(bool)* symnum); nxtlev[ident]=true; nxtlev[procsym]=true; test(nxtlev, fsys, 6); } else { error(5);//漏掉分号 } } memcpy(nxtlev, statbegsys, sizeof(bool)*symnum); nxtlev[ident]=true; //nxtlev[period]=true; test(nxtlev, declbegsys, 7); } while(inset(sym, declbegsys));//直到没有声明符号 code[table[tx0].addr].a = cx;//开始生成当前过程代码 table[tx0].addr = cx;//当前过程代码地址 table[tx0].size = dx;//dx为当前过程数据的size cx0 = cx; gen(INT, 0, dx);//生成分配内存代码 //输出符号表 for(i = 1; i <= tx; i++) { switch(table[i].kind) { case constant: printf("%d const %s", i, table[i].name); printf("val=%d\n", table[i].val); fprintf(ft, "%d const %s", i, table[i].name); fprintf(ft, "val=%d\n", table[i].val); break; case variable: printf("%d var %s", i, table[i].name); printf("lev=%d addr=%d\n", table[i].level, table[i].addr); fprintf(ft, "%d var %s", i, table[i].name); fprintf(ft, "lev=%d addr=%d\n", table[i].level, table[i].addr); break; case procedure: printf("%d proc %s", i, table[i].name); printf("lev=%d addr=%d size=%d\n", table[i].level,table[i].addr, table[i].size); fprintf(ft, "%d proc %s", i, table[i].name); fprintf(ft, "lev=%d adr=%d size=%d \n", table[i].level,table[i].addr, table[i].size); break; } } printf("\n"); fprintf(ft, "\n"); //语句后跟分号或end memcpy(nxtlev, fsys, sizeof(bool)* symnum);//每个后跟符号集和都包含上层后跟符号集和,以便补救 nxtlev[semicolon] = true; nxtlev[endsym] = true; statement(nxtlev, &tx, lev); gen(OPR, 0, 0); //每个过程出口都要使用的释放数据段命令 memset(nxtlev, 0, sizeof(bool)* symnum); //分程序没有补救集合 test(fsys, nxtlev, 8);//检测后跟符号正确性 listcode(cx0);//输出代码 } //登录符号表 void enter (enum object k, int *ptx, int lev, int *pdx) { (*ptx)++; strcpy(table[(*ptx)].name, id);//符号表记录标识符的名字 table[(*ptx)].kind = k; switch(k) { case constant://常量 if (num > AMAX) { error(31);//过界报错 num = 0; } table[(*ptx)].val = num;//记录常数值 break; case variable://变量 table[(*ptx)].level = lev; table[(*ptx)].addr = (*pdx); (*pdx)++; break; case procedure://过程 table[(*ptx)].level = lev; break; } } //查找标识符在符号表的位置 int position(char* idt, int tx) { int i; strcpy(table[0].name, idt); i = tx; while(strcmp(table[i].name, idt) != 0) { i--; } return i; } //常量定义处理 void constdeclaration(int* ptx, int lev,int* pdx) { if(sym == ident) { getsym(); if((sym == eql) || (sym == becomes)) { if(sym == becomes) { error(1);//应该是=而不是:= } getsym(); if(sym == number) { enter(constant, ptx, lev, pdx);//填写符号表 getsym(); } else { error(2);//=后应为数 } } else { error(3);//标识符后应为= } } else { error(4);//const后应为标识符 } } //变量声明处理 void vardeclaration(int* ptx ,int lev, int* pdx) { if(sym == ident) { enter(variable, ptx, lev, pdx);//填写符号表 getsym(); } else { error(4);//var后应为标识符 } } //列出P-code指令清单 void listcode(int cx0) { int i; printf("\n"); for(i=cx0; i<cx; i++) { printf("%d %s %d %d\n", i, mnemonic[code[i].f], code[i].l,code[i].a); fprintf(fv,"%d %s %d %d\n", i, mnemonic[code[i].f], code[i].l, code[i].a); } } //语句部分分析处理 void statement(bool* fsys, int * ptx, int lev) { int i, cx1, cx2; bool nxtlev[symnum]; if(sym == ident)//按照赋值语句处理 { i = position(id, *ptx);//查找标识符在符号表中的位置 if(i == 0) { error(11);//标识符未说明 } else { if((table[i].kind != variable)) { error(12);//不可向常量或过程赋值 i = 0; } else { getsym(); if(sym == becomes) { getsym(); memcpy(nxtlev, fsys, sizeof(bool)* symnum); expression(nxtlev, ptx, lev); if(i != 0) { gen(STO, lev-table[i].level, table[i].addr); } } else { error(13);//应为赋值运算符:= } } } } else { if(sym == readsym)//按照read语句处理 { getsym(); if(sym != lparen) { error(40);//应为左括号 } else { do{ getsym(); if(sym == ident) { i = position(id, *ptx);//查找要读的变量 } else { i = 0; } if(i == 0) { error(35);//read括号中标识符未声明 } else { gen(OPR, 0, 15);//生成输入指令 gen(STO, lev-table[i]. level, table[i].addr);//将栈顶内容存到变量中 } getsym(); }while(sym == comma);//读多个变量 } if(sym!=rparen) { error(33);//应为右括号 while(!inset(sym, fsys))//出错补救,直到收到上层函数的后跟符号 { getsym(); } } else { getsym(); } } else { if(sym==writesym)//按照write语句处理 { getsym(); if(sym != lparen) { error(40);//应为左括号 } else { do{ getsym(); memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[rparen] = true; nxtlev[comma] = true;//write后符号为)或, expression(nxtlev, ptx, lev);//调用表达式处理 gen(OPR, 0, 13);//生成输出指令,输出栈顶的值 gen(OPR, 0, 14);//换行 }while(sym == comma);//输出多个 if(sym != rparen) { error(33);//应为右括号 } else { getsym(); } } } else { if(sym == callsym)//按照call语句处理 { getsym(); if(sym != ident) { error(14);//call后应为标识符 } else { i=position(id, *ptx); if(i == 0) { error(11); //过程未声明 } else { if(table[i].kind == procedure) { gen(CAL, lev-table[i].level, table[i].addr);//生成call指令 } else { error(15);//不可调用常量或变量 } } getsym(); } } else { if(sym == ifsym)//按照if语句处理 { getsym(); memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[thensym] = true; nxtlev[dosym] = true;//if后符号为then或do condition(nxtlev, ptx, lev);//调用条件处理 if(sym == thensym) { getsym(); } else { error(16);//应为then } cx1 = cx;//当前指令地址 gen(JPC, 0, 0);//生成条件跳转指令 statement(fsys, ptx, lev);//处理then下面的语句 if(sym==elsesym)//处理else语句 { getsym(); cx2 = cx; code[cx1].a=cx+1;//cx+1为then语句执行后的else语句的位置 gen(JMP, 0, 0); statement(fsys, ptx, lev); code[cx2].a = cx;//cx为else后语句执行完的位置 } else { code[cx1].a = cx;//cx为then后面语句执行 完的位置,它正是前面未定的跳转地址*/ } } else { if(sym==beginsym)//按照复合语句处理 { getsym(); memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[semicolon]=true; nxtlev[endsym]=true;//begin后符号为:或end statement(nxtlev, ptx, lev);//处理begin和end之间的语句 while((inset(sym, statbegsys)) || (sym == semicolon)) { if(sym = semicolon) { getsym(); } else { error(10);//语句之间没有分号 } statement(nxtlev, ptx, lev); }//循环处理 if(sym == endsym) { getsym(); } else { error(17);//应为分号或end } } else { if(sym == whilesym)//按照while语句处理 { cx1 = cx;//判断条件操作位置 getsym(); memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[dosym]=true;//while后符号为do condition(nxtlev, ptx, lev);//调用条件处理 cx2 = cx;//循环体的结束的下一个位置 gen(JPC, 0, 0);//生成条件跳转 if(sym == dosym) { getsym(); } else { error(18);//应为do } statement(fsys, ptx, lev); gen(JMP, 0, cx1);//重新判断条件 code[cx2].a = cx; } } } } } } } memset(nxtlev, 0, sizeof(bool)* symnum);//语句结束无补救集合 test(fsys, nxtlev, 19);//检测语句结束的正确性 } //表达式分析处理 void expression(bool* fsys, int* ptx, int lev) { enum symbol sign;//正负号 bool nxtlev[symnum]; if((sym == pluss) || (sym == minuss))//开头的正负号 { sign = sym; getsym(); memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[pluss] = true; nxtlev[minuss] = true; term(nxtlev, ptx, lev);//对项进行处理 if(sign == minuss) { gen(OPR, 0, 1);//如果开头为负号,生成取负指令 } } else { memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[pluss] = true; nxtlev[minuss] = true; term(nxtlev, ptx, lev);//对项进行处理 } while((sym == pluss) || (sym == minuss)) { sign = sym; getsym(); memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[pluss] = true; nxtlev[minuss] = true; term(nxtlev, ptx, lev);//对项进行处理 if(sign == pluss) { gen(OPR, 0, 2);//加法 } else { gen(OPR, 0, 3);//减法 } } } //项分析处理 void term(bool*fsys, int *ptx, int lev) { enum symbol sign;//乘除法符号 bool nxtlev[symnum]; memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[times] = true; nxtlev[slash] = true; factor(nxtlev, ptx, lev);//对因子进行处理 while((sym == times) || (sym == slash)) { sign = sym; getsym(); factor(nxtlev, ptx, lev); if(sign == times) { gen(OPR, 0, 4);//乘法 } else { gen(OPR, 0, 5);//除法 } } } //因子分析处理 void factor(bool* fsys, int* ptx, int lev) { int i; bool nxtlev[symnum]; test(facbegsys, fsys, 24);//检测因子开始符号 while(inset(sym, facbegsys))//循环处理因子 { if(sym == ident)//因子为常量或者变量 { i = position(id, *ptx);//查找标识符位置 if(i == 0) { error(11);//未声明标识符 } else { switch(table[i].kind)//不同形式标识符 { case constant: gen(LIT, 0, table[i].val);//常量入栈 break; case variable: gen(LOD, lev-table[i].level, table[i].addr);//变量入栈 break; case procedure: error(21);//表达式内不能有过程标识符 break; } } getsym(); } else { if(sym == number) //因子为数字的时候 { if(num > AMAX) { error(31);//过界报错 num = 0; } gen(LIT, 0, num); getsym(); } else { if(sym == lparen)//因子为表达式的时候 { getsym(); memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[rparen] = true; expression(nxtlev, ptx, lev); if(sym == rparen) { getsym(); } else { error(22);//没有右括号 } } //test(fsys, facbegsys, 23);//一个因子处理完毕,遇到的单词应在fsys集合中 ,如果不是,报错并找到下一个因子的开始,使语法分析继续运行 } } memset(nxtlev, 0, sizeof(bool) * symnum); nxtlev[lparen] = true; test(fsys, facbegsys, 23);//一个因子处理完毕,遇到的单词应在fsys集合中 ,如果不是,报错并找到下一个因子的开始,使语法分析继续运行 } } //条件分析处理 void condition(bool* fsys, int* ptx, int lev) { enum symbol sign; bool nxtlev[symnum]; if(sym == oddsym) { getsym(); expression(fsys, ptx, lev); gen(OPR, 0, 6); } else//处理分析逻辑表达式 { memcpy(nxtlev, fsys, sizeof(bool)* symnum); nxtlev[eql]=true; nxtlev[neq]=true; nxtlev[lss]=true; nxtlev[leq]=true; nxtlev[gtr]=true; nxtlev[geq]=true; expression(nxtlev, ptx, lev); if((sym!=eql)&&(sym!=neq)&&(sym!=lss)&&(sym!=leq)&&(sym!=gtr)&&(sym!=geq)) { error(20);//应为关系运算符 } else { sign = sym; getsym(); expression(fsys, ptx, lev); switch(sign) { case eql: gen(OPR, 0, 7); break; case neq: gen(OPR, 0, 8); break; case lss: gen(OPR, 0, 9); break; case gtr: gen(OPR, 0, 10); break; case leq: gen(OPR, 0, 11); break; case geq: gen(OPR, 0, 12); break; } } } } //P-code解释执行程序 void interpret() { int p = 0;//指令指针 int b = 1;//指令基址 int t = 0;//栈顶指针 struct instruction i;//存放当前指令 int s[stacksize];//栈 cout<<"执行PL0:"<<endl; fprintf(fr, "执行PL0:\n"); s[0] = 0; s[1] = 0; s[2] = 0; s[3] = 0; do{ i = code[p];//读当前指令 p++; switch(i.f) { case LIT://将a的值取到栈顶 t++; s[t]=i.a; break; case OPR://数字逻辑运算 switch(i.a) { case 0://函数调用后返回 t = b - 1; p = s[t+3]; b = s[t+2]; break; case 1://取反 s[t] = -s[t]; break; case 2://栈顶两个元素相加 t--; s[t] = s[t] + s[t+1]; break; case 3://栈顶两个元素相减 t--; s[t] = s[t] - s[t+1]; break; case 4://栈顶两个元素相乘 t--; s[t] = s[t] * s[t+1]; break; case 5://栈顶两个元素相除 t--; s[t] = s[t] / s[t+1]; break; case 6://栈顶元素奇偶判断 s[t] = s[t] % 2; break; case 7://栈顶两个元素是否相等 t--; s[t] = (s[t] == s[t+1]); break; case 8://栈顶两个元素是否不等 t--; s[t] = (s[t] != s[t+1]); break; case 9://小于 t--; s[t] = (s[t] < s[t+1]); break; case 10://大于 t--; s[t] = (s[t] > s[t+1]); break; case 11://小于等于 t--; s[t] = (s[t] <= s[t+1]); break; case 12://大于等于 t--; s[t] = (s[t] >= s[t+1]); break; case 13://输出栈顶值 printf("%d", s[t]); fprintf(fr, "%d", s[t]); t--; break; case 14://输出换行符 printf("\n"); fprintf(fr, "\n"); break; case 15://读入 t++; printf("输入:"); fprintf(fr, "输入:"); scanf("%d", &(s[t])); fprintf(fr, "%d\n", s[t]); break; } break; case LOD://取相对当前过程的数据基地址为a的内存的值到栈顶 t++; s[t] = s[base(i.l, s, b) + i.a]; break; case STO://栈顶的值存到相对当前过程的数据基地址为a的内存 s[base(i.l, s, b) + i.a] = s[t]; t--; break; case CAL://调用子程序 s[t+1] = base(i.l, s,b); s[t+2] = b; s[t+3] = p; b = t + 1; p = i.a; break; case INT://分配内存 t += i.a; break; case JMP://直接跳转 p=i.a; break; case JPC://条件跳转 if(s[t] == 0) { p = i.a; } t--; break; } }while(p != 0); printf("PL0结束\n"); fprintf(fr, "PL0结束\n"); } //通过静态链求出数据区基地址 int base(int l,int* s, int b) { int b1; b1 = b; while(l > 0) { b1 = s[b1]; l--; } return b1; } int main() { bool nxtlev[symnum]; cout<<"*****PL0编译器*****"<<endl; cout<<"输出文件中,fv为虚拟机代码,fo为源代码,fr为运行结果,ft为符号表"<<endl; cout<<"请输入pl0文件:"<<endl; scanf("%s", fname); fin = fopen(fname, "r"); if(fin == NULL) { cout<<"无法打开文件!" <<endl; exit(1); } if(fgetc(fin) == EOF) { cout<<"文件为空!" <<endl; exit(1); } rewind(fin); fo = fopen("fo.txt", "w"); init(); err = 0; cc = ll = cx = 0; ch=' '; getsym(); fv = fopen("fv.txt", "w"); ft = fopen("ft.txt", "w"); addset(nxtlev, declbegsys, statbegsys, symnum); nxtlev[period]=true; block(0, 0, nxtlev);//调用编译程序 fclose(fv); fclose(fo); fclose(ft); fclose(fin); printf("\n"); if(sym != period) { error(9);//应为句号 } if(err == 0) { cout<<"*****************************"<<endl; fr = fopen("fr.txt", "w"); interpret(); fclose(fr); } else { printf("程序出错!"); } fclose(fin); printf("\n"); getchar(); }

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

C++(数据结构与算法)78:---分而治之

一、分而治之的思想 分而治之方法与软件设计的模块化方法非常相似 分而治之通常不用于解决问题的小实例,而要解决一个问题的大实例。一般步骤为: ①把一个大实例分为两个或多个更小的实例 ②分别解决每个小实例 ③把这些小实例的解组合成原始大实例的解 二、实际应用之找出假币 问题描述 一个袋子有16个硬币,其中只有一个是假币,这个假币比其他的真币重量轻(其他所有真币的重量都是相同的)...

springboot+jwt实现token登陆权限认证

一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程;对小项目而已是个轻量级的认证机制,符合开发需求;更多精彩原创内容关注公主号知识追寻者,读者的肯定,就是对作者的创作的最大支持; 二 jwt实现登陆认证流程 用户使用账号和面发出post请求 服务器接受到请求后使用私...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

win10暴力查看wifi密码

刚才邻居打了个电话说:喂小灰,你家wifi的密码是多少,我怎么连不上了。 我。。。 我也忘了哎,就找到了一个好办法,分享给大家: 第一种情况:已经连接上的wifi,怎么知道密码? 打开:控制面板\网络和 Internet\网络连接 然后右击wifi连接的无线网卡,选择状态 然后像下图一样: 第二种情况:前提是我不知道啊,但是我以前知道密码。 此时可以利用dos命令了 1、利用netsh wlan...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

早上躺尸,晚上干活:硅谷科技公司这么流行迟到?

硅谷科技公司上班时间OPEN早已不是什么新鲜事,早九晚五是常态,但有很多企业由于不打卡,员工们10点、11点才“姗姗来迟”的情况也屡见不鲜。 这种灵活的考勤制度为人羡慕,甚至近年来,国内某些互联网企业也纷纷效仿。不过,硅谷普遍弹性的上班制度是怎么由来的呢?这种“流行性迟到”真的有那么轻松、悠哉吗? 《动态规划专题班》 课程试听内容: 动态规划的解题要领 动态规划三大类 求最值/计数/可行性 常...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

立即提问
相关内容推荐