C语言中“bool”是什么,有什么功能,怎么用?

在做杭电1236题的过程中,与ac代码对比,

 #include "iostream"
#include "stdio.h"
#include "algorithm"
#include <string.h>
using namespace std;
const int MAXN = 11;
const int MAX = 22;
int point[MAXN];
struct Student
{
       char num[MAX];
       int pro_num[MAXN];
       int pnt ;
};
bool cmp(const Student &a,const Student &b)
{
     if (a.pnt == b.pnt)
     return strcmp(a.num,b.num) < 0 ? 1 : 0;
     else return a.pnt > b.pnt;
}
int main()
{
    int N, sum;
    while (scanf("%d",&N) != EOF)
    {
          sum = 0;
          if (N == 0) break;
          int M, G;
          scanf("%d%d",&M,&G);
          int i;
          int max;
          for(i = 0; i < M; i++)
          {
                scanf("%d",&point[i]);
          }
          Student stu[1001];
          for(i = 0; i < N; i ++)
          {
                scanf("%s",&stu[i].num);
                stu[i].pnt = 0;
                int slv, j;
                scanf("%d",&slv);
                for (j = 0; j < slv; j++)
                {
                    scanf("%d",&stu[i].pro_num[j]);
                    stu[i].pnt = stu[i].pnt + point[stu[i].pro_num[j] - 1];
                }
          }
          for (i = 0; i < N; i++)
          {
              if (stu[i].pnt >= G) sum++;
          }
          printf("%d\n",sum);
          sort (stu,stu + N,cmp);
          for (i = 0; i < sum; i++)
          {
              printf("%s %d\n", stu[i].num,stu[i].pnt);
          }

    }
    system ("pause");
    return 0;
}
            发现ac代码多了一行
 bool cmp(const Student &a,const Student &b)
{
     if (a.pnt == b.pnt)
     return strcmp(a.num,b.num) < 0 ? 1 : 0;
     else return a.pnt > b.pnt;
}

想知道这几行代码在程序中起什么作用

1个回答

 C语言如果有bool的话,也应该是新标准才有的。
不过我们一般不用。
很多C语言有
#define BOOL int
#define TRUE 1
#define FALSE 0
就你这个问题,cmp按理说应该返回int类型其中,a>b返回一个正整数,a<b返回负整数,a==b返回0,而不是bool,布尔怎么表示3个状态呢。
这里,sort是一个排序函数,排序算法库函数给你做好了,但是依据什么排序,是调用者来定义的,定义的方式是,自己写一个cmp函数
作为函数指针传给sort
sort反过来会调用你的cmp,给你两个元素,你来告诉排序算法,哪个算“大”,哪个算“小”,排序算法就能根据你的规则排序了。
你这里是按照pnt排序,如果pnt相等,再按照num排序。
return strcmp(a.num,b.num) < 0 ? 1 : 0;
按照我的理解,应该修改为
return 0-strcmp(a.num,b.num);
bool修改为int

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言项目,功能8,9不能正常实现,求修改,按如图要求
![图片说明](https://img-ask.csdn.net/upload/201911/25/1574686303_298098.png) #include "stdio.h" #include "string.h"//字符串函数 #include "stdlib.h" #include"stdbool.h" long Fact(int n); long FactSum(int v); //函数的定义(作用:计算输入阶乘数的阶乘和,并将结果返回主函数 void displaymain()//显示主菜单 { printf("*******************\n"); printf("简易计算器\n"); printf("*******************\n"); printf("请选择\n"); printf("1:加法\n"); printf("2:减法\n"); printf("3:乘法\n"); printf("4:除法\n"); printf("5:求余\n"); printf("6:累加\n"); printf("7:阶乘\n"); printf("8:阶乘累加\n"); printf("9:退出系统\n"); } void password() { int i=0,temp; bool login_status=false; char password[10]={0}; //声明一个最多有十个元素的数组,并且初始化值为0; //for(i=0;i { for(i=0;i<3;i++) { printf("请输入密码:"); scanf("%s",password);//输入密码(字符串) if(strcmp("19491001",password)==0) { login_status=true; break; }else printf("密码错误,重新输入"); } if(true==login_status)//strcmp:比较两个字符串是否一样 { printf("登陆成功\n"); int choice,flag=0; void displaymain(); void plus(); void minus(); void multiply(); void divide(); void complementation(); void accumulation(); int factorial(); int factorialSum(); while(flag==0) { putchar('\n'); displaymain(); printf("please input a digital(1-7)\n"); scanf("%d",&choice); if(choice>=1&&choice<=7) switch(choice) { case 1:plus();break; case 2:minus();break; case 3:multiply();break; case 4:divide();break; case 5:complementation();break; case 6:accumulation();break; case 7:factorial();break; case 8:factorialSum();break; default:printf("选项输入错误!\n"); } else { printf("your inputs is error!\n");flag=1; } } getch(); //菜单 } else { printf("密码错误超过三次\n"); } } void plus() { double a,b,temp; printf("请输入以空格分隔的两个运算数:\n"); scanf("%lf %lf",&a,&b); temp=a+b; printf("结果是:%lf",temp); } void minus() { double a,b,temp; printf("请输入被减数与减数(并用空格隔开):\n"); scanf("%lf %lf",&a,&b); temp=a-b; printf("结果是:%f",temp); } void multiply() { double a,b,temp; printf("请输入以空格分隔的两个运算数:\n"); scanf("%lf %lf",&a,&b); temp=a*b; printf("结果是:%f",temp); } void divide() { double a,b,temp; printf("请输入被除数与除数(并用空格隔开):\n"); scanf("%lf %lf",&a,&b); if(b!=0) { temp=a/b; printf("结果是:%f",temp); } else printf("错误!\n"); } void complementation() { int a,b,temp; printf("请输入两个用空格隔开的运算数:\n"); scanf("%d %d",&a,&b); if(b!=0) { temp=a%b; printf("结果是:%d",temp); } else printf("错误!\n"); } void accumulation() { int n,temp; int a,sum=1; printf("请输入要求累加的数值:\n"); scanf("%d",&n); for(a=2;a<=n;a++) { sum+=a; } temp=sum; printf("累加和为:%d\n",temp); } int factorial() { int m; long ret,temp; printf("请输入想求的阶乘数:"); scanf("%d",&m); ret = Fact(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else { temp=ret; printf("结果是:%d",temp); } return 0; } long Fact(int n)//函数的定义(作用:计算输入阶乘数的阶乘,并将结果返回主函数,且当n<0时,返回-1) { int i; long result = 1; if(n<0) { return -1; } else { for(i = 2;i<=n;i++) { result*=i; } return result; } } int factorialSum() { int m; long ret,temp; printf("请输入想求的阶乘和数:"); scanf("%d",&m); ret = FactSum(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else temp=ret; return 0; } long FactSum(int v)//函数的定义(作用:计算输入阶乘数的阶乘和,并将结果返回主函数,且当n<0时,返回-1) { int i; long result=1,j = 1; if(v<0) { return -1; } else { for(i = 2;i<=v;i++) { j*=i; result+=j; } return result; } } void main() { int temp; password(); printf("运行结束"); }
如何把C++语言编写的代码转换成C语言
``` #include <stdlib.h> #include <stdio.h> #include <string.h> #include <conio.h> #include <iostream.h> #define N 50 //系统中学生的最大数量 int n=3; //学生数量的初始值 struct student { int sid; char name[10]; char num[14]; float chinese; float english; float clanguage; float totalscore; float average; }; void print(bool menu)//打印基本信息 { if(!menu) { cout<<"\t\t"<<"----------------------------------------------"<<endl; cout<<"\t\t"<<"----------------------------------------------"<<endl; cout<<"\t\t"<<"*** 学生成绩管理系统 ***"<<endl; cout<<"\t\t"<<"*** 1.文件录入学生信息 ***"<<endl; cout<<"\t\t"<<"*** 2.增加学生信息 ***"<<endl; cout<<"\t\t"<<"*** 3.删除学生信息 ***"<<endl; cout<<"\t\t"<<"*** 4.查找学生信息 ***"<<endl; cout<<"\t\t"<<"*** 5.学生成绩排序 ***"<<endl; cout<<"\t\t"<<"*** 6.显示学生信息 ***"<<endl; cout<<"\t\t"<<"*** 7.退出系统 ***"<<endl; cout<<"\t\t"<<"----------------------------------------------"<<endl; cout<<"\t\t"<<"----------------------------------------------"<<endl; } } void GetInformation(struct student *arr,int n)//学生成绩信息录入 { FILE *fp; int i; char buffer[100]; if(fp=fopen("stu.dat","r")) { for(i=0;i<n;i++) { fgets(buffer,100,fp); sscanf(buffer,"%s %s %f %f %f",&arr[i].name,arr[i].num,&arr[i].chinese,&arr[i].english,&arr[i].clanguage); arr[i].totalscore=arr[i].chinese + arr[i].english + arr[i].clanguage; arr[i].average=arr[i].totalscore/3; if(feof(fp)) break; } cout<<"所有学生的成绩信息已录入!"<<endl<<endl; fclose(fp); } } void Display(struct student* arr,int n)//学生成绩信息显示 { cout<<"序号"<<"\t"<<"姓名"<<"\t"<<" 学号"<<"\t\t"<<"语文"<<"\t"<<"英语"<<"\t"<<"C语言"<<"\t"<<"平均分"<<"\t"<<"总分"<<endl; for(int i=0;i<n;i++) { cout<<" "<<i+1<<"\t"<<arr[i].name<<"\t"<<arr[i].num<<"\t "<<arr[i].chinese<<"\t "<<arr[i].english<<"\t "<<arr[i].clanguage <<"\t "<<arr[i].average<<"\t"<<arr[i].totalscore<<endl; } cout<<endl; } void Save(struct student* arr,int n)//学生成绩信息保存,保存在源目录下的student.txt { FILE *fp; fp=fopen("stu1.dat","w+"); if(fp==NULL) { cout<<"文件不存在!"<<endl; exit(0); } fwrite(arr,sizeof(struct student)*n,n,fp); fclose(fp); cout<<endl<<"*所有学生的成绩信息已保存!!!"<<endl<<endl; } void Delete(struct student* arr,int n)//学生成绩信息删除 { char number[10]; bool flag=false; cout<<"要删除的学生信息:"<<endl; cout<<"请输入该学生的学号:"<<endl; cin>>number; for(int i=0;i<n;i++) { if (!strcmp(number,arr[i].num)) { strcpy(arr[i].name," "); strcpy(arr[i].num," "); arr[i].chinese=0; arr[i].english=0; arr[i].clanguage=0; arr[i].totalscore=0; arr[i].average=0; Save(arr,n); flag=true; } } if(flag==true) { cout<<endl<<"该学生不存在!"<<endl; } } void Search(struct student* arr,int n)//学生成绩信息查询 { int temp,i; bool flag=false; cout<<"---------------1.按学号查找---------------"<<endl; cout<<"---------------2.按姓名查找---------------"<<endl; cout<<"---------------3.返回上层菜单-------------"<<endl; cout<<"请按数字键(1—3)选择相应的功能:"<<endl; cin>>temp; switch (temp) { case 1://按照学号查询 { char number[14]; cout<<"请输入学号(10位整数的学号):"<<endl; cin>>number; for(i=0;i<n;i++) { if(!strcmp(number,arr[i].num)) { cout<<"姓名"<<"\t"<<" 学号"<<"\t\t"<<"语文"<<"\t"<<"英语"<<"\t"<<"C语言"<<"\t"<<"平均分"<<"\t"<<"总分"<<endl; cout<<arr[i].name<<"\t"<<arr[i].num<<"\t "<<arr[i].chinese<<"\t "<<arr[i].english<<"\t "<<arr[i].clanguage <<"\t "<<arr[i].average<<"\t"<<arr[i].totalscore<<endl<<endl; flag=true; } } if(!flag) { cout<<endl<<"该学生不存在."<<endl<<endl; } } break; case 2://按照姓名查询 { char nam[10]; cout<<"请输入姓名(汉字):"<<endl; cin>>nam; for(i=0;i<n;i++) { if(!strcmp(nam,arr[i].name)) { cout<<"姓名"<<"\t"<<"学号"<<"\t\t"<<"语文"<<"\t"<<"英语"<<"\t"<<"C语言"<<"\t"<<"平均分"<<"\t"<<"总分"<<endl; cout<<arr[i].name<<"\t"<<arr[i].num<<"\t"<<arr[i].chinese<<"\t"<<arr[i].english<<"\t"<<arr[i].clanguage <<"\t"<<arr[i].average<<"\t"<<arr[i].totalscore<<endl<<endl; flag=true; } } if(!flag) { cout<<endl<<"该学生不存在."<<endl<<endl; } } break; default: break; } } void Sort(struct student* arr,int n)//学生成绩排序 { int temp,i; bool flag=false; student stemp; cout<<"---------------1.按学号排序---------------"<<endl; cout<<"---------------2.按总分排序---------------"<<endl; cout<<"---------------3.返回上层菜单-------------"<<endl; cout<<"请按数字键(1—3)选择相应的功能:"<<endl; cin>>temp; switch (temp) { case 1://按照学号排序 { int j,index; char min[14]; for(i=0;i<n;i++) { index=i; strcpy(min,arr[i].num); for(j=i+1;j<n;j++) { if(strcmp(min,arr[j].num)>0) { index=j; } } if(index!=i) { stemp=arr[index]; arr[index]=arr[i]; arr[i]=stemp; } } Display(arr,n); } break; case 2://按照总分排序 { int bound,exchange=n-1; while(exchange!=0) { bound=exchange; exchange=0; for(i=0;i<bound;i++) { if(arr[i].totalscore<arr[i+1].totalscore) { stemp=arr[i]; arr[i]=arr[i+1]; arr[i+1]=stemp; exchange=i; } } } Display(arr,n); } break; default: break; } } void Add(struct student* arr) { bool flag=false; n+=1; cout<<"请根据下面提示输入新的学生信息:"<<endl; cout<<"姓名:"; cin>>arr[n-1].name; cout<<"学号:"; cin>>arr[n-1].num; cout<<"语文:"; cin>>arr[n-1].chinese; cout<<"英语:"; cin>>arr[n-1].english; cout<<"C语言:"; cin>>arr[n-1].clanguage; arr[n-1].totalscore=arr[n-1].chinese + arr[n-1].english + arr[n-1].clanguage; arr[n-1].average=arr[n-1].totalscore/3; cout<<"新的学生信息已录入!"<<endl<<endl; flag=true; } int main(int argc,char* argv[]) { struct student arr[N]; bool flag=true; if(flag) { int select; print(false); cout<<"请按数字键(1或7)选择相应的功能:"<<endl; cin>>select; while(0<select && select<7) { switch (select) { case 1: GetInformation(arr,N); print(true); break; case 2: ; case 3: ; case 4: ; case 5: ; case 6: cout<<"学生基本信息未录入,功能无法实现。"<<endl<<endl; print(false); cout<<"请按数字键(1或7)选择相应的功能:"<<endl; cin>>select; break; default: break; } if(select==1) break; } if(select>=7) flag=false; else flag=true; if(flag) { cout<<"请按数字键(1—7)选择相应的功能:"<<endl; cin>>select; while(select>0 && select<7) { switch (select) { case 1: cout<<"学生信息已录入!"<<endl; print(true); break; case 2: Add(arr); print(true); break; case 3: Delete(arr,n); print(true); break; case 4: Search(arr,n); print(true); break; case 5: Sort(arr,n); print(true); break; case 6: Display(arr,n); print(true); break; default: break; } cout<<"请按数字键(1—7)选择相应的功能:"<<endl; cin>>select; } } Save(arr,n); cout<<"感谢使用本系统!"<<endl; } return 0; } ```
新手请教一下c语言变量定义的问题
我的工程里有3个.cpp和2个.h,在cpp文件里定义了几个全局变量,然后两个cpp里都引用了一个.h,结果build的时候就出现 already defined in ***.obj, conflicts with use of other libs, one or more multiply defined symbols found 报错信息如下 Main.obj : error LNK2005: "int (* iMap)[13]" (?iMap@@3PAY0N@HA) already defined in LessonX.obj Main.obj : error LNK2005: "bool g_bStart" (?g_bStart@@3_NA) already defined in LessonX.obj Main.obj : error LNK2005: "float g_fGameTime" (?g_fGameTime@@3MA) already defined in LessonX.obj Main.obj : error LNK2005: "int g_iScore" (?g_iScore@@3HA) already defined in LessonX.obj LINK : warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library ..\..\..\Bin\Game.exe : fatal error LNK1169: one or more multiply defined symbols found 执行 link.exe 时出错. LessonX.cpp的源代码如下: ///////////////////////////////////////////////////////////////////////////////// // // // // ///////////////////////////////////////////////////////////////////////////////// #include <Stdio.h> #include "CommonAPI.h" #include "LessonX.h" #include "List.h" //////////////////////////////////////////////////////////////////////////////// // int g_iGameState = 0; // 游戏状态,0 -- 游戏结束等待开始状态;1 -- 按下空格键开始,初始化游戏;2 -- 游戏进行中 struct Weapon* g_pMyTank =NULL; int iMap[11][13]; bool g_bStart = false; // 控制一局游戏开始true与结束false float g_fGameTime = 0.f; // 一局游戏的剩余时间 int g_iScore = 0; // 一局游戏得分 const float GAME_TIME = 30.f; // 一局游戏时间 const float CREATE_TANK_TIME = 5.f; // 每批次生成坦克的时间间隔 const float TANK_SPEED = 5.f; // 坦克速度 const float BULLET_SPEED = 8.f; // 子弹速度 const float FIRE_TIME = 2.f; // 坦克开炮时间间隔 const float WORLD_LEFT = -26.f; // 游戏场景边界左值 const float WORLD_TOP = -22.f; // 游戏场景边界左值 const float WORLD_RIGHT = 26.f; // 游戏场景边界左值 const float WORLD_BOTTOM = 22.f; // 游戏场景边界左值// // 游戏地图,0表示此处为空,1表示此处有墙。根据游戏空间大小、墙以及坦克大小, // 我们把地图分成11行,13列,每格大小刚好放一块墙。 // void GameInit(); void GameRun( float fDeltaTime ); void GameEnd(); void MoveMyTank(int iKey,bool bPress); //============================================================================== // // 大体的程序流程为:GameMainLoop函数为主循环函数,在引擎每帧刷新屏幕图像之后,都会被调用一次。 //============================================================================== // // 游戏主循环,此函数将被不停的调用,引擎每刷新一次屏幕,此函数即被调用一次 // 用以处理游戏的开始、进行中、结束等各种状态. // 函数参数fDeltaTime : 上次调用本函数到此次调用本函数的时间间隔,单位:秒 void GameMainLoop( float fDeltaTime ) { switch( g_iGameState ) { // 初始化游戏,清空上一局相关数据 case 1: { GameInit(); g_iGameState = 2; // 初始化之后,将游戏状态设置为进行中 } break; // 游戏进行中,处理各种游戏逻辑 case 2: { // TODO 修改此处游戏循环条件,完成正确游戏逻辑 if( true ) { GameRun( fDeltaTime ); } else { // 游戏结束。调用游戏结算函数,并把游戏状态修改为结束状态 g_iGameState = 0; GameEnd(); } } break; // 游戏结束/等待按空格键开始 case 0: default: break; }; } void MoveMyTank(int iKey,bool bPress) { if(bPress&&g_pMyTank!=NULL) { switch(iKey) { case KEY_W: g_pMyTank->iDir=UP; g_pMyTank->fSpeedX=0.f; g_pMyTank->fSpeedY=-TANK_SPEED; break; case KEY_S: g_pMyTank->iDir=DOWN; g_pMyTank->fSpeedX=0.f; g_pMyTank->fSpeedY=TANK_SPEED; break; case KEY_A: g_pMyTank->iDir=LEFT; g_pMyTank->fSpeedX=-TANK_SPEED; g_pMyTank->fSpeedY=0.f; break; case KEY_D: g_pMyTank->iDir=RIGHT; g_pMyTank->fSpeedX=TANK_SPEED; g_pMyTank->fSpeedY=0.f; break; default: break; } dSetSpriteLinearVelocity("player",g_pMyTank->fSpeedX, g_pMyTank->fSpeedY); dSetSpriteRotation("player",g_pMyTank->iDir*90); } } //============================================================================== // // 每局开始前进行初始化,清空上一局相关数据 void GameInit() { } //============================================================================== // // 每局游戏进行中 void GameRun( float fDeltaTime ) { } //============================================================================== // // 本局游戏结束 void GameEnd() { } //========================================================================== // // 鼠标移动 // 参数 fMouseX, fMouseY:为鼠标当前坐标 void OnMouseMove( const float fMouseX, const float fMouseY ) { } //========================================================================== // // 鼠标点击 // 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义 // 参数 fMouseX, fMouseY:为鼠标当前坐标 void OnMouseClick( const int iMouseType, const float fMouseX, const float fMouseY ) { } //========================================================================== // // 鼠标弹起 // 参数 iMouseType:鼠标按键值,见 enum MouseTypes 定义 // 参数 fMouseX, fMouseY:为鼠标当前坐标 void OnMouseUp( const int iMouseType, const float fMouseX, const float fMouseY ) { } //========================================================================== // // 键盘按下 // 参数 iKey:被按下的键,值见 enum KeyCodes 宏定义 // 参数 iAltPress, iShiftPress,iCtrlPress:键盘上的功能键Alt,Ctrl,Shift当前是否也处于按下状态(0未按下,1按下) void OnKeyDown( const int iKey, const bool bAltPress, const bool bShiftPress, const bool bCtrlPress ) { if(iKey == KEY_SPACE && g_bStart == false) // 游戏未开始,按下空格键 { g_bStart = true; g_fGameTime = GAME_TIME; dSetSpriteVisible("start", false); dSetTextValue("time", (int)g_fGameTime); dSetTextValue("score", g_iScore); } } //========================================================================== // // 键盘弹起 // 参数 iKey:弹起的键,值见 enum KeyCodes 宏定义 void OnKeyUp( const int iKey ) { } //=========================================================================== // // 精灵与精灵碰撞 // 参数 szSrcName:发起碰撞的精灵名字 // 参数 szTarName:被碰撞的精灵名字 void OnSpriteColSprite( const char *szSrcName, const char *szTarName ) { } //=========================================================================== // // 精灵与世界边界碰撞 // 参数 szName:碰撞到边界的精灵名字 // 参数 iColSide:碰撞到的边界 0 左边,1 右边,2 上边,3 下边 void OnSpriteColWorldLimit( const char *szName, const int iColSide ) { } List.h的源代码如下: ////////////////////////////////////////////////////////////// /////////////////////////// ////// // //////////////////////////// #ifndef _LIST_H_ #define _LIST_H_ ///////////////////////////// struct Weapon{ char szName[128]; // 精灵名称 float fPosX, fPosY; // 精灵坐标 float fSpeedX, fSpeedY; // X和Y方向上速度 float fFireTime; // 敌方坦克距下一次开炮的剩余时间 int iHp; // 生命值 int iDir; // 朝向:0 - 上方;1 - 右方;2 - 下方;3 - 左方 int iType; // 类型: 0 - 我方坦克;1 - 敌方坦克;2 - 我方 // 子弹; 3 - 敌方子弹 Weapon* pNext; // 指向下一个节点的指针 }; enum Direction{ UP = 0, // 上方 RIGHT = 1, // 右方 DOWN = 2, // 下方 LEFT = 3 // 左方 }; enum Role { MYTANK = 0, // 我方坦克 ENEMYTANK = 1, // 敌方坦克 MYBULLET = 2, // 我方子弹 ENEMYBULLET = 3 // 敌方子弹 }; extern int g_iGameState; // 游戏状态,0 -- 游戏结束等待开始状态;1 -- 按下空格键开始,初始化游戏;2 -- 游戏进行中 extern struct Weapon* g_pMyTank; extern int iMap[11][13]; extern bool g_bStart; // 控制一局游戏开始true与结束false extern float g_fGameTime; // 一局游戏的剩余时间 extern int g_iScore; // 一局游戏得分 #endif//_LIST_H_ 求问这要怎么办?
VS2013 C语言编程问题
最近把VxWorks的代码移植到VS上发现有个地方总是不对,pGAPPMsg->head.size加上结构体大小出来的结果出乎意料,不懂是为什么 ,求指教。下面是源码和调试截图 typedef struct { GM_UINT8 ItfVer; /**< GAPP层版本 配置确定*/ GM_UINT16 size; /**< 数据字节数消息大小 */ GM_UINT8 SrcSSTy; /**< 源子系统类型 */ GM_UINT8 SrcLogID; /**< 源子系统逻辑ID */ GM_UINT8 SrcSSID; /**< 源子系统ID */ GM_UINT8 DestSSTy; /**< 目的子系统类型 */ GM_UINT8 DestLogID; /**< 目的子系统逻辑ID */ GM_UINT8 DestSSID; /**< 目的子系统ID */ GM_UINT32 NTPDateTime[2]; /**< NTP时间 */ GM_UINT8 MsgID; /**< 消息ID */ GM_UINT8 AppType; /**< 应用类型 */ }GM_PACKED GM_GAPP_Head_Struct; /** @brief SIG功能层消息结构(消息长度:Header.usLength+19). */ typedef struct { GM_GAPP_Head_Struct head; /**< SIG功能层头部 */ GM_UINT8 data[GM_GAPP_DATA_LEN_MAX]; /**< 数据 */ }GM_PACKED GM_GAPP_Msg_Struct; typedef unsigned char GM_UINT8; typedef unsigned short GM_UINT16; typedef unsigned long GM_UINT32; typedef signed char GM_INT8; typedef signed short int GM_INT16; typedef signed long int GM_INT32; typedef float GM_FLOAT; typedef double GM_DOUBLE; typedef int GM_BOOL; ![图片说明](https://img-ask.csdn.net/upload/201803/27/1522115556_517204.png)
c语言提示error LNK2019: 无法解析的外部符号
在c语言中实现对对象的管理 前面的代码是这样的 #include <stdlib.h> #include <stdio.h> #include "ObjMgt.h" typedef struct key{ unsigned int key1; unsigned int key2; unsigned int key3; struct key * next; }keyall ; /************************************************************************* 功能:增加单个对象 输入: key1 外部关键字 KEY1 key2 外部关键字KEY2 key3 外部关键字KEY3 输出:无 返回: -1 :失败(对象已经存在或者其它异常) 0 :成功 ***************************************************************************/ int length=0; keyall *phead; keyall *pend; int Addkeyall (unsigned int key1, unsigned int key2, unsigned int key3) { if(phead==NULL){ phead=(keyall *)malloc(sizeof(keyall)); pend=phead; } if(length>10000) return -1; keyall *p=phead; while(p!=NULL) { if(p->key1==key1&&p->key2==key2&&p->key3==key3) return -1; p=p->next; } keyall * temp; temp=(keyall * )malloc(sizeof(keyall)); temp->key1=key1; temp->key2=key2; temp->key3=key3; pend->next=temp; pend=temp; pend->next=NULL; length++; /*请实现*/ return 0; } /******************************************************************************** 功能:删除一个或多个对象 输入: key1 外部关键字 KEY1 key2 外部关键字 KEY2 key3 外部关键字 KEY3 输出:无 返回:无 说明:用例保证参数取值为合法值和通配符0xFFFFFFFF, 通配符表示0~65535范围内的任意值; 举例:key1=1,key2=2,key3= 0xFFFFFFFF,表示删除key1=1,key2=2的所有对象; key1,key2,key3取值全为0xFFFFFFFF时,表示删除所有对象。 *********************************************************************************/ void Deletekeyall (unsigned int key1, unsigned int key2, unsigned int key3) { keyall *p; keyall *pre; p=phead->next; pre=phead; bool keya=false; bool keyb=false; bool keyc=false; if(key1==0xFFFFFFFF) keya=true; if(key2==0xFFFFFFFF) keyb=true; if(key3==0xFFFFFFFF) keyc=true; while(p!=NULL) { if((keya||p->key1==key1)&&(keyb||p->key2==key2)&&(keya||p->key3==key3)) { pre->next=p->next; free(p); p=pre->next; } else { pre=p; p=p->next; } } return ; } /******************************************************************************** 功能:查询单个对象是否存在 输入: key1 外部关键字 KEY1 key2 外部关键字 KEY2 key3 外部关键字 KEY3 输出:无 返回: 0:不存在 1:存在 **********************************************************************************/ int IskeyallExist (unsigned int key1, unsigned int key2, unsigned int key3) { /*请实现*/ keyall *p; p=phead->next; while(p!=NULL) { if(key1==p->key1&&key2==p->key2&&key3==p->key3) return 1; } return 0; } /****************************************************************************************************** Description 清空所有对象 Prototype void Clear(); Input Param 无 Output Param 无 Return Value 无 ********************************************************************************************************/ void Clear(void) { /*在这里实现功能*/ return; } 别人的代码可以使用的是这样的 #include "ObjMgt.h" #include <vector> using namespace std; typedef struct{ unsigned int key1; unsigned int key2; unsigned int key3; }KEY; vector <KEY> allKey; /************************************************************************* 功能:增加单个对象 输入: key1 外部关键字 KEY1 key2 外部关键字KEY2 key3 外部关键字KEY3 输出:无 返回: -1 :失败(对象已经存在或者其它异常) 0 :成功 ***************************************************************************/ int AddObject (unsigned int key1, unsigned int key2, unsigned int key3) { /*请实现*/ if(allKey.size() > 10000) return -1; if(key1 > 65535 || key2 > 65535 || key3 > 65535) return -1; int i,j = allKey.size(); for(i = 0; i < j;i++) if(allKey[i].key1 == key1 && allKey[i].key2 == key2 && allKey[i].key3 == key3) return -1; KEY k = {key1,key2,key3}; allKey.push_back(k); return 0; } /******************************************************************************** 功能:删除一个或多个对象 输入: key1 外部关键字 KEY1 key2 外部关键字 KEY2 key3 外部关键字 KEY3 输出:无 返回:无 说明:用例保证参数取值为合法值和通配符0xFFFFFFFF, 通配符表示0~65535范围内的任意值; 举例:key1=1,key2=2,key3= 0xFFFFFFFF,表示删除key1=1,key2=2的所有对象; key1,key2,key3取值全为0xFFFFFFFF时,表示删除所有对象。 *********************************************************************************/ void DeleteObject (unsigned int key1, unsigned int key2, unsigned int key3) { /*请实现*/ bool allKey1,allKey2,allKey3; if(key1 == 0xffffffff) allKey1 = true; else allKey1 = false; if(key2 == 0xffffffff) allKey2 = true; else allKey2 = false; if(key3 == 0xffffffff) allKey3 = true; else allKey3 = false; int i,j = allKey.size(); vector<KEY>::iterator it ; it = allKey.begin(); while (it != allKey.end()) { if(allKey1 || it->key1 == key1) if(allKey2 || it->key2 == key2) if(allKey3 || it->key3 == key3){ it = allKey.erase(it); continue; } it++; } return ; } /******************************************************************************** 功能:查询单个对象是否存在 输入: key1 外部关键字 KEY1 key2 外部关键字 KEY2 key3 外部关键字 KEY3 输出:无 返回: 0:不存在 1:存在 **********************************************************************************/ int IsObjectExist (unsigned int key1, unsigned int key2, unsigned int key3) { /*请实现*/ if(key1 > 65535 || key2 > 65535 || key3 > 65535) return 0; int i,j = allKey.size(); for(i = 0; i < j;i++) if(allKey[i].key1 == key1 && allKey[i].key2 == key2 && allKey[i].key3 == key3) return 1; return 0; } /****************************************************************************************************** Description 清空所有对象 Prototype void Clear(); Input Param 无 Output Param 无 Return Value 无 ********************************************************************************************************/ void Clear(void) { /*在这里实现功能*/ allKey.clear(); return; } 结果我的连接出现如下错误 1>正在链接... 1>CExampleTest.obj : error LNK2019: 无法解析的外部符号 "void __cdecl DeleteObject(unsigned int,unsigned int,unsigned int)" (?DeleteObject@@YAXIII@Z),该符号在函数 "public: void __thiscall CExampleTest::TestCase01(void)" (?TestCase01@CExampleTest@@QAEXXZ) 中被引用 1>CExampleTest.obj : error LNK2019: 无法解析的外部符号 "int __cdecl IsObjectExist(unsigned int,unsigned int,unsigned int)" (?IsObjectExist@@YAHIII@Z),该符号在函数 "public: void __thiscall CExampleTest::TestCase01(void)" (?TestCase01@CExampleTest@@QAEXXZ) 中被引用 1>CExampleTest.obj : error LNK2019: 无法解析的外部符号 "int __cdecl AddObject(unsigned int,unsigned int,unsigned int)" (?AddObject@@YAHIII@Z),该符号在函数 "public: void __thiscall CExampleTest::TestCase01(void)" (?TestCase01@CExampleTest@@QAEXXZ) 中被引用 1>C:\Users\wang\Desktop\对象管理器\ObjMgt\project\Debug\ObjMgt.exe : fatal error LNK1120: 3 个无法解析的外部命令 1>生成日志保存在“file://c:\Users\wang\Desktop\对象管理器\ObjMgt\project\Debug\BuildLog.htm” 1>ObjMgt - 4 个错误,0 个警告 ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ========== 找了一天了 把网上能够试一试的都试了一遍 ,还是不行
新人求助,c语言问题。
程序的功能是输入字符串存入pS指针,进行大小对比后按从小到大输出。发现当输入字符串超过5个时程序会停止运行,恳请哪位大神帮我看下代码有什么问题。 代码如下: #include<stdio.h> #include<stdlib.h> #include<string.h> #define BUF_LEN 100 #define COUNT 5 int main(void) { char buf[BUF_LEN]; size_t str_count=0; size_t capacity=COUNT; char **pS=(char**)calloc(capacity,sizeof(char*)); char** psTemp=NULL; char* pTemp=NULL; size_t str_len=0; bool sorted=false; printf("Enter strings to be sorted,one per line.Press Enter to end:\n"); char *ptr=NULL; while(true) { ptr=fgets(buf,BUF_LEN,stdin); if(!ptr) { printf("Error reading string.\n"); free(pS); pS=NULL; return 1; } if(*ptr=='\n') break; if(str_count==capacity) { capacity+=capacity/4; if(!(psTemp=(char**)realloc(pS,capacity))) return 1; pS=psTemp; } str_len=strlen(buf)+1; if(!(pS[str_count]=(char*)malloc(str_len))) return 2; strcpy(pS[str_count++],buf); } while(!sorted) { sorted=true; for(size_t i=0;i<str_count;++i) { if(i==(str_count-1)) break; if(strcmp(pS[i],pS[i+1])>0) { sorted=false; pTemp=pS[i]; pS[i]=pS[i+1]; pS[i+1]=pTemp; } } } printf("Your input sorted in ascending sequence is:\n\n"); for(size_t k=0;k<str_count;++k) { printf("%s",pS[k]); free(pS[k]); pS[k]=NULL; } free(pS); pS=NULL; return 0; }
【C语言】vc6.0运行程序过程中提示***.EXE已停止工作
在运行“添加”这一块时,输入完信息之后就提示***.EXE已停止工作,这是什么错? 代码如下 #include<stdio.h> #include<stdlib.h> #include<string.h> #include <windows.h> #include<conio.h> #define LENTEL sizeof(tel) #define ID struct tel struct tel { char name[15]; char tele[15]; char style[15]; char mail[20]; ID * next; }; ID *id = NULL; /*读取telephone.txt文件中的内容创建学生链表*/ ID* create() { ID *head; ID *p1,*p2; p2 = (ID*)malloc(LENTEL); head = p2; FILE *fp; if((fp = fopen("telephone.txt","r")) == NULL) { printf("联系人文件打开错误,请将telephone.txt放置与程序同一目录下!\n"); exit(0); } for(int i = 0; i<1;i++) fscanf(fp,"%*[^\n]%*c"); while(!feof(fp)) { p1 = (ID*)malloc(LENTEL); fscanf(fp,"%s%s%s%s",p1->name,p1->tele,p1->style,p1->mail); p1->next = NULL; p2->next = p1; p2 = p1; } fclose(fp); return head; } ID* findbyname(char name[]) { ID* p = id; ID* temp = NULL; while (p!=NULL) { if(strcmp(name,p->name) == 0) { temp = p; break; } else { p = p->next; } } return temp; } ID* findbytele(char tele[]) { ID* p = id; ID* temp = NULL; while (p!=NULL) { if(strcmp(tele,p->tele) == 0) { temp = p; break; } else { p = p->next; } } return temp; } /*判断这个联系人是否存在*/ bool Istel(char name[]) { ID *p = id->next; bool flag = false; while (p != NULL) { if(strcmp(p->name,name) == 0) { flag = true; } p=p->next; } return flag; } int add() { ID *newtel = NULL; ID *p = id; char tel_name[15]; char tel_tele[11]; char tel_style[15]; char tel_mail[20]; printf("\n------- 请输入学生基本信息 --------\n"); printf("姓名 电话 类别 邮箱\n"); printf("--------------------------------------\n"); scanf("%s%s%s%s",tel_name,tel_tele,tel_style,tel_mail); if(!Istel(tel_name)) { newtel = (ID*)malloc(LENTEL); strcpy(newtel->name,tel_name); strcpy(newtel->tele,tel_tele); strcpy(newtel->style,tel_style); strcpy(newtel->mail,tel_mail); newtel->next = NULL; for(p=p->next; p->next!=NULL; p=p->next); p->next = newtel; printf("\n联系人已添加成功!\n"); } else { printf("\n该联系人姓名已存在!\n"); } getch(); return 0; } void Print_Inquire_All() { void menu_print_out(); ID *p1 = id->next; menu_print_out(); while (p1!=NULL) { printf("%s\t%s\t%s\t%s\n",p1->name,p1->tele,p1->style,p1->mail); p1 = p1->next; } system("pause"); } void menu_print_out() { printf("\n---------------------------------\n"); printf("\n---------------------------------\n"); } /*主菜单*/ void menu(void) { void ReadBack(); printf(" ╭════════╮ \n"); printf("╭══════╣通讯管理系统V1.0╠══════╮\n"); printf("║ ╰════════╯ ║\n"); printf("║ 【1】添加数据 【3】退出系统 ║\n"); printf("║ ║\n"); printf("║ 【2】查询数据 ************* ║\n"); printf("║ ║\n"); printf("╰══════════════════════╯\n"); printf("◎请输入功能前的序号进入相应的工具:【 】\b\b"); int a = 0; a = getchar(); while(a!='1'&&a!='2'&&a!='3') { printf("error! please input the right number!\n"); putchar('\a'); getchar(); printf("◎请重新输入功能前的序号进入相应的工具:【 】\b\b"); a = getchar(); } switch(a) { case '1': add(); break; case '2': Print_Inquire_All(); case '3': ReadBack(); exit(0); break; } getchar(); } /*退出程序时将数据写回telephone.txt进行更新*/ void ReadBack() { FILE *TEL = fopen("telephone.txt","w"); ID *te = id->next; fprintf(TEL,"Tname Ttele Tstyle Tmail"); while (te != NULL) { fprintf(TEL,"\n%s %s %s %s",te->name,te->tele,te->style,te->mail); te = te->next; } fclose(TEL); } void Lunch() { FILE *fp; if((fp=fopen("telephone.txt","r")) == NULL) { FILE *fp; fp=fopen("telephone.txt","w+"); } else id = create(); menu(); } void main() { SetConsoleTitle("C语言通讯录管理系统"); Lunch(); }
(C语言版)数据结构线性表从键盘输入元素实现相关功能,不报错,但执行意外终止
#include<stdio.h> #include<malloc.h> #define MaxSize 50 typedef char ElemType; typedef struct{//struct结构体 ElemType data[MaxSize]; int length; }SqList; void InitList(SqList *&L)//初始化线性表的方法,&是取地址符号,*是定义指针符号,如int *b=&a;*a=4 { L=(SqList *)malloc(sizeof(SqList));//分配存放线性表的空间 L->length=0;//->是成员指示符,用来访问一个自定义数据类型的成员 } void DestroyList(SqList *L)//摧毁线性表 { free(L); } bool ListEmpty(SqList *L)//判断线性表是否为空 { return (L->length==0); } int ListLength(SqList *L){//求线性表长度 return (L->length); } void DispList(SqList *L){//输出线性表 int i; if(ListEmpty(L)) return; for(i=0;i<L->length;i++) printf("%c",L->data[i]); printf("\n"); } bool GetElem(SqList *L,int i,ElemType &e)//求线性表中某个数据元素值 { if(i<1||i>L->length) return false; e=L->data[i-1]; return true; } int LocateElem(SqList *L,ElemType e)//按元素值查找 { int i=0; while(i<L->length&&L->data[i]!=e) i++; if(i>=L->length) return 0; else return i+1; } bool ListInsert(SqList *&L,int i,ElemType e){//插入数据元素的方法 int j; if(i<1||i>L->length+1) return false; i--; for(j=L->length;j>i;j--) L->data[i]=e; L->length++; return true; } bool ListDelete(SqList *&L,int i,ElemType &e)//删除数据元素 { int j; if(i<1||i>L->length) return false; i--; e=L->data[i]; for(j=i;j<L->length-1;j++) L->data[j]=L->data[j+1]; L->length--; return true; } void main(){ SqList *L; ElemType e; int n; printf("顺序表的基本运算如下:\n"); printf("1.顺序表初始化\n"); printf("2.插入元素\n"); printf("3.求顺序表的长度\n"); printf("4.获取指定元素的位置\n"); printf("5.获取指定位置的元素\n"); printf("6.删除元素\n"); printf("7.输出顺序表的元素\n"); printf("请输入:\n"); scanf("%d",&n); for(;1<n<8;){ if(n==1) InitList(L); else if(n==2){ printf("1.第一次插入;2.后续插入\n"); scanf("%d",&n); if(n==1){ int m; printf("请输入要插入的元素个数\n"); scanf("%d",&m); L->length=m; for(int i=1;i<=m;i++){ printf("请输入插入的第%d个元素的值:\n",i); scanf("%c",&e); ListInsert(L,i,e);} } else{ int m; printf("请输入要插入的元素位置\n"); scanf("%d",&m); printf("请输入插入的元素的值:\n"); scanf("%c",&e); ListInsert(L,m,e); } } else if(n==3) printf("顺序表的长度=%d\n",ListLength(L)); else if(n==4){ printf("请输入要查找的元素值:\n"); scanf("%c",&e); printf("元素%c的位置=%d\n",e,LocateElem(L,e));} else if(n==5){ printf("请输入元素序号:\n"); int m; scanf("%d",&m); GetElem(L,m,e); printf("第%d个元素=%c",m,e); } else if(n==6){ printf("请输入元素的序号:\n"); int m; scanf("%d",&m); ListDelete(L,m,e);} else { DispList(L);} } }
MFC:如何实现终止进程
请问要怎么在MFC中实现终止进程的功能呢?试着调用TerminateProcess()函数失败了......以下是从网上寻找的代码,修改后仍不成功,运行后点击按终止进程按钮后直接退出对话框了 ``` void CProcessDlg::OnBnClickedButton5() { UpdateData(TRUE); HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); PROCESSENTRY32 pe32; pe32.dwSize=sizeof(PROCESSENTRY32); BOOL bResult=Process32First(hSnapshot,&pe32); while(bResult) { CString str=pe32.szExeFile; if(str==v_softname) { this->MessageBox(L"查找到进程"); break; } else { bResult=Process32Next(hSnapshot,&pe32); } } CloseHandle(hSnapshot); //利用查找到的进程ID,打开进程: HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID); //关闭进程 BOOL bRet = TerminateProcess(hProcess,0); if(bRet) this->MessageBox(L"success"); else this->MessageBox(L"could not"); UpdateData(FALSE); } ``` v_softname是设置的edit control控件
C语言怎样编写程序运行完后,不自动结束,而是返回程序的开始的主菜单?
我的程序运行完一个功能后按任意键就退出了,而不是返回主菜单 代码如下,应该怎么改?(具体一点,菜鸟一个)多谢! #include<stdio.h> #include<stdlib.h> #include<string.h> #include <windows.h> #include<conio.h> #define LENTEL sizeof(tel) #define ID struct tel struct tel { char name[15]; char tele[11]; char style[15]; char mail[20]; ID * next; }; ID *id = NULL; /*读取telephone.txt文件中的内容创建学生链表*/ ID* create() { ID *head; ID *p1,*p2; p2 = (ID*)malloc(LENTEL); head = p2; FILE *fp; if((fp = fopen("telephone.txt","r")) == NULL) { printf("联系人文件打开错误,请将telephone.txt放置与程序同一目录下!\n"); exit(0); } while(!feof(fp)) { p1 = (ID*)malloc(LENTEL); fscanf(fp,"%s%s%s%s",p1->name,p1->tele,p1->style,p1->mail); p1->next = NULL; p2->next = p1; p2 = p1; } fclose(fp); return head; } ID* findbyname(char name[]) { ID* p = id; ID* temp = NULL; while (p!=NULL) { if(strcmp(name,p->name) == 0) { temp = p; break; } else { p = p->next; } } return temp; } ID* findbytele(char tele[]) { ID* p = id; ID* temp = NULL; while (p!=NULL) { if(strcmp(tele,p->tele) == 0) { temp = p; break; } else { p = p->next; } } return temp; } /*判断这个联系人是否存在*/ bool Istel(char name[]) { ID *p = id->next; bool flag = false; while (p != NULL) { if(strcmp(p->name,name) == 0) { flag = true; } p=p->next; } return flag; } int add() { menu(); ID *newtel = NULL; ID *p = id; char tel_name[15]; char tel_tele[11]; char tel_style[15]; char tel_mail[20]; printf("\n------- 请输入学生基本信息 --------\n"); printf("姓名 电话 类别 邮箱\n"); printf("--------------------------------------\n"); scanf("%s%s%s%s",tel_name,tel_tele,tel_style,tel_mail); if(!Istel(tel_name)) { newtel = (ID*)malloc(LENTEL); strcpy(newtel->name,tel_name); strcpy(newtel->tele,tel_tele); strcpy(newtel->style,tel_style); strcpy(newtel->mail,tel_mail); newtel->next = NULL; for(p=p->next; p->next!=NULL; p=p->next); p->next = newtel; printf("\n联系人已添加成功!\n"); } else { printf("\n该联系人姓名已存在!\n"); } getch(); return 0; } void Print_Inquire_All() { void menu_print_out(); ID *p1 = id->next; menu_print_out(); while (p1!=NULL) { printf("%s\t%s\t%s\t%s\n",p1->name,p1->tele,p1->style,p1->mail); p1 = p1->next; } system("pause"); } void menu_print_out() { printf("\n---------------------------------\n"); printf("\n---------------------------------\n"); } /*主菜单*/ void menu(void) { void ReadBack(); printf(" ╭════════╮ \n"); printf("╭══════╣通讯管理系统V1.0╠══════╮\n"); printf("║ ╰════════╯ ║\n"); printf("║ 【1】添加数据 【3】退出系统 ║\n"); printf("║ ║\n"); printf("║ 【2】查询数据 ************* ║\n"); printf("║ ║\n"); printf("╰══════════════════════╯\n"); printf("◎请输入功能前的序号进入相应的工具:【 】\b\b"); int a = 0; a = getchar(); while(a!='1'&&a!='2'&&a!='3') { printf("error! please input the right number!\n"); putchar('\a'); getchar(); printf("◎请重新输入功能前的序号进入相应的工具:【 】\b\b"); a = getchar(); } switch(a) { case '1': add(); break; case '2': Print_Inquire_All(); case '3': ReadBack(); exit(0); break; } getchar(); } /*退出程序时将数据写回telephone.txt进行更新*/ void ReadBack() { FILE *TEL = fopen("telephone.txt","w"); ID *te = id->next; while (te != NULL) { fwrite((char*)&id,sizeof(ID),1,TEL); te = te->next; } fclose(TEL); } void Lunch() { id = create(); menu(); } void main() { SetConsoleTitle("C语言通讯录管理系统"); Lunch(); }
怎么在c++builder的视频中添加OSD?
小白一枚啊,开发遇到了问题,求大神帮助啊。 在BCB对视频采集的程序开发中,遇到了坎。 视频现在可以实时采集,但是怎么在视频上添加OSD啊? 这里有SDK,但是好像不是BCB的。 ``` 4.7 字符OSD叠加设置 本类函数接口主要包含osd叠加参数设置和OSD叠加功能的实现 4.7.1 unsigned (__stdcall *fnOSDCallback)(HDC hdc, unsigned width, unsigned height, void* context) 说明:原始视频数据叠加回调的函数原型 参数:hdc - [in] 视频叠加的窗体 width - [in] 能够叠加的宽度(单位:像素) height - [in] 能够叠加的高度(单位:像素) context - [in] 回调函数的上下文 返回值:0 - 成功;失败则返回错误代码 4.7.2unsigned __stdcall DXSetOSDCallback(device_handle device, fnOSDCallback fn, void* context) 说明:设置视频数据叠加回调的函数 参数:device - [in] 设备句柄 fn - [in] 回调函数指针,NULL - 停止回调 context - [in] 回调函数的上下文 返回值:0 - 成功;失败则返回错误代码 4.7.3 unsigned __stdcall DXSetOSD(device_handle device, unsigned osdType, int x, int y, char* osdData, int pointSize = 120, LPCTSTR faceName = TEXT("Arial"), COLORREF color = RGB(255, 255, 255), COLORREF bgcolor = RGB(0, 0, 0), BOOL opaque = TRUE,unsigned char alpha = 255) 说明:设置原始视频帧数据的OSD 参数:device - [in] 设备句柄 osdType - [in] OSD的类型 x - [in] 指定OSD的左上角横坐标 x - [in] 指定OSD的左上角竖坐标 osdData - [in] OSD的数据,NULL - 取消OSD osdType = osd_text,文本OSD叠加类型,最大MAX_OSD_TEXT_LEN个字符 osdType = osd_time,时间OSD叠加类型 osdType = osd_image,图片OSD叠加类型 pointSize - [in] 字体大小 faceName - [in] 字体名称 color - [in] 针对 osd_text, osd_time 两种类型的OSD的前景色,默认值:白色 (RGB(255, 255, 255)) bgcolor - [in] OSD的背景色,默认值:黑色(RGB(0, 0, 0)) opaque - [in] OSD的背景色是否不透明,默认值:是。当选择透明时,则以 bgcolor 进 行透明处理 alpha - [in] alpha运算值。取值[0 ~ 255],0 - OSD透明,255 - OSD不透明,中间值 – OSD 与视频数据进行alpha运算 返回值:0 - 成功;失败则返回错误代码 ``` 难道直接在Panel中加入Image然后输入文字就好?但是这个控件在视频底层,没办法显示出来,求大神帮助啊。。。。
在C语言环境下的算12问题
给定三个数,问你使用加减乘除能否得到12,要求三个数的顺序可以改变,计算的中间结果必须为整数。 输入:输入三个整数,均大于0,小于1000。 输出:输出为一个整数,当可以得到12时输出1,否则输出0。 输入样例: 2 2 3 输出样例: 1 提示:输出格式:printf("%d\n",1); 主要功能: (1)从文件中读出题目的输入; (2)向屏幕上打印出题目的计算结果。 PS:最好能有多文件结构多函数结构,能有界面处理 (这些我还不太会,所以只能附上一小部分代码,望能得到完善) #include <stdio.h> #include<stdbool.h> bool canBe12(float m, float n, float h) { int i, j, k; float arr[3] = {m, n, h}; for(i = 0; i < 3; i++) { for(j = (i + 1) % 3; j < 3; j++) { k = (j + 1) % 3; if(arr[i] + arr[j] + arr[k] == 12 || arr[i] + arr[j] - arr[k] == 12 || arr[i] - arr[j] + arr[k] == 12 || arr[i] - arr[j] - arr[k] == 12 || arr[i] * arr[j] + arr[k] == 12 || arr[i] + arr[j] * arr[k] == 12 || arr[i] / arr[j] + arr[k] == 12 || arr[i] + arr[j] / arr[k] == 12 || arr[i] * arr[j] - arr[k] == 12 || arr[i] - arr[j] * arr[k] == 12 || arr[i] * arr[j] * arr[k] == 12 || arr[i] * arr[j] / arr[k] == 12 || arr[i] / arr[j] * arr[k] == 12 || arr[i] / arr[j] / arr[k] == 12 || arr[i] / arr[j] - arr[k] == 12 || arr[i] - arr[j] / arr[k] == 12 ) { return 1; } } } return 0; } int main() { FILE *fp; float m, n, k; int i; if((fp=fopen("input.txt","r"))==NULL) printf("ERROR"); while(fscanf(fp,"%f%f%f",&m,&n,&k)==3) if((int)m==m&&(int)n==n&&(int)k==k) { printf("%f %f %f result is:\n",m,n,k); if(canBe12(m,n,k)) printf("1\n"); else printf("0\n"); } return 0; }
网上发现找到一组c语言代码,求帮忙整合成能用
#include <stdio.h>#include <windows.h>#include <stdlib.h>#include <string.h>#ifndef _FUNCTION_H_#define _FUNCITON_H_typedef struct student{ char nameStudent[10]; int numberSudent; int indexN; //已选数量 int elect[20]; //已选课题编号(多个) BOOL whetherNull;}STU;typedef struct pointLengthWidth{ int nx; int ny; int length; int width;}BOX;typedef struct couse{ int numberCouse; //编号 char nameCouse[10]; //课题 char nameTeacher[10];//指导老师 char addTeacher[10];//教研室地址 char nameMajorSelect[10];//可选此课题的专业 int numberSelect; //课程已选人数 int numberSelectMax; //课程人数上限 struct couse *next;}COU;int N = 0;/*STU* messagesStudent(STU *s)void menu(BOX b)void menu2_2(BOX b)void menu2_1(BOX b)void drawBOX(BOX t)int inputInt()void changeCursor(int indexX, int indexY)void password()void changepassword()void cleanScreen()*/STU* messagesStudent(STU *s){ printf("\n请输入你的名字:"); scanf("%s",s->nameStudent); printf("\n请输入你的学号:"); scanf("%d",&s->numberSudent); s->whetherNull=TRUE; return s;}void menu(BOX b){ drawBOX(b); changeCursor(b.nx+b.length/3,b.ny+b.width/2-1); printf("1、student"); changeCursor(b.nx+b.length/3,b.ny+b.width/2); printf("2、teacher"); changeCursor(b.nx+b.length/3,b.ny+b.width/2+1); printf("3、安全退出"); changeCursor(10,1); printf("***学生选题管理系统***"); changeCursor(b.nx,b.ny+b.width+2);}void menu2_2(BOX b){ drawBOX(b); changeCursor(b.nx,b.ny-1); printf("★ teacher ★"); changeCursor(b.nx+b.length/3,b.ny+3); printf("1、载入文件"); changeCursor(b.nx+b.length/3,b.ny+4); printf("2、手动创建"); changeCursor(b.nx+b.length/3,b.ny+5); printf("3、添加"); changeCursor(b.nx+b.length/3,b.ny+6); printf("4、删除"); changeCursor(b.nx+b.length/3,b.ny+7); printf("5、修改"); changeCursor(b.nx+b.length/3,b.ny+8); printf("6、显示所有"); changeCursor(b.nx+b.length/3,b.ny+9); printf("7、储存数据"); changeCursor(b.nx+b.length/3,b.ny+10); printf("8、统计课题"); changeCursor(b.nx+b.length/3,b.ny+11); printf("9、返回上级"); changeCursor(b.nx+b.length/3,b.ny+13); printf("0、修改密码"); changeCursor(0,b.ny);}void menu2_1(BOX b){ drawBOX(b); changeCursor(b.nx,b.ny-1); printf("★ student ★"); changeCursor(b.nx+b.length/3,b.ny+3); printf("1、显示所有课题"); changeCursor(b.nx+b.length/3,b.ny+4); printf("2、显示可选课题"); changeCursor(b.nx+b.length/3,b.ny+5); printf("3、显示已选课题"); changeCursor(b.nx+b.length/3,b.ny+6); printf("4、选课题"); changeCursor(b.nx+b.length/3,b.ny+7); printf("5、退选"); changeCursor(b.nx+b.length/3,b.ny+8); printf("6、课题排序"); changeCursor(b.nx+b.length/3,b.ny+9); printf("7、储存信息"); changeCursor(b.nx+b.length/3,b.ny+10); printf("8、返回上级"); changeCursor(0,b.ny);}void drawBOX(BOX t){ int indexLength = 0; int indexWidth = 0; changeCursor(t.nx, t.ny); for ( indexLength = 0; indexLength <= t.length; indexLength++ ) { printf("★"); } for ( indexWidth = 0; indexWidth <= t.width; indexWidth++ ) { changeCursor(t.nx, t.ny+indexWidth); printf("★"); changeCursor(t.nx+t.length*2,t.ny+indexWidth); printf("★"); } changeCursor(t.nx, t.ny+indexWidth); for ( indexLength = 0; indexLength <= t.length; indexLength++ ) { printf("★"); } return TRUE;};int inputInt(){ int t; printf("请输入功能序号:"); scanf("%d",&t); return t;}void changeCursor(int indexX, int indexY){ COORD dwCursorPosition; HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); if ( INVALID_HANDLE_VALUE == hOutput ) { printf("GetStdHandle error!\n"); return -1; } dwCursorPosition.X = indexX; dwCursorPosition.Y = indexY; if (!SetConsoleCursorPosition(hOutput, dwCursorPosition)) { printf("SetConsoleCursorPosition error!\n"); return -1; }}void cleanScreen(){ int i,j; for(i=0;i<80;i++) //length for(j=1;j<30;j++) //width { changeCursor(i,j); printf(" "); } changeCursor(0,0);}void changepassword(){ char word[15]; FILE *passWordFile; if((passWordFile=fopen("password.txt","w+"))==NULL) { printf("***无法打开密码文件***\n"); exit(0); } printf("\n请输入新密码:"); scanf("%s",word); fprintf(passWordFile,"%s",word); printf("\n***恭喜!修改成功!***\n"); fclose(passWordFile);}void password() /** 输入密码 **/{ char word[15]; FILE *passWordFile; char inputWord[20]; //存放密码的字符数组 char c; //临时存放一个字符 int i,j=1; // printf("******"); if((passWordFile=fopen("password.txt","r+"))==NULL) { printf("***无法打开密码文件***\n"); exit(0); } //printf("+++++++"); fscanf(passWordFile,"%s",word); printf("\n 请输入密码:\n "); while(j) { i=0; while ((c=getch()) != '\r')/**当输入的字符不是回车时,就存放进password[i]当输入回车时,结束循环*/ { inputWord[i] = c; i++; if(c!='\b') //输入内容不是退格时就显示 “*”号 { printf("*"); } else //输入内容是退格时 删除前一个 “*”号 { printf("\b \b"); } } inputWord[i]='\0';//标记结束 if(strcmp(inputWord,word)==0) { printf("\n 恭喜!密码正确!\n"); printf("\n 即将进入 请稍候...\n"); Sleep(1200); j=0; } else printf("密码错误!重新输入!\n"); } fclose(passWordFile);}#endif
如何用zybo板(zynq-7010)上实现变声功能?
网上下了soundtouch库,根据这篇文章 https://www.cnblogs.com/CodeMIRACLE/p/5514806.html 用VS编译出的exe文件效果很好,但不知如何把C++代码直接扔进板子里,用了vivado hls,出现了如下错误,现怀疑大方向就是错的?望诸位指点一二 INFO: [SIM 2] *************** CSIM start *************** INFO: [SIM 4] CSIM will launch GCC as the compiler. Compiling ../../../../../../../../Desktop/fa/src/test.cpp in debug mode csim.mk:81: recipe for target 'obj/test.o' failed ../../../../../../../../Desktop/fa/src/test.cpp: In function 'void DelArray(void*)': ../../../../../../../../Desktop/fa/src/test.cpp:52:12: warning: deleting 'void*' is undefined [-Wdelete-incomplete] delete []pData; ^~~~~ ../../../../../../../../Desktop/fa/src/test.cpp: In function 'bool CombineWaveFile(int, char (*)[256], char*)': ../../../../../../../../Desktop/fa/src/test.cpp:76:48: error: cast from 'FILE* {aka _iobuf*}' to 'int' loses precision [-fpermissive] *(pFileHandle +i)= (int)(fopen(argv[i], "rb")); ^ ../../../../../../../../Desktop/fa/src/test.cpp:90:83: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] int nRead = fread(pRiff_Header+i, 1, sizeof(RIFF_HEADER), (FILE*)(pFileHandle[i])); ^ ../../../../../../../../Desktop/fa/src/test.cpp:101:61: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] nRead = fread(pFmt_Block+i, 1, 8, (FILE*)(*(pFileHandle+i))); ^ ../../../../../../../../Desktop/fa/src/test.cpp:112:101: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] nRead = fread(&((pFmt_Block+i)->wavFormat), 1, (pFmt_Block+i)->dwFmtSize, (FILE*)(*(pFileHandle+i))); ^ ../../../../../../../../Desktop/fa/src/test.cpp:123:62: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] nRead = fread(pFact_Block+i, 1, 8, (FILE*)(*(pFileHandle+i))); ^ ../../../../../../../../Desktop/fa/src/test.cpp:137:106: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] nRead = fread(&((pFact_Block+i)->dwData), 1, sizeof((pFact_Block+i)->dwData), (FILE*)(*(pFileHandle+i))); ^ ../../../../../../../../Desktop/fa/src/test.cpp:147:80: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] nRead = fread(pData_Block+i, 1, sizeof(DATA_BLOCK), (FILE*)(*(pFileHandle+i))); ^ ../../../../../../../../Desktop/fa/src/test.cpp:200:75: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] int nRet = fread(strTemp, 1, sizeof(strTemp)-1, (FILE*)(*(pFileHandle+i))); ^ ../../../../../../../../Desktop/fa/src/test.cpp:204:72: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] nRet = fread(strTemp, 1, sizeof(strTemp)-1, (FILE*)(*(pFileHandle+i))); ^ ../../../../../../../../Desktop/fa/src/test.cpp:206:34: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast] fclose((FILE*)(*(pFileHandle+i))); ^ ../../../../../../../../Desktop/fa/src/test.cpp: In function 'int main()': ../../../../../../../../Desktop/fa/src/test.cpp:226:39: warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings] CombineWaveFile(3, strFile, "out.wav"); ^ make: *** [obj/test.o] Error 1 ERR: [SIM 100] 'csim_design' failed: compilation error(s). INFO: [SIM 3] *************** CSIM finish ***************
MFC edit control控件循环显示问题
各位大佬麻烦帮忙看一下,我想实现枚举进程的功能,一开始使用list box控件但是无法实现换行。。。所以改用edit control,运行后发现只显示最后一个进程,不能循环显示 控件代码如下: ``` void Cprocessor1Dlg::OnBnClickedEnumProcess() { // TODO: 在此添加控件通知处理程序代码 CString str; PROCESSENTRY32 pe; //设置结构体pe的大小 pe.dwSize = sizeof(pe); //获取系统内进程的快照 HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if (hProcessSnap == INVALID_HANDLE_VALUE) { this->MessageBox("CreateToolhelp32Snapshot error.\n"); //return -1; } //遍历进程快照,显示每个进程的信息 BOOL bMore = ::Process32First(hProcessSnap,&pe); while (bMore) { UpdateData(TRUE); str.Format("Process Name:%s\r\nPID:%u\r\nNumber of Thread:%u ",pe.szExeFile,pe.th32ProcessID,pe.cntThreads); //str.Format("Process Name:%s\n",pe.szExeFile); //str.Format("PID:%u\n",pe.th32ProcessID); //str.Format("Number of Thread:%u\n",pe.cntThreads); //str.Format("==========================\n\n"); bMore = ::Process32Next(hProcessSnap,&pe); m_enum1.SetWindowTextA(str); UpdateData(FALSE); } //释放snapshot对象 ::CloseHandle(hProcessSnap); } ``` ![图片说明](https://img-ask.csdn.net/upload/201910/16/1571220161_330500.png)
求教大佬们,这个“读取位置 0xCCCCCCCC 时发生访问冲突。”的异常该如何解决?
程序是数据结构的图的存储和遍历实验,功能是输入一个无向图并将其转换成邻接矩阵,然后把邻接矩阵变成邻接表,最后深度优先遍历该邻接表生成树(VS2017): ``` #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string.h> #include<iostream> using namespace std; typedef int InfoType; #define MAXV 100 //最大顶点个数 #define INF 32767 //INF表示∞ #define isLetter(a) ((((a)>='a')&&((a)<='z')) || (((a)>='A')&&((a)<='Z'))) #define LENGTH(a) (sizeof(a)/sizeof(a[0])) //以下定义邻接矩阵类型 typedef struct { int no; //顶点编号 InfoType info; //顶点其他信息 } VertexType; //顶点类型 typedef struct //图的定义 { char vexnum[MAXV]; int edges[MAXV][MAXV]; //邻接矩阵 int n, e; //顶点数,边数 VertexType vexs[MAXV]; //存放顶点信息 } MGraph, *PGragh; //图的邻接矩阵类型 //以下定义邻接表类型 typedef struct ANode //边的节点结构类型 { int adjvex; //该边的终点位置 struct ANode *nextarc = NULL; //指向下一条边的指针 InfoType *info; //该边的相关信息,这里用于存放权值 } ArcNode; typedef int Vertex; typedef struct Vnode //邻接表头节点的类型 { Vertex data; //顶点信息 ArcNode *firstarc; //指向第一条边 } VNode; typedef VNode AdjList[MAXV]; //AdjList是邻接表类型 typedef struct { AdjList adjlist; //邻接表 int n, e; //图中顶点数n和边数e } ALGraph; //图的邻接表类型 void MatToList(MGraph *g, ALGraph *G) //将邻接矩阵g转换成邻接表G { int i, j; ArcNode *p; //G = (ALGraph *)malloc(sizeof(ALGraph)); for (i = 0; i<g->n; i++) //给邻接表中所有头节点的指针域置初值 G->adjlist[i].firstarc = NULL; for (i = 0; i<g->n; i++) //检查邻接矩阵中每个元素 for (j = g->n - 1; j >= 0; j--) if (g->edges[i][j] != 0) //存在一条边 { p = (ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p p->adjvex = j; p->nextarc = G->adjlist[i].firstarc; //采用头插法插入*p G->adjlist[i].firstarc = p; } G->n = g->n; G->e = g->e; //return G; } void DispMat(MGraph *g) //输出邻接矩阵g { int i, j; for (i = 0; i<g->n; i++) { for (j = 0; j<g->n; j++) printf("%3d", g->edges[i][j]); printf("\n"); } } void DispAdj(ALGraph G) //输出邻接表G { int i; ArcNode *p; for (i = 0; i<G.n; i++) { p = G.adjlist[i].firstarc; printf("%3d: ",i); //cout << i << ":"; while (p != NULL) { //printf("%3d",p->adjvex); cout << p->adjvex << " "; p = p->nextarc; } printf("\n"); } } static int get_position(MGraph g, char ch) { int i; for (i = 0; i<g.n; i++) if (g.vexnum[i] == ch) return i; return -1; } //读取一个输入字符 static char read_char() { char ch; do { ch = getchar(); } while (!isLetter(ch)); return ch; } // 创建无向图 MGraph* create_graph() { char c1, c2; int vex, edge; int i, p1, p2; MGraph* pG; // 输入顶点数和边数 printf("输入顶点数和边数:"); scanf_s("%d%d", &vex, &edge); if (vex < 1 || edge < 1 || (edge >(vex * (vex - 1)))) { printf("input error: invalid parameters!\n"); return NULL; } if ((pG = (MGraph*)malloc(sizeof(MGraph))) == NULL) return NULL; memset(pG, 0, sizeof(MGraph)); // 初始化顶点数和边数 pG->n = vex; pG->e = edge; // 初始化"顶点" printf("输入各顶点名称:\n"); for (i = 0; i < pG->n; i++) { printf("vertex(%d): ", i); pG->vexnum[i] = read_char(); } // 初始化"边" for (i = 0; i < pG->e; i++) { // 读取边的起始顶点和结束顶点 printf("edge(%d):", i); c1 = read_char(); c2 = read_char(); p1 = get_position(*pG, c1); p2 = get_position(*pG, c2); if (p1 == -1 || p2 == -1) { printf("input error: invalid edge!\n"); free(pG); return NULL; } pG->edges[p1][p2] = 1; pG->edges[p2][p1] = 1; } return pG; } // 打印矩阵队列图 void print_graph(MGraph G) { int i, j; printf("Martix Graph:\n"); for (i = 0; i < G.n; i++) { for (j = 0; j < G.n; j++) printf("%d ", G.edges[i][j]); printf("\n"); } } //创建一个树的左子女,右兄弟结构 typedef struct node { int data; node *firstChild = NULL; node *nextSibling = NULL; }TreeNode, *BinTree; int visited[MAXV]; void Dfs(ALGraph G, int i, BinTree &T) { visited[i] = 1; bool first = true;//表示是否为当前节点第一个孩子 TreeNode *locat = new TreeNode;//同样是定位作用 while (G.adjlist[i].firstarc != NULL)//从此节点出发,访问邻接节点。 { if (visited[G.adjlist[i].firstarc->adjvex] == 0) { visited[G.adjlist[i].firstarc->adjvex] = 1; TreeNode *t = new TreeNode;//建立一颗小树 t->data = G.adjlist[i].firstarc->adjvex; if (first)//是当前节点第一个孩子 { T->nextSibling = t;//建立右孩子 first = false;//表示不是传进来的第一个孩子,则是孩子们的兄弟 } else { locat->nextSibling = t; } locat = t; Dfs(G, G.adjlist[i].firstarc->adjvex, t);//继续对小树找兄弟 } G.adjlist[i].firstarc = G.adjlist[i].firstarc->nextarc; } } void DFS_Traverse(ALGraph G, BinTree &T) { TreeNode *locat = new TreeNode;//此处定义一个定位指针,用来定位当前树的位置 for (int i = 1; i <= G.n; i++) { visited[i] = 0; } for (int i = 1; i <= G.n; i++) { if (visited[i] == 0) { TreeNode *t = new TreeNode;//这代表一个小树 t->data = G.adjlist[i].data; if (T == NULL) { T = t;//若树为空,建立头节点 } else { locat->nextSibling = t;//若树不空,则是森林,插入右兄弟 } locat = t;//定位至小树 Dfs(G, i, locat);//建立小树 } } } //建立图深度优先搜索森林 void DFSForest(ALGraph G, BinTree &T) { DFS_Traverse(G, T); } void Display(BinTree T) { if (T) { cout << T->data << ' '; Display(T->firstChild); Display(T->nextSibling); } } //以下主函数用作调试 int main() { //int i, j; MGraph* g, g1; ALGraph G; BinTree T; g = create_graph(); printf("\n"); printf(" 无向图G的邻接矩阵:\n"); DispMat(g); //G = (ALGraph *)malloc(sizeof(ALGraph)); //M = (ALGraph *)malloc(sizeof(ALGraph)); printf(" 图G的邻接矩阵转换成邻接表,顶点名称用编号表示:\n"); MatToList(g, &G); DispAdj(G); DFSForest(G, T); Display(T); system("pause"); } ``` 运行程序,输入顶点和边的信息,能够输出邻接矩阵和邻接表,但到了生成森林那一步就报异常: ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292200_474721.png)![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292211_609361.png) 和同学研究了一下发现问题可能是出在执行到函数 ``` void DFS_Traverse(ALGraph G, BinTree &T) { TreeNode *locat = new TreeNode;//此处定义一个定位指针,用来定位当前树的位置 for (int i = 1; i <= G.n; i++) { visited[i] = 0; } for (int i = 1; i <= G.n; i++) { if (visited[i] == 0) { TreeNode *t = new TreeNode;//这代表一个小树 t->data = G.adjlist[i].data; if (T == NULL) { T = t;//若树为空,建立头节点 } else { locat->nextSibling = t;//若树不空,则是森林,插入右兄弟 } locat = t;//定位至小树 Dfs(G, i, locat);//建立小树 } } } ``` 的最后一个for中的Dfs(G,i,locat);这一句时出了问题,若在该处设置断点再重新运行程序并输入测试数据:![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292585_791337.png) 然后按F11逐行运行,就跳到了函数Dfs()那里: ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292683_31577.png) ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292709_126937.png) ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575292848_579112.png) 这时候按“继续”继续运行,到第二次循环时异常就出现了,请教大佬我应该如何修改这个程序,谢谢
小菜鸟快哭了。error C2365: “free”: 重定义;以前的定义是“函数”
![图片说明](https://img-ask.csdn.net/upload/201904/13/1555146461_40362.png) ``` 下面贴个完整的程序段 int i,j,k,n; //循环变量 void BacktoHome(); void Introduction(); void SpecialOne(); void SpecialMost(); void SpecialLeast(); void PrintAll(); void Away(); void Initial(void) { cout<<endl<<endl<<endl; cout<<" 八 皇 后 问 题 \n"<<flush; cout<<" -------------------------------------------------------------------------\n"<<flush; cout<<" 制作人:lzh \n\n\n"<<flush; cout<<" 请选择以下功能: \n\n"<<flush; cout<<" 1.问题简介 \n\n"<<flush; cout<<" 2.指定第一个皇后的位置情况下有几种方案 \n\n"<<flush; cout<<" 3.在什么位置固定一个皇后,方案的数量最多?具体有哪些方案? \n\n"<<flush; cout<<" 4.在什么位置固定一个皇后,方案的数量最少?具体有哪些方案? \n\n"<<flush; cout<<" 5.八皇后问题共有几种解决方案? \n\n"<<flush; cout<<" 6.退出 \n\n"<<flush; cout<<" 请输入你的选择:"; int choice,check=-1; do{ cin>>choice;cin.ignore(80,'\n'); switch(choice){ case 1: Introduction(); break; case 2: SpecialOne(); break; case 3: SpecialMost(); break; case 4: SpecialLeast(); break; case 5: PrintAll(); break; case 6: Away(); break; default: cout<<"你的输入有误,请重新输入!\n"; } }while(check); } enum States { used, free }; class Stack { int data[8]; int Top; public: Stack() { Top = 0; } ~Stack() { } int Size() { return Top; } bool Push(int); bool Pop(int &); bool StackTop(int &); friend void Empty(Stack &); //置空栈内数据, 在Solve函数执行前使用 }rowStack; bool Stack::Push(int d) { if (Top == 8) return false; else { data[Top] = d; Top++; return true; } } bool Stack::Pop(int &d) { if (!Top) return false; else { Top--; d = data[Top]; return true; } } bool Stack::StackTop(int &d) { if (!Top) return false; else { d = data[Top-1]; return true; } } class Board //一盘棋8*8 { char board[8][8]; States Rows[8], DiagsLR[15], DiagsRL[15]; //行,左右斜线 char PrintBoard[100][8][8]; //输出的棋盘 public: int nNum; //保存一组解的数目 static int AllNum; //保存所有方案的数目 Board(); bool isAttacked(int, int); //处理冲突 void PlaceQueen(int, int); void RemoveQueen(int, int); void Print(int,int); //前一个参数保存一行输出解的个数,后一个参数保存共输出解的数目 void SaveBoard(); //解决一组解后保存到PrintBoard数组中 void SaveAll(); //保存所有八皇后问题的解 friend void Empty(Board &); //置空栈内数据, 在Solve函数执行前使用 }myBoard; int Board::AllNum; Board::Board() //构造函数,初始化为空 { for(int i=0; i<8; i++) { Rows[i] = free; for(int j=0; j<8; j++) board[i][j] = '.'; } for(int k=0; k<15; k++) DiagsLR[k] = DiagsRL[k] = free; } bool Board::isAttacked(int row, int col) //是否冲突,是返回TRUE,否返回FALSE { int diagLR = col-row+7; int diagRL = row+col; if (Rows[row] == used || DiagsLR[diagLR] == used || DiagsRL[diagRL] == used) return true; return false; } void Board::PlaceQueen(int row, int col) //放皇后 { int diagLR = col-row+7; //左对角线元素 int diagRL = row+col; //右对角线元素 board[row][col] = 'Q'; Rows[row] = used; DiagsLR[diagLR] = used; DiagsRL[diagRL] = used; } void Board::RemoveQueen(int row, int col) //移去皇后 { int diagLR = col-row+7; int diagRL = row+col; board[row][col] = '.'; Rows[row] = free; DiagsLR[diagLR] = free; DiagsRL[diagRL] = free; } void Board::Print(int c,int num) { if(c==N){ //输出对应的所有解,一行排列五组 for(i=0;i<num;i++){ if(num-i<N) break; //当剩余解数大于五组可以并排显示时 for(j=0;j<8;j++){ for(n=0;n<N;n++){ for(k=0;k<8;k++) cout<<PrintBoard[i+n][j][k]<<' '<<flush; cout<<'\t'; } cout<<'\n'; } //至此已经完成输出一排五组解 i+=N-1; //跳过已输出的五组解 cout<<"按任意键继续. . .\n"<<flush; getch(); } if(num-i<N&&(num-i)!=0) //当剩余方案不足五个且多于零个时 { int n=i; for(j=0;j<8;j++){ while(n!=num) { for(k=0;k<8;k++) cout<<PrintBoard[n][j][k]<<' '<<flush; cout<<'\t'; n++; } cout<<'\n'; n=i; //使n指向第i个解的位置 } } cout<<"输出完毕,共输出了"<<num<<"组方案\n"<<flush; cout<<"按任意键返回\n"<<flush; getch(); BacktoHome(); } if(c==1){ for(i=0;i<num;i++){ for(j=0;j<8;j++){ for(k=0;k<8;k++) cout<<PrintBoard[i][j][k]<<' '; cout<<'\n'; } cout<<"按任意键继续\n"; getch(); } cout<<"输出完毕,共输出了"<<num<<"组方案\n"; cout<<"按任意键返回\n"; getch(); BacktoHome(); } } void Empty(Board &myBoard) //置空栈内数据,以便下一次Solve函数的执行 { for(int i=0; i<8; i++) { myBoard.Rows[i] = free; for(int j=0; j<8; j++) myBoard.board[i][j] = '.'; } for(int k=0; k<15; k++) myBoard.DiagsLR[k] = myBoard.DiagsRL[k] = free; } void Empty(Stack &rowStack) //置空栈内数据,以便下一次Solve函数的执行 { rowStack.Top = 0; } void Board::SaveBoard() { for(int i=0;i<8;i++) for(int j=0;j<8;j++) PrintBoard[nNum][i][j]=board[i][j]; nNum++; } void Board::SaveAll() { for(int i=0;i<8;i++) for(int j=0;j<8;j++) PrintBoard[Board::AllNum][i][j]=board[i][j]; Board::AllNum++; } void Solve(int qRow,int qCol) //实际处理八皇后置放问题 { int row,col,exitLoop,attacked; myBoard.nNum=0; //每执行一次Solve函数,先将nNum置空,并在函数执行后及时保存nNum的值 Empty(myBoard); Empty(rowStack);//置空栈内数据,以便下一次Solve函数的执行 myBoard.PlaceQueen(qRow,qCol); if (qCol == 0) col = 1; else col = 0; row = 0; do { while(row < 8) //超界 { exitLoop = 0; if (!(attacked = myBoard.isAttacked(row,col))) //若无皇后,条件成立 { myBoard.PlaceQueen(row,col); //放皇后 rowStack.Push(row); //入栈 row = 0; col++; if (col == qCol) col++; exitLoop = 1; } if (exitLoop) break; //找到退出本层循环 else row++; // 到下一行 } if (col == 8) { myBoard.SaveBoard(); row = 8; } if (row == 8) { rowStack.Pop(row); col--; //到前一列 if (col == qCol) col--; myBoard.RemoveQueen(row,col); //移去皇后 row++; //找下一个位置 } }while(col>=0); } void SolveAll() { for(i=0;i<7;i++){ int row=i,col=0,exitLoop,attacked; Empty(myBoard); Empty(rowStack);//置空栈内数据,以便下一次Solve函数的执行 do { while(row < 8) //超界 { exitLoop = 0; if (!(attacked = myBoard.isAttacked(row,col))) //若无皇后,条件成立 { myBoard.PlaceQueen(row,col); //放皇后 rowStack.Push(row); //入栈 row = 0; col++; exitLoop = 1; } if (exitLoop) break; //找到退出本层循环 else row++; // 到下一行 } if (col == 8) { myBoard.SaveAll(); row = 8; } if (row == 8) { rowStack.Pop(row); col--; //到前一列 myBoard.RemoveQueen(row,col); //移去皇后 row++; //找下一个位置 } }while(col>=0); } } void BacktoHome() { // system("cls"); Initial(); } void SpecialOne() { // system("cls"); int row,col; do{ cout<<"输入第一个皇后的位置(1~8):\n行坐标:"; cin>>row; cout<<"列坐标:"; cin>>col; if(!(row<=8&&row>=1&&col<=8&&col>=1)) cout<<"你的输入有误,请重新输入:\n"; }while(!(row<=8&&row>=1&&col<=8&&col>=1)); Solve(row-1,col-1); cout<<"固定该位置的皇后后共有"<<myBoard.nNum<<"组方案\n"; cout<<"是否输出所有这些方案?(Y/N)"; char c='a'; while(c){ cin>>c;cin.ignore(80,'\n'); if(c=='y'||'Y'){ myBoard.Print(N,myBoard.nNum); break; } else if(c=='n'||'N'){ BacktoHome(); break; } else cout<<"你的输入有误,请重新输入!\n"; } } void SpecialMost() { // system("cls"); int qRow,qCol; //储存最多方案解皇后的位置 int row,col=-1; int max=0; //储存最多方案解的个数 cout<<"可以把皇后固定在某一列上来查找最多解\n"; cout<<"把皇后固定在哪一列?"; do{ cin>>col; cin.ignore(80,'\n'); if(!(col<=8&&col>=1)) cout<<"你的输入有误,请重新输入!"; }while(!(col<=8&&col>=1)); for(row=0;row<8;row++){ Solve(row,col-1); if(max<myBoard.nNum){ max=myBoard.nNum; qRow=row;qCol=col; } } cout<<"\n在你输入的这一列位置上,八皇后问题方案解最多的有"<<max<<"种\n"<<flush; cout<<"它的位置在第"<<qRow+1<<"行,"<<"第"<<qCol<<"列\n"<<flush; cout<<"是否输出该情况下的所有方案?(Y/N)"<<flush; char c; do{ cin>>c;//cin.ignore(80,'\n'); if(c=='Y'||'y'){ myBoard.Print(N,max); break; } else if(c=='N'||'n'){ BacktoHome(); break; } else cout<<"你的输入有误,请重新输入!"; }while(c); } void SpecialLeast() { // system("cls"); int qRow,qCol; //储存最少方案解皇后的位置 int row,col=-1; int min=100; //储存最少方案解的个数 cout<<"可以把皇后固定在某一列上来查找最少解\n"; cout<<"把皇后固定在哪一列?"; do{ cin>>col; //cin.ignore(80,'\n'); if(!(col<=8&&col>=1)) cout<<"你的输入有误,请重新输入!"; }while(!(col<=8&&col>=1)); for(row=0;row<8;row++){ Solve(row,col-1); if(min>myBoard.nNum){ min=myBoard.nNum; qRow=row;qCol=col; } } cout<<"在你输入的这一列位置上,八皇后问题方案解最少的有"<<min<<"种\n"<<flush; cout<<"它的位置在第"<<qRow+1<<"行,"<<"第"<<qCol<<"列\n"<<flush; cout<<"是否输出该情况下的所有方案?(Y/N)"<<flush; char c; do{ cin>>c;//cin.ignore(80,'\n'); if(c=='Y'||'y'){ myBoard.Print(N,min); break; } else if(c=='N'||'n'){ BacktoHome(); break; } else cout<<"你的输入有误,请重新输入!"; }while(c); } void PrintAll() { SolveAll(); cout<<"八皇后问题共有"<<Board::AllNum<<"种解方案"<<endl<<flush; cout<<"是否输出所有这些解?(Y/N)"<<flush; char c; do{ cin>>c; if(c=='Y'||'y') myBoard.Print(N,Board::AllNum); else if(c=='N'||'n') break; else cout<<"你的输入有误,请重新输入!"; }while(c); cout<<"按任意键返回"; getch(); BacktoHome(); } void Introduction() { cout<<"输出关于八皇后问题的介绍"<<flush; cout<<"按任意键返回\n"<<flush; getch(); BacktoHome(); } void Away() { // system("cls"); cout<<endl<<endl<<endl; cout<<" 八 皇 后 问 题 \n"<<flush; cout<<" -------------------------------------------------------------------------\n"<<flush; cout<<" 制作人:lzh \n\n\n"<<flush; cout<<endl<<flush; cout<<" "<<endl<<flush; cout<<" ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ "<<endl<<flush; cout<<" * * "<<endl<<flush; cout<<" * 谢谢你对本软件的支持 欢迎再次使用 * "<<endl<<flush; cout<<" * * "<<endl<<flush; cout<<" ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ "<<endl<<flush; cout<<"\n\n\n\n\n\n\n\n\n"<<flush; } void main() { Initial(); } ``` ```
要把结构数据以二叉树的形式储存到文件里然后能调用修改怎么做?语言是C++(求帮忙完善代码)
代码是这样,还没做完 #include<iostream> #include<cstring> #include<stdio.h> #include<stdlib.h> #include<windows.h> using namespace std; bool function(char a[],char b[]) { int n = 0; if(strlen(a)==strlen(b)) { while(a[n]!='\0' && b[n]!='\0') { if(a[n] == b[n]) n++; else return 0; } } else return 0; return 1; }//对比两个字符数组是否相等的函数 struct FamilyTree { char name[50]; int birthday; int dieday; int sex; int height; int weight; bool marriage; int edu; char prof[50]; FamilyTree *child; FamilyTree *brother; };//要储存的结构 FamilyTree searchtg(char name[50],FamilyTree *tg) { FamilyTree *n=NULL; if(function(tg->name,name))return *tg; else { if(tg->child!=NULL)*n=searchtg(name,tg->child); if((tg->brother!=NULL)&&(n==NULL))*n=searchtg(name,tg->brother); return *n; } }//在二叉树里找节点的函数 FamilyTree searchrelation(char name[50],FamilyTree *tg) { FamilyTree *n=tg->brother; FamilyTree *s=tg->child; if(function(s->name,name))return *s; if(function(n->name,name))return *n; if(tg->child!=NULL)*s=searchrelation(name,tg->child); if(tg->brother!=NULL)*n=searchrelation(name,tg->brother); if(s!=NULL)if(function(s->name,name))return *s; if(n!=NULL)if(function(n->name,name))return *n; n=NULL; return *n; }//在二叉树里找某个节点的相关节点的函数 void readinfo(FamilyTree *p) { cout<<"请输入姓名"<<endl; cin>>p->name; cout<<"请输入出生日期"<<endl; cin>>p->birthday; cout<<"请输入死亡日期(仍在世则输入0)"<<endl; cin>>p->dieday; cout<<"请输入性别(1为男0为女)"<<endl; cin>>p->sex; cout<<"请输入身高(cm)体重(kg)"<<endl; cin>>p->height; cin>>p->weight; cout<<"请输入婚姻状况(0为未婚1为已婚)"<<endl; cin>>p->marriage; cout<<"请输入学历(0为未接受教育,1为中专及以下,2为大学及大专,3为研究生,4为博士生及以上"<<endl; cin>>p->edu; cout<<"请输入职位"<<endl; cin>>p->prof; } //读数据 void showinfo(FamilyTree *p) { cout<<"姓名:"<<p->name<<endl; cout<<"性别:"; if(p->sex==1)cout<<"男"<<endl; else cout<<"女"<<endl; cout<<"出生日期:"<<p->birthday; if(p->dieday==0)cout<<" 尚在世"<<endl; else cout<<" 死亡日期:"<<p->dieday<<endl; cout<<"身高:"<<p->height<<" "<<"体重:"<<p->weight<<endl; cout<<"婚姻状况:"; if(p->marriage)cout<<"已婚"<<endl; else cout<<"未婚"<<endl; cout<<"学历:"; switch(p->edu) { case 0:cout<<"未接受教育"<<endl;break; case 1:cout<<"中专及以下"<<endl;break; case 2:cout<<"大学及大专"<<endl;break; case 3:cout<<"研究生"<<endl;break; case 4: cout<<"博士生及以上"<<endl;break; } cout<<"职位:"<<p->prof<<endl; }//展示数据 void deleteTree() { char filename[100]; scanf("%s",&filename); int i=0; while(filename[i]!='\0')i++; filename[i++]='.'; filename[i++]='d'; filename[i++]='a'; filename[i++]='t'; if(remove(filename)) printf("无法删除家谱文件 %s \n",filename); else printf("家谱文件已删除 \n"); }//删除一个文件 void add(FamilyTree *th) { FamilyTree *s,*n; int od; char name[50]; s=new FamilyTree; s->child=NULL; s->brother=NULL; readinfo(s); cin>>name; *n=searchtg(name,th); if(n!=NULL) { cout<<"请输入亲缘关系(1为加入者是兄弟姐妹,2为加入者是儿子女儿)"<<endl; cin>>od; if(od==2)n=n->child; while(n->brother!=NULL)n=n->brother; n->brother=s; } else cout<<"错误!此家谱中没有该人"<<endl; }//在二叉树上增加一个节点 void remove(FamilyTree *th) { char name[50]; cin>>name; FamilyTree *n,*s; *n=searchtg(name,th); if(n==NULL)cout<<"错误!此家谱中没有该人人!"<<endl; else { *s=searchrelation(n->name,th); if(s->child==n) { if(n->brother!=NULL)s->child=n->brother; else s->child=NULL; delete n; } if(s->brother==n) { if(n->brother!=NULL)s->brother=n->brother; else s->brother=NULL; delete n; } } }//删除二叉树上一个节点 void search(FamilyTree *th) { char name[50]; cin>>name; FamilyTree *n; *n=searchtg(name,th); if(n==NULL)cout<<"错误!此家谱中没有该人人!"<<endl; else showinfo(n); }//展示某个节点的数据 void change(FamilyTree *th) { char name[50]; int od; cin>>name; FamilyTree *n; *n=searchtg(name,th); if(n==NULL)cout<<"错误!此家谱中没有该人人!"<<endl; else { cout<<"请输入要更改的项目(1为名字,2为出生日期,3为死亡日期,4为身高,5为体重,6为结婚情况,7为教育程度,8为职位,输入0则退出)"<<endl; while(cin>>od!=0) switch(od) { case 1:{cout<<"请输入新名字"<<endl; cin>>n->name;break;} case 2:{cout<<"请输入新的出生日期"<<endl; cin>>n->birthday;break;} case 3:{cout<<"请输入死亡日期(仍在世则输入0)"<<endl; cin>>n->dieday;break;} case 4:{cout<<"请输入身高(cm)"<<endl; cin>>n->height;break;} case 5:{cout<<"请输入体重(kg)"<<endl; cin>>n->weight;break;} case 6:{cout<<"请输入婚姻状况(0为未婚1为已婚)"<<endl; cin>>n->marriage;break;} case 7:{cout<<"请输入学历(0为未接受教育,1为中专及以下,2为大学及大专,3为研究生,4为博士生及以上"<<endl; cin>>n->edu;break;} case 8:{cout<<"请输入职位"<<endl; cin>>n->prof;break;} } } }//修改某个节点的数据 void operateTree(FamilyTree *th) { int o; cout<<"请选择操作:"<<endl; cout<<"1,添加 2.删除 3.查看 4.修改"<<endl; cin>>o; switch(o) { case 1:add(th);break; case 2:remove(th);break; case 3:search(th);break; case 4:change(th);break; } }//对某个树进行操作 void operate() { int o; FamilyTree *n; char ansname[50]; cout<<"请选择操作:"<<endl; cout<<"1,添加新家谱 2.删除家谱 3.操作现有家谱"<<endl; cin>>o; switch(o) { // case 1:addTree();break; //这个是增加一个新的树,每棵树创建一1个单独的dat文件储存,文件名为根节点的name……但是我不知道怎么做 case 2:deleteTree();break; case 3: { cout<<"请输入树的祖先的名称"<<endl; cin>>name; n=getTree(name) //这个程序我没有写,要完成的功能是把对应名字的dat文件中的二叉树读出来,然后n为其根节点 operateTree(); break; } } } //未完成 int main() { operate(); } 大概就是我不知道怎么用文件储存二叉树,也不知道怎么读出来,希望大家帮帮忙
c++主函数返回失败的问题!求指教
``` #include <stdio.h> #include <string.h> #define max 220 struct bigint{ int digit[max/4],size; void init(){ size = 0; for(int i=0;i<max;i++){ digit[i] = 0; } } void set(char *a){ init(); int sl = strlen(a),j=0,k=1,t=0; for(int i=sl-1;i>=0;i--){ t+= k*(a[i]-'0'); k*=10; j++; if(j==4||i==0){ k = 1; digit[size++] = t; t = j = 0; } } } void output(){ for(int i=size-1;i>=0;i--){ if(i!=size-1) printf("%04d",digit[i]); else printf("%d",digit[i]); } printf("\n"); } bigint operator + (const bigint &a) const { int l=size>a.size?size:a.size,carry=0; bigint ret; ret.init(); for(int i=0;i<l;i++){ int t = digit[i]+a.digit[i]+carry; carry = t/10000; ret.digit[ret.size++]=t%10000; } if(carry!=0) ret.digit[ret.size++] = carry; return ret; } }a,b,c; int main(){ char str1[max],ch; int l=0; bool flag=false; do{ ch=getchar(); }while(ch=='0'); do{ str1[l++]=ch; ch=getchar(); }while(ch!='\n'); str1[l++] = 0; a.set(str1); l=0; do{ ch=getchar(); }while(ch=='0'); do{ str1[l++]=ch; ch=getchar(); }while(ch!='\n'); str1[l++] = 0; b.set(str1); // a.set(str1); // b.set(str1); // a.output(); // b.output(); c = a+b; c.output(); printf("OK\n");//执行完这句不return 0 return 0; } ``` 代码如上图: 功能是把两个长整数相加。 然而神奇的事情发生了,如图!printf("OK\n")执行了,return值却不对! ![图片说明](https://img-ask.csdn.net/upload/201902/27/1551276441_24765.png)
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Android性能优化(4):UI渲染机制以及优化
文章目录1. 渲染机制分析1.1 渲染机制1.2 卡顿现象1.3 内存抖动2. 渲染优化方式2.1 过度绘制优化2.1.1 Show GPU overdraw2.1.2 Profile GPU Rendering2.2 卡顿优化2.2.1 SysTrace2.2.2 TraceView 在从Android 6.0源码的角度剖析View的绘制原理一文中,我们了解到View的绘制流程有三个步骤,即m...
微服务中的Kafka与Micronaut
今天,我们将通过Apache Kafka主题构建一些彼此异步通信的微服务。我们使用Micronaut框架,它为与Kafka集成提供专门的库。让我们简要介绍一下示例系统的体系结构。我们有四个微型服务:订单服务,行程服务,司机服务和乘客服务。这些应用程序的实现非常简单。它们都有内存存储,并连接到同一个Kafka实例。 我们系统的主要目标是为客户安排行程。订单服务应用程序还充当网关。它接收来自客户的请求...
致 Python 初学者们!
作者| 许向武 责编 | 屠敏 出品 | CSDN 博客 前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 Python 这门编程语言,从2009年开始单一使用 Python 应对所有的开发工作,直至今...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
SpringBoot2.x系列教程(三十六)SpringBoot之Tomcat配置
Spring Boot默认内嵌的Tomcat为Servlet容器,关于Tomcat的所有属性都在ServerProperties配置类中。同时,也可以实现一些接口来自定义内嵌Servlet容器和内嵌Tomcat等的配置。 关于此配置,网络上有大量的资料,但都是基于SpringBoot1.5.x版本,并不适合当前最新版本。本文将带大家了解一下最新版本的使用。 ServerProperties的部分源...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
爬取薅羊毛网站百度云资源
这是疫情期间无聊做的爬虫, 去获取暂时用不上的教程 import threading import time import pandas as pd import requests import re from threading import Thread, Lock # import urllib.request as request # req=urllib.request.Requ...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
HTML5适合的情人节礼物有纪念日期功能
前言 利用HTML5,css,js实现爱心树 以及 纪念日期的功能 网页有播放音乐功能 以及打字倾诉感情的画面,非常适合情人节送给女朋友 具体的HTML代码 具体只要修改代码里面的男某某和女某某 文字段也可自行修改,还有代码下半部分的JS代码需要修改一下起始日期 注意月份为0~11月 也就是月份需要减一。 当然只有一部分HTML和JS代码不够运行的,文章最下面还附加了完整代码的下载地址 &lt;!...
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问