VS2019未到return就突然函数执行结束

图片说明
构造函数执行到第47行就返回了,断点检测到的,程序没有爆出任何异常。
之前代码都一直是正常执行的,突然一次编译就这样了
而且突然所有的数据绑定和命令绑定都失效了。
有谁遇见过吗?

<Page xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"  x:Class="VRnew.View.ManagePatientView"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       xmlns:local="clr-namespace:VRnew.View"
      mc:Ignorable="d" 

      DataContext="{Binding managePatientViewModel, Source={StaticResource Locator}}"
      x:Name="ManagePatientVMPage"
      Title="ManagePatientView">

            <telerik:RadButton x:Name="FlushButton" Grid.Row="4" Grid.Column="0"
                           Content="刷新"  FontSize="25"
                           Command="{Binding DataContext.FlushPatient ,ElementName=ManagePatientVMPage}" 
                            telerik:StyleManager.Theme="Office2016Touch"
            ></telerik:RadButton>

这是View层的

private RelayCommand _flushpatient;
        public RelayCommand FlushPatient =>
        _flushpatient ?? (_flushpatient = new RelayCommand
        (async () =>
        {
            PatientInformationIE = managePatientModel.GetAllPatient(); 
        })
        );

这是VM层的,点击flush按钮没有触发command,断点不执行这里。

Great_Enterprise
Great_Enterprise 解决了,因为在构造函数中,GetAllpatient()中的异常不出现,也进而影响了别的数据绑定和Command绑定
大约 2 个月之前 回复

1个回答

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
python如何在A函数内执行B函数时退出A函数
如下,如何在eve函数内部调用的up(),down(),right()或left()这四个函数之一执行时,返回0并结束while循环 ``` import pygame as py import sys ''' 这里定义了up(),down(),left(),right()和go()四个函数, 这四个函数都是死循环 ''' def eve(): for event in py.event.get(): if event.type == QUIT: sys.exit() elif event.type == KEYDOWN: if event.key == K_w: up() return 0 elif event.key == K_s: down() return 0 elif event.key == K_a: left() return 0 elif event.key == K_d: right() return 0 return 1 while eve(): go() ``` 我C币为0,所以没悬赏,我是小白,请多包涵!
类中的成员函数new出来的内存在调用结束时会被释放吗
class A { public: char* fun() { return new char[10] ; } } ; int main() { A * a = new A() ; char * p = a.fun() ; return 0 ; } 如果fun()是一个普通函数而不是类的成员函数,那么new出来的内存在函数执行完以后肯定是被释放的。但这里是类的成员变量,当主函数执行完 char * p= a.fun() 以后,p是否指向了fun()申请的内存?
关于VS的一个小测试程序问题,函数调用顺序
新手学C++,把C++ primer 上的两个例子用Visual Studio 2010弄到一起的时候出现了一个问题。 一共用了三个函数放在三个cpp文件,被调用的两个均用头文件进行了声明。 两个函数实现的功能很简单分别是:1、多个数相加求和(plus()) 2、输入两个数字作为上界和下界并求和。(two_num()) 问题出现在:在main函数下进行调用的时候, 先调用two_num();再调用plus()可以正常执行。 #include "1-4-3.h" #include "1-4-4.h" int main() { two_num(); //函数1 std::cout<<"多个数相加"<<std::endl<<std::endl<<"输入各数字,以ctrl+z,回车结束输入。"<<std::endl<<std::endl; plus(); //函数2,两个函数调换先后顺序执行,就出错。即把上面的two_num()剪切到plus()下面,再执行就出错 system("pause"); return 0; } ![CSDN移动问答][1] 如果先调用plus();再调用two_num();则会出错,只能执行出第一个函数的结果,第二个就无法输入了。 int main() { std::cout<<"多个数相加"<<std::endl<<std::endl<<"输入各数字,以ctrl+z,回车结束输入。"<<std::endl<<std::endl; plus(); //函数2 two_num(); //函数1 system("pause"); return 0; } ![CSDN移动问答][2] 项目截图:![CSDN移动问答][3] 各文件内容: //1-4-3.h int two_num(); //1-4-4.h int plus(); //1-4-3.cpp #include <iostream> int two_num() { std::cout<<"Enter two numbers: "<<std::endl; int v1,v2; std::cin>>v1>>v2; int lower,upper; if (v1<=v2){ lower=v1; upper=v2; } else { lower=v2; upper=v1; } int sum=0; for (int val=lower; val<=upper; ++val) sum += val; std::cout<<"Sum of "<<lower<<" to "<<upper <<" inclusive is "<<sum<<std::endl; return 0; } //1-4-4.cpp #include<iostream> int plus() { int sum=0,value; while (std::cin>>value) sum += value; std::cout<<"Sum is: "<<sum<<std::endl; return 0; } //main.cpp #include <iostream> #include "1-4-3.h" #include "1-4-4.h" int main() { std::cout<<"多个数相加"<<std::endl<<std::endl<<"输入各数字,以ctrl+z,回车结束输入。"<<std::endl<<std::endl; plus();//函数2,两个函数调换先后顺序执行,就出错。即把上面的two_num()剪切到plus()下面,再执行就出错 two_num();//函数1 system("pause"); return 0; } [1]: http://img.my.csdn.net/uploads/201309/14/1379154433_5302.PNG [2]: http://img.my.csdn.net/uploads/201309/14/1379154432_5147.PNG [3]: http://img.my.csdn.net/uploads/201309/14/1379154645_5228.PNG **请教了下学长,讨论后找到了解决方法。原理不知道对不对。** *问题可能出现在函数plus()的输入结束上面。C++ primer上有说要结束输入“需要输入文件结束符 windows下是Ctrl+z,或者遇到无效输入时(如读取了一个不是整数的值),则istream对象是无效的。处于无效状态的istream对象将导致条件失败”。 先执行two_num函数再执行plus没出现问题是由于前者输入均为有效状态。 换过之后,由于执行plus函数后已经输入了结束符导致istream对象无效,导致后续无法进行输入,故two_num函数无法正常调用。 (即不能用文件结束符或者非整数的数值作为输入结束,而应该用一个自定的结束标志结束输入,如下面修改的代码) 检测方法是把plus中的语句while (std::cin>>value)改成 int plus() { int sum=0,value; std::cin>>value; while (value!=0) { sum += value; std::cin>>value; } std::cout<<"Sum is: "<<sum<<std::endl; return 0; }*
怎么把js函数的参数变成全局变量,用到后面的函数中运算
通过函数计算得到gwp的数值,如果转化成全局变量值,用到后面的绘图函数中 ``` var gwp1=[]; $(function(){ var dom = document.getElementById("box4"); var myChart = echarts.init(dom); var app = {}; option = null; var y_f = []; //全局变量,wgid在gognweizongtu.js中获取 var gwp = 0; var xishu = [0.4,0.2,0.3,0.1]; var pjx = ["gzp","gyp","wlp","ryp"]; var pj = {"gongzhuang":"OK", "gongyi": "OK", "wuliao": "OK", "renyuan": "OK"}; var guige = [90, 90, 80, 75,85]; var xiang = ["gongzhuang","gongyi","wuliao","renyuan"]; for (var i = 0 ; i< xiang.length ; i++) { var lent = data[xiang[i]].y.length ; var ind = lent - 1 ; y_f.push(data[xiang[i]].y[ind]); if (data[xiang[i]].y[ind] < guige[i]){ pj[xiang[i]] = "NOK"; } document.getElementById(pjx[i]).innerHTML = pj[xiang[i]]; gwp += y_f[i]*xishu[i]; } y_f.push(88); if (gwp > 85.5){ document.getElementById("gwpj").innerHTML ="OK"; } gwp = gwp.toFixed(2); /*绘图代码省略*/ }; if (option && typeof option === "object") { myChart.setOption(option, true); } }) ``` 上部分代码得到gwp的数值,如何用到后面的画圆代码 darwPro("myCanvas",gwp/100);,画圆时老是提示gwp值为空 ``` <!-- 圆弧绘制--> //画圆方法 function drawArc(canvas,begin,end,color) { canvas.beginPath(); canvas.lineWidth = 6; canvas.fillStyle = "#ffffff"; canvas.strokeStyle = color; canvas.arc(48, 48, 40, begin,end); canvas.fill(); canvas.stroke(); canvas.closePath(); } //添加文字方法 function drawWord(canvas,text){ canvas.font = 'bold 20px arial'; canvas.fillStyle = 'red'; canvas.fillText(text, 30,53); } //每100毫秒画一次,300毫秒完成 function darwPro(id,rate){ //获取画布对象 var canvasID = document.getElementById("myCanvas"); var canvas = canvasID.getContext("2d"); window.alert(rate); //先画背景 drawArc(canvas,-0.5*Math.PI,1.5*Math.PI,"#EDEDED"); //setInterval()函数至少执行一次(当rate为零时直接返回) if(rate == 0){ return; } //为了体现动态图使用分段画图的策略 var begin = -0.5*Math.PI;//起始角度 var end = 2*Math.PI*rate-0.5*Math.PI;//结束角度 var add = 2*Math.PI*rate/10;//分段的增量 //分10次完成每次间隔50毫秒 var sid = setInterval(function(){ if(begin >= end){ clearInterval(sid); return;//此处必须return;因为即使clearInterval,函数仍然会执行一次导致比例不准确 } drawArc(canvas,begin, begin + add,"green"); //下次起始位置置为上次结束的位置 begin = begin + add; }, 50); //显示百分比的文字 drawWord(canvas,rate*100 + "%"); } darwPro("myCanvas",gwp/100); ```
服务程序不执行ServiceMain函数
// 一个简单服务程序的开发.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<Windows.h> #include<tchar.h> #include<stdio.h> #include"string.h" #include<WinSvc.h> /*首先定义宏作为服务名称*/ #define SERVICE_NAME _T("FirstService") SERVICE_STATUS g_status; SERVICE_STATUS_HANDLE g_hServiceStatus; HANDLE g_hEvent=NULL; /*封装一个用于初始化全局变量的函数Init*/ void Init() { g_status.dwServiceType =SERVICE_WIN32_OWN_PROCESS; g_status.dwCurrentState =SERVICE_STOPPED; //设置服务可以使用的控制 //如果希望服务启动后不能停止,去掉SERVICE_ACCEPT_STOP //SERVICE_ACCEPT_PAUSE_CONTINUE表示服务可以“暂停/继续" g_status.dwControlsAccepted =SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_PAUSE_CONTINUE|SERVICE_ACCEPT_SHUTDOWN; g_status.dwWin32ExitCode =0; g_status.dwServiceSpecificExitCode =0; g_status.dwCheckPoint =0; g_status.dwWaitHint =0; //创建事件为有信号的手动内核事件 g_hEvent=CreateEvent(NULL,TRUE,TRUE,_T("Pause")); } //封装一个设置服务状态的函数SetStaus void SetStatus(long lCurrentStatus) { g_status.dwCurrentState =lCurrentStatus; SetServiceStatus(g_hServiceStatus,&g_status); } /*封装服务控制函数Handle*/ void WINAPI Handler(DWORD dwOpcode) { switch(dwOpcode) { case SERVICE_CONTROL_STOP: { SetStatus(SERVICE_STOP_PENDING); SetStatus(SERVICE_STOPPED); } break; case SERVICE_CONTROL_PAUSE: { SetStatus(SERVICE_PAUSE_PENDING); ResetEvent(g_hEvent); SetStatus(SERVICE_PAUSED); } break; case SERVICE_CONTROL_CONTINUE: { SetStatus(SERVICE_CONTINUE_PENDING); SetEvent(g_hEvent); SetStatus(SERVICE_RUNNING); } break; case SERVICE_CONTROL_INTERROGATE: break; case SERVICE_CONTROL_SHUTDOWN: { SetStatus(SERVICE_STOP_PENDING); SetStatus(SERVICE_STOPPED); } break; default: break; } } //封装服务功能函数 void Run() { while(1) { TCHAR tcBuffer[4]={0};//准备较小内存,先试探实际需要内存大小 DWORD dwNeededSize=GetLogicalDriveStrings(4,tcBuffer);//第一次执行,获得实际内存。 if(dwNeededSize>4) { TCHAR *pBuffer=new TCHAR[dwNeededSize]; DWORD dwNeededSize=GetLogicalDriveStrings(dwNeededSize,pBuffer);//获得路基驱动字符串 TCHAR *pDrive=pBuffer; int ipreLength=0; while(1) { pDrive=pBuffer+ipreLength;//获得下一个驱动器 if(pDrive[0]==0) { break;//退出循环 } DWORD dwDriveType=GetDriveType(pDrive);//获取驱动器类型 if(dwDriveType==DRIVE_REMOVABLE) {//如果是移动驱动器 TCHAR tcFile[MAX_PATH]={0}; _stprintf(tcFile,_T("%sa.txt"),pDrive); //打开已存在的文件 HANDLE hFile=CreateFile(tcFile,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); if(hFile==INVALID_HANDLE_VALUE) { hFile=CreateFile(tcFile,GENERIC_WRITE|GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL); DWORD dwWrite=0; WriteFile(hFile,_T("hello"),5,&dwWrite,NULL); } CloseHandle(hFile); } ipreLength+=_tcslen(pDrive);//跳过当前驱动器 ipreLength+=sizeof(TCHAR);//跳过“\0” } Sleep(500);//暂停500ms继续扫描 //如果g_hEvent无信号则暂停 WaitForSingleObject(g_hEvent,INFINITE); } } } void WINAPI ServiceMain(DWORD dwArgc,LPTSTR*lpszArgv) { //注册控制请求句柄 g_hServiceStatus=RegisterServiceCtrlHandler(SERVICE_NAME,Handler); if(g_hServiceStatus==NULL) return ; SetStatus(SERVICE_START_PENDING); SetStatus(SERVICE_RUNNING); //当Run函数返回时,服务已经结束 Run(); g_status.dwWin32ExitCode =S_OK; g_status.dwCheckPoint =0; g_status.dwWaitHint =0; g_status.dwCurrentState =SERVICE_STOPPED; //设置服务状态为停止,从而退出服务 SetServiceStatus(g_hServiceStatus,&g_status); } //判断服务是否安装函数IsInstalled BOOL IsInstalled() { BOOL bResult=FALSE; //打开控制管理器 SC_HANDLE hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if(hSCM!=NULL) { //打开服务 SC_HANDLE hService=OpenService(hSCM,SERVICE_NAME,SERVICE_QUERY_CONFIG); if(hService!=NULL) { bResult=TRUE; CloseServiceHandle(hService); } CloseServiceHandle(hSCM); } return bResult; } //封装安装服务的函数Install BOOL Install() { if(IsInstalled())//服务安装则直接返回真 return TRUE; //打开服务控制管理器 SC_HANDLE hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if(hSCM==NULL) { return FALSE; } TCHAR szFilePath[MAX_PATH]; DWORD dwlen=GetModuleFileName(NULL,szFilePath,MAX_PATH); //判断程序路径是否包含空格,如果包含则给路径加上引号 if(_tcschr(szFilePath,' ')!=NULL) { dwlen+=3; TCHAR*lpFilePath=new TCHAR[dwlen]; if(lpFilePath!=NULL) { _stprintf(lpFilePath,_T("\"%s\""),szFilePath); _tcscpy(szFilePath,lpFilePath); delete []lpFilePath; } } //创建一个手动启动的服务 SC_HANDLE hService=CreateService(hSCM,SERVICE_NAME,SERVICE_NAME,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,SERVICE_DEMAND_START,SERVICE_ERROR_NORMAL,szFilePath,NULL,NULL,_T(""),NULL,NULL); if(hService==NULL) { CloseServiceHandle(hSCM); return FALSE; } StartService(hService,0,NULL); CloseServiceHandle(hService); CloseServiceHandle(hSCM); return TRUE; } //卸载服务的函数Uninstall BOOL Uninstall() { if(!IsInstalled()) return TRUE; SC_HANDLE hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); if(hSCM==NULL) { return FALSE; } SC_HANDLE hService =OpenService(hSCM,SERVICE_NAME,SERVICE_STOP|DELETE); if(hService==NULL) { CloseServiceHandle(hSCM); return FALSE; } SERVICE_STATUS status; //首先停止服务,确保服务能立即被删除 ControlService(hService,SERVICE_CONTROL_STOP,&status); //删除服务 BOOL bDelete=DeleteService(hService); CloseServiceHandle(hService); CloseServiceHandle(hSCM); if(bDelete) return TRUE; return FALSE; } int _tmain(int argc, _TCHAR* argv[]) { Init();//初始化服务数据信息 /* if(argv[1]!=NULL&&_tcsicmp(argv[1],_T("install"))==0) { Install(); }*/ // if(argv[1]!=NULL&&_tcsicmp(argv[1],_T("uninstall"))==0) //{ //Uninstall(); //} /*wchar_t *a=new wchar_t[10]; scanf("%s",a); if(a!=NULL&&_tcsicmp(a,_T("install"))==0) { Install(); } if(a!=NULL&&_tcsicmp(a,_T("uninstall"))==0) { Uninstall(); }*/ //else //{ Install(); SERVICE_TABLE_ENTRY st[]= { {SERVICE_NAME,ServiceMain}, {NULL,NULL} }; StartServiceCtrlDispatcher(st); // } CloseHandle(g_hEvent); return 0; }
(大一新生刚学的c语言,卑微提问,我好像没有C币啥的哎),为什么编译没问题但是程序好像执行不了,就像没运行就直接结束了
#include<stdio.h> int main() { void paixu(int a[10],char b[10][10]); void chazhao(int n,int a[10],char b[10][10]);//函数声明 int i,j,n,a[10]; char b[10][10];//定义函数 printf("请输入职工姓名和职工号\n"); for(i=0;i<10;i++) { printf("姓名:"); scanf("%s\n",b[i][10]); printf("NO:"); scanf("%d",&a[i]); } printf("请输入你要查找的工号\n"); scanf("%d",&n); paixu(a,b);//将数组实参数传递给形参 chazhao(n,a,b); return 0; } void paixu(int a[10],char b[10][10])//调用函数 { int i,j,t; char T; for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(a[i]>a[i+1]) { t=a[i],a[i]=a[i+1],a[i+1]=t; T=b[i][10],b[i][10]=b[i+1][10],b[i+1][10]=T; } for(i=0;i<10;i++) { printf("NO:%d",a[i]); printf("姓名:%c\n",b[i][10]); } } void chazhao(int n,int a[], char b[10][10]) { int top, bot, mid, x, y; top = 0; bot =8; x = 0; y = 1; if ((n < a[0]) || (n > a[8])) x = -1; while ((y == 1) && (top <= bot)) { mid = (bot + top) / 2; if (n == a[mid]) { x = mid; printf("NO.%d,his name is %c\n", n, b[x]); y == -1; } else if (n < a[mid]) bot = mid - 1; else top = mid + 1; } if (y == 1 || x == -1) printf("%d not been found.\n", n); }
程序结束码exit code 9
本人是个新手,最近在写关于人脸识别的程序,先上部分代码: int main() { cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0); if ( !cascade ) { fprintf( stderr, "ERROR:没有文件\n"); return -1; } storage = cvCreateMemStorage(0);//创建内存块 printf("服务器已经开启,等待需要客户端传送的图片到达!\n"); imgTemp = cvLoadImage("/Applications/MAMP/htdocs/androidserver/upload/temp.jpg", 1); while(true){ IplImage* img = cvLoadImage("/Applications/MAMP/htdocs/androidserver/upload/temp.jpg", 1); if(img&&test) { detect_and_draw(img); //人脸检测函数,并剪切检测的图片,并比对 //一旦检测到图片,程序执行到上面这个函数执行完便不再执行 if(CompareHist(img, imgTemp)==0) { imgTemp = img; test=0; } else test=1; } } return 0; } 求教,没有检测到图片循环正常,但一旦检测到图片程序就只能执行一次循环体,并在上面的标记处结束运行,控制台出现lldb调试命令,结束程序出现exit code 9,我知道exit code 0表示正常,那么这个9又表示什么意思?请各位大神指教。是不是主程序执行一次循环执行代码太多运算量太大导致的?顺便问一下我是否需要把这些放到新的线程里处理?
js中怎么有没有类似 java exit这种方法?
注意!我要的不是return什么之类的,那只是结束当前方法!,我要的是js函数直接停止!不再往下执行,我的一个js函数内部嵌套了一个函数,内部函数如果条件成立, 就直接结束,不再回到外部函数进行往下执行
单链表查找运算报SIGSEGV错误
如代码 GET函数执行到while处就会报错 本人小白求大神指点 ``` typedef struct node { datatype data; struct node *next; }linklist; linklist *CREATELIST() { printf("请输入您想输入的链表,$结束\n"); char ch; linklist *head,*s,*r; head=malloc(sizeof(linklist)); r=head; ch=getchar(); while(ch!='$') { s=malloc(sizeof(linklist)); s->data=ch; r->next=s; r=s; ch=getchar(); } r->next=NULL; return head; } datatype GET(linklist *head,int i) { int j; linklist *p; p=head; j=0; while((p->next!=NULL)&&(j<i)) { p=p->next; j++; } if(i==j) return p->data; else return NULL; } ```
koa 一次执行两条sql语句为什么会出问题?
使用koa 搭建后台时,有个点赞需求需要两条sql语句执行,我在数据库里执行两条语句都能正确返回结果, 但是在Service层里包装语句后去执行query()函数,后台给我返回错误:球球大家 * 这是Service层代码 ``` const query = require('../allServices'); module.exports = async(_arr) => { //console.log(_arr) [2,2,2,'2019-08-28 10:37:23.352','评论'] let _sql = 'update comments set comment_like_count = comment_like_count +'+ 1 +' where id = ?;'+ 'insert into likes (theme_id,user_id,like_time,blogOrCom) values (?,?,?,?);'; return query(_sql, _arr); } ``` * 这是query函数 ``` const mysql = require('mysql'); const config = require('../config/config'); let pool = mysql.createPool({ host: config.database.HOST, user: config.database.USERNAME, password: config.database.PASSWORD, database: config.database.DATABASE }); let query = function(sql,values){ return new Promise((resolve, reject) => { pool.getConnection(function(err, connection) { if(err) { reject(err); }else { connection.query(sql, values, (err, rows, fields) => { if(err) { reject(err); }else { resolve(rows); } connection.release();//结束会话 }) } }) }) } module.exports = query; ``` * 这是报错截图 ![图片说明](https://img-ask.csdn.net/upload/201908/28/1566961717_980431.jpg)
C++函数返回的类类型临时变量讨论
类及函数定义如下: class cat { public: int age; cat(void) { cout<<"void构造函数"<<endl; } cat(int _age) :age(_age) { cout<<"int构造函数"<<endl; } cat(const cat& _cat) :age(_cat.age) { cout<<"复制构造函数"<<endl; } cat& operator=(const cat& _cat) { cout<<"赋值操作符"<<endl; age = _cat.age; return *this; } ~cat() { cout<<"析构函数"<<endl; } }; cat show(cat _cat) { return _cat; } 问题1: 在main()函数中有如下代码: cat cat1; cat1.age = 11; cat cat2; cat2.age = 12; cat cat3 = show(cat2) = cat1; // ok cat3.age=11; show(cat2).age = 13; // error C2106: “=”: 左操作数必须为左值 通过查找资料,show()函数返回的临时变量为右值,不可以直接更改成员变量,但是可以调用成员函数,第一条语句通过调用赋值操作符改变了临时变量。理论上结果就应该是这样。但是,如果注释掉cat类中的所有构造函数、赋值操作符、析构函数,再次执行: int age1 = show(cat2).age = 13; // ok, age11=13. 可以编译通过,不明白是什么问题,请各位解答。 问题2: 执行语句: show(cat1); 输出以及我认为的意义应该是: *************************************************** 复制构造函数 //使用实参初始化形参 复制构造函数 //使用形参初始化函数返回值临时变量 析构函数 //形参析构 析构函数 //函数返回值临时变量析构。 *************************************************** 执行语句:cat cat3 = show(cat1); 输出以及我认为的意义应该是: *************************************************** 复制构造函数 //使用实参初始化形参 复制构造函数 //使用形参初始化函数返回值临时变量 析构函数 //形参析构 *************************************************** 通过对比,我们发现当使用函数返回值初始化cat3时,少执行了一次析构函数,应该是函数返回值临时变量未进行析构。并且使用函数返回值初始化cat3时并没有再次调用复制构造构造函数,就像是给没有名字的函数返回值临时变量赋予了一个名字cat3并延长了生存周期。 再执行语句:cat cat3 = show(cat1) = cat2; 输出以及我认为的意义应该是: *************************************************** 复制构造函数 //使用实参初始化形参 复制构造函数 //使用形参初始化函数返回值临时变量 析构函数 //形参析构 赋值操作符 //cat2赋值给临时变量 复制构造函数 //使用被重新赋值的临时变量初始化cat3 析构函数 //临时变量析构。 *************************************************** 对比上一条语句,如果给临时变量重新赋值之后,再用其初始化cat3,临时变量相当于一个独立的对象,会调用复制构造函数初始化cat3然后析构,生命周期结束。通过查找资料,我知道函数返回值临时变量存储于main()栈帧中,会分配临时变量对象所需要的存储空间,且作用域为mian()函数块。但是为什么会出现这种现象?请各位大神解答。
关于返回函数内部new分配的内存的引用
#include <iostream> using namespace std; class example { public: example() { num = new int; *num = 10; cout<<"num = "<<*num<<endl; cout<<"构造"<<endl; } ~example() { cout<<"析构"<<endl; delete num; } void pingfang() { *num *= *num; } void print() { cout<<*num<<endl; } private: int *num; }; example & diaoyong1() { example * p = new example; p->pingfang(); return *p; } example * diaoyong2() { example * p = new example; p->pingfang(); return p; } int main(void) { example & e1 = diaoyong1(); e1.print(); delete &e1; example * ptr = diaoyong2(); ptr->print(); delete ptr; getchar(); return 0; } char *&alloc(){ char *va = new char [100]; return va;} 对于这样的程序 执行过程为 进入函数alloc 为变量va分配内存 假设为0x12345678 大小为四个字节 (32位机指针) 执行new操作 在内存0x12345678地址存入申请到的内存地址 假设为0x45670abc 也就是说 *(0x12345678)=0x45670abc 以上部分应该很好理解 然后返回va 也就是返回上一层一个值 这个值不可能是悬空的 它需要一个地址来存 由于是引用返回,所以返回的地址实际上就是变量va的地址0x12345678 退出函数 释放临时变量 包括va的地址0x12345678 返回到主调函数,使用返回值 比如赋值 a=alloc(); 相当于执行操作 a=*(0x12345678) 注意 在上一步 这个地址已经被释放了 所以当前这个地址存的是什么东西是不确定的 可能还是0x45670abc 也可能已经有了变化 这样a的值就不一定是你需要的了 结果也就可能是错的 关键在于退出函数 释放内存 使用内存这步 先释放 后使用 于是出错 如果是全局/静态变量 自然不会有这个问题 因为内存依旧被原来变量占用 类似引用做参数也是同样的效果 example & diaoyong1() { example * p = new example; p->pingfang(); return *p; } example * diaoyong2() { example * p = new example; p->pingfang(); return p; } 我想问上面的两个函数有什么不同?函数返回值到底是怎么实现的?如果返回一个指针是不是就是将储存这个指针的地址返回回来,函数怎么返回和左值是什么类型是不是有关系?局部变量的指针在函数结束的时候被释放是不是储存这个指针的地址释放了这个指针? example & e1 = diaoyong1(); example * e1 = diaoyong1(); //这两个本质上有什么区别,第一个为什么不会造成内存的泄露?
求教大佬们,这个“读取位置 0xCCCCCCCC 时发生访问冲突。”的异常该如何解决?
程序是数据结构实验的图的存储和遍历,就是输入一个图转化成邻接矩阵,再把邻接矩阵变成邻接表,最后深度优先遍历邻接表生成森林: ``` #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); printf(" 图G的邻接矩阵转换成邻接表,顶点名称用编号表示:\n"); MatToList(g, &G); DispAdj(G); DFSForest(G, T); Display(T); system("pause"); } ``` ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575290126_389001.png) 输入顶点和边的信息后,能输出邻接矩阵和邻接表,但到了生成森林这一步时就出异常了,也就是执行DFSForest(G,T)时有问题 ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575290392_874129.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);时就出问题了(也不敢确定是否确实如此),若在Dfs(G, i, locat);处设置断点然后再次运行程序 ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575291018_575842.png) 接着按F11逐行运行,就到了函数Dfs(): ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575291186_297905.png) ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575291249_977002.png)![图片说明](https://img-ask.csdn.net/upload/201912/02/1575291300_436128.png) 再按“继续”,又循环回了Dfs(G, i, locat); ![图片说明](https://img-ask.csdn.net/upload/201912/02/1575291493_99485.png) 异常大概就是在第二次循环时出现的。请教大佬们我该如何修改这个程序?谢谢
引发了未经处理的异常:读取访问权限冲突。 this->**matrix** 是 0xCDDDCDDE。
# 可从后往前看,来自学生党的求助,缺的都是iostream ## #include "pch.h", ## #include "Graph.h" Edge::Edge() { from = -1; to = -1; weight = 0; } Edge::Edge(int f, int t, int w) { from = f; to = t; weight = w; } Graph::Graph() { } Graph::Graph(int numVert) { numVertex = numVert; numEdge = 0; Indegree = new int[numVertex]; Mark = new int[numVertex]; for (int i = 0; i < numVertex; i++) { Mark[i] = UNVISITED; Indegree[i] = 0; } } Graph::~Graph() { delete[] Mark; delete[] Indegree; } bool Graph::IsEdge(Edge oneEdge) { if (oneEdge.weight > 0 && oneEdge.weight < INFINITYS && oneEdge.to >= 0) return true; else return false; } void Graph::clearVisitedMark() { for (int i = 0; i < numVertex; i++) Mark[i] = UNVISITED; } #pragma once #include <iostream> using namespace std; #define MAX 102 #define INFINITYS 65536 #define UNVISITED 0 #define VISITED 1 #ifndef GRAPH_H #define GRAPH_H class Edge { public: Edge(); Edge(int f, int t, int w); ~Edge() {} bool operator < (const Edge &arg) { return (this->weight < arg.weight); } bool operator == (const Edge &arg) { return (this->weight == arg.weight); } bool operator > (const Edge &arg) { return (this->weight > arg.weight); } bool operator <= (const Edge &arg) { return (this->weight <= arg.weight); } bool operator >= (const Edge &arg) { return (this->weight >= arg.weight); } int from; int to; int weight; }; class Graph { public: Graph(); Graph(int numVert); virtual ~Graph(); int VerticesNum() { return numVertex; } int EdgesNum() { return numEdge; } bool IsEdge(Edge oneEdge); int FromVertex(Edge oneEdge) { return oneEdge.from; } int ToVertex(Edge oneEdge) { return oneEdge.to; } int Weight(Edge oneEdge) { return oneEdge.weight; } void clearVisitedMark(); /*virtual Edge FirstEdge(int oneVertex) = 0; virtual Edge NextEdge(Edge preEdge) = 0; virtual void setEdge(int from, int to, int weight) = 0; virtual void delEdge(int from, int to) = 0;*/ protected: int numVertex; int numEdge; int * Mark; int * Indegree; }; #endif // !GRAPH_H #include "pch.h" #include "Graphm.h" Graphm::Graphm() { } Graphm::~Graphm() { for (int i = 0; i < numVertex; i++) delete[] matrix[i]; delete[] matrix; } Edge Graphm::FristEdge(int oneVertex) { Edge myEdge; myEdge.from = oneVertex; for (int i = 0; i < numVertex; i++) if (matrix[oneVertex][i] != 0 && matrix[oneVertex][i] < INFINITYS) { myEdge.to = i; myEdge.weight = matrix[oneVertex][i]; break; } return myEdge; } Edge Graphm::NextEdge(Edge preEdge) { Edge myEdge; myEdge.from = preEdge.from; if (preEdge.to < numVertex) for (int i = preEdge.to + 1; i < numVertex; i++) if (matrix[preEdge.from][i] != 0 && matrix[preEdge.from][i] < INFINITYS) { myEdge.to = i; myEdge.weight = matrix[preEdge.from][i]; break; } return myEdge; } void Graphm::setEdge(int from, int to, int weight) { if (matrix[from][to] <= 0) { numEdge++; Indegree[to]++; } matrix[from][to] = weight; } void Graphm::delEdge(int from, int to) { if (matrix[from][to] > 0) { numEdge--; Indegree[to]--; } matrix[from][to] = 0; } void Graphm::InitWith2DimArray(int * mat, int row_col) { for (int i = 0; i < row_col; i++) for (int j = 0; j < row_col; j++) { cout << *(mat + i * row_col + j) << ", \n"; this->setEdge(i, j, *(mat + i * row_col + j)); } cout << endl; } void Graphm::DFS_ConnectedSubGraph(int n) { this->Mark[n] = VISITED; Visit(n); for (Edge e = this->FristEdge(n); this->IsEdge(e); e = this->NextEdge(e)) if (this->Mark[this->ToVertex(e)] == UNVISITED) DFS_ConnectedSubGraph(this->ToVertex(e)); } void Graphm::BFS_ConnectedSubGraph(int n) { queue<int> Q; Visit(n); Mark[n] = VISITED; Q.push(n); while (! Q.empty()) { int u = Q.front(); Q.pop(); for(Edge e = FristEdge(u); IsEdge(e); e = NextEdge(e)) if (Mark[ToVertex(e)] == UNVISITED) { Visit(ToVertex(e)); Mark[ToVertex(e)] = VISITED; Q.push(ToVertex(e)); } } } #pragma once #include "Graph.h" #include <queue> #ifndef GRAGHM_H #define GRAGHM_H class Graphm : public Graph { public: Graphm(); Graphm(int n) : Graph(n) { int i; matrix = (int **) new int *[numVertex]; for (i = 0; i < numVertex; i++) matrix[i] = new int[numVertex]; for (i = 0; i < numVertex; i++) for (int j = 0; j < numVertex; j++) matrix[i][j] = 0; } ~Graphm(); Edge FristEdge(int oneVertex); Edge NextEdge(Edge preEdge); void setEdge(int from, int to, int weight); void delEdge(int from, int to); void InitWith2DimArray(int * mat, int row_col); void DFS_ConnectedSubGraph(int n); void BFS_ConnectedSubGraph(int n); void Visit(int n) { cout << 'n' << n << " \n"; } //private: int ** matrix; }; #endif // !GRAGHM_H // main.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include "pch.h" #include <iostream> #include "Floyd.h" const int const vertexesNum = 5; int matrix1[vertexesNum][vertexesNum] = { 0 , 8 , INFINITYS, 4 , 3 , INFINITYS, 0 , INFINITYS, INFINITYS, 8 , 6 , 7 , 0 , 10 , 2 , INFINITYS, INFINITYS, INFINITYS, 0 , INFINITYS, 5 , 5 , INFINITYS, INFINITYS, 0 }; int BrokerToPassRomour(Graphm & G, Dist ** D); int main() { std::cout << "Hello World!\n"; Graphm mat[vertexesNum]; mat->InitWith2DimArray((int *)matrix1, vertexesNum); cout << endl; cout << "深度优先周游:\n" << endl; int i; for (i = 0; i < vertexesNum; i++) { mat->clearVisitedMark(); mat->DFS_ConnectedSubGraph(i); cout << endl; } cout << endl; cout << "广度优先周游:\n" << endl; for (i = 0; i < vertexesNum; i++) { mat->clearVisitedMark(); mat->BFS_ConnectedSubGraph(i); cout << endl; } cout << endl; Dist ** floydResult; createFloydResult(floydResult, vertexesNum); int startVertex = BrokerToPassRomour(mat[0], floydResult); cout << "所有顶点间的最短路径:\n" << endl; printAllDistances(floydResult, vertexesNum); cout << endl; for (i = 0; i < vertexesNum; i++) for (int j = 0; j < vertexesNum; j++) if (i != j) printOnePath(floydResult, vertexesNum, i, j); cout << endl; deleteFloydResult(floydResult, vertexesNum); if (startVertex >= 0) cout << "谣言应从 n \n" << startVertex << " 点开始传播!\n" << endl; else cout << "图不连通,问题无解 \n" << endl; return 0; } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门提示: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件 int BrokerToPassRomour(Graphm & G, Dist ** D) { int * max; max = new int[G.VerticesNum()]; int min = 0; int pos = 0; int i = 0; for (i = 0; i < G.VerticesNum(); i++) max[i] = -1; Floyd(G, D); for (i = 0; i < G.VerticesNum(); i++) for (int j = 0; j < G.VerticesNum(); j++) if (D[i][j].length > max[i]) max[i] = D[i][j].length; min = max[0]; for (i = 1; i < G.VerticesNum(); i++) if (max[i] < min) { min = max[i]; pos = i; } if (min == INFINITYS) { cout << "此图不连通 \n" << endl; return -1; } return pos; } // pch.cpp: 与预编译标头对应的源文件;编译成功所必需的 #include "pch.h" // 一般情况下,忽略此文件,但如果你使用的是预编译标头,请保留它。 // 入门提示: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件 #ifndef PCH_H #define PCH_H // TODO: 添加要在此处预编译的标头 #endif //PCH_H #include "pch.h" #include "Floyd.h" void createFloydResult(Dist **& D, int vertexesNum) { D = new Dist *[vertexesNum]; for (int i = 0; i < vertexesNum; i++) D[i] = new Dist[vertexesNum]; } void deleteFloydResult(Dist **& D, int vertexesNum) { for (int i = 0; i < vertexesNum; i++) delete[] D[i]; delete[] D; D = NULL; } void printAllDistances(Dist ** D, int vertexesNum) { for (int i = 0; i < vertexesNum; i++) { for (int j = 0; j < vertexesNum; j++) cout << D[i][j].length << " , \n"; cout << endl; } } void printOnePath(Dist ** D, int vertexesNum, int start, int end) { if (D[start][end].length == INFINITYS) return; int * path = new int[vertexesNum]; int vertexCount = 0; int tail = end; while (tail != start) { path[vertexCount++] = D[start][tail].pre; tail = D[start][tail].pre; } cout << "n" << start << "->n" << end << " : "; for (int i = vertexCount - 1; i >= 0; i--) cout << "n" << path[i] << "->"; cout << "n" << end << endl; delete[] path; } void Floyd(Graphm & G, Dist ** D) { int i, j, v; D = new Dist *[G.VerticesNum()]; for (i = 0; i < G.VerticesNum(); i++) D[i] = new Dist[G.VerticesNum()]; for (i = 0; i < G.VerticesNum(); i++) for (j = 0; j < G.VerticesNum(); j++) { if (i == j) { D[i][j].length = 0; D[i][j].pre = i; } else { D[i][j].length = INFINITYS; D[i][j].pre = -1; } } for (i = 0; i < G.VerticesNum(); i++) for (Edge e = G.FristEdge(i); G.IsEdge(e); e = G.NextEdge(e)) { D[i][G.ToVertex(e)].length = G.Weight(e); D[i][G.ToVertex(e)].pre = i; } for (v = 0; v < G.VerticesNum(); v++) for (i = 0; i < G.VerticesNum(); i++) for (j = 0; j < G.VerticesNum(); j++) if (D[i][j].length > (D[i][v].length + D[v][j].length)) { D[i][j].length = D[i][v].length + D[v][j].length; D[i][j].pre = D[v][j].pre; } } #pragma once #include "Graphm.h" #ifndef FLOYD_H #define FLOYD_H class Dist { public: Dist() {} ~Dist() {} int index; int length; int pre; bool operator < (const Dist &arg) { return (length < arg.length); } bool operator == (const Dist &arg) { return (length == arg.length); } bool operator > (const Dist &arg) { return (length > arg.length); } bool operator <= (const Dist &arg) { return (length <= arg.length); } bool operator >= (const Dist &arg) { return (length >= arg.length); } }; void createFloydResult(Dist ** &D, int vertexesNum); void deleteFloydResult(Dist ** &D, int vertexesNum); void printAllDistances(Dist ** D, int vertexesNum); void printOnePath(Dist ** D, int vertexesNum, int start, int end); void Floyd(Graphm &G, Dist ** D); #endif // !FLOYD_H ********************************************************************* "Graphm.cpp": #include "pch.h" #include "Graphm.h" Graphm::Graphm() { } Graphm::~Graphm() { for (int i = 0; i < numVertex; i++) delete[] matrix[i]; delete[] matrix; } Edge Graphm::FristEdge(int oneVertex) { Edge myEdge; myEdge.from = oneVertex; for (int i = 0; i < numVertex; i++) if (matrix[oneVertex][i] != 0 && matrix[oneVertex][i] < INFINITYS) { myEdge.to = i; myEdge.weight = matrix[oneVertex][i]; break; } return myEdge; } Edge Graphm::NextEdge(Edge preEdge) { Edge myEdge; myEdge.from = preEdge.from; if (preEdge.to < numVertex) for (int i = preEdge.to + 1; i < numVertex; i++) if (matrix[preEdge.from][i] != 0 && matrix[preEdge.from][i] < INFINITYS) { myEdge.to = i; myEdge.weight = matrix[preEdge.from][i]; break; } return myEdge; } void Graphm::setEdge(int from, int to, int weight) { if (matrix[from][to] <= 0) { numEdge++; Indegree[to]++; } matrix[from][to] = weight; } void Graphm::delEdge(int from, int to) { if (matrix[from][to] > 0) { numEdge--; Indegree[to]--; } matrix[from][to] = 0; } void Graphm::InitWith2DimArray(int * mat, int row_col) { for (int i = 0; i < row_col; i++) for (int j = 0; j < row_col; j++) { cout << *(mat + i * row_col + j) << ", \n"; this->setEdge(i, j, *(mat + i * row_col + j)); } cout << endl; } void Graphm::DFS_ConnectedSubGraph(int n) { this->Mark[n] = VISITED; Visit(n); for (Edge e = this->FristEdge(n); this->IsEdge(e); e = this->NextEdge(e)) if (this->Mark[this->ToVertex(e)] == UNVISITED) DFS_ConnectedSubGraph(this->ToVertex(e)); } void Graphm::BFS_ConnectedSubGraph(int n) { queue<int> Q; Visit(n); Mark[n] = VISITED; Q.push(n); while (! Q.empty()) { int u = Q.front(); Q.pop(); for(Edge e = FristEdge(u); IsEdge(e); e = NextEdge(e)) if (Mark[ToVertex(e)] == UNVISITED) { Visit(ToVertex(e)); Mark[ToVertex(e)] = VISITED; Q.push(ToVertex(e)); } } } ************************************************************** 第51行 if (matrix[from][to] <= 0) //void Graphm::setEdge(int from, int to, int weight) 引发了未经处理的异常:读取访问权限冲突。 this->matrix 是 0xCDDDCDDE
WINFORM ,一个函数,被调用多次,怎么解决只弹出一次提示框?
有一个函数,要被调用多次。函数里面判断如果值为空,弹出提示框。这样的话,如果都有空,调用几次就弹出几次。怎样执行一次函数调用,发现是空后就结束后面的调用? public void gongchenggg(GroupBox gb) { int k = 0; string [] arryk=new string[4]; foreach (Control item in gb.Controls) { if (item is TextBox) { TextBox tb = (TextBox)item; if (tb.Text.ToString().Equals("")) { MessageBox.Show("公稱規格內值不能為空"); return; } arryk[k] = tb.Text.ToString(); k++; } } } //下面是调用 public void diaoyong() { gongchenggg(groupbox1) gongchenggg(groupbox2) gongchenggg(groupbox3) }
signal handler处理函数在哪个进程中运行?
我在父进程中向子进程发一个信号,执行信号处理函数。 然而函数中getpid()得到的pid仍然是父进程的。 这是怎么一回事呢,不应该是接受到信号的子进程来调用函数处理吗? ``` #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <signal.h> #include <sys/types.h> int main() { printf("This is farther process,my pid is %d, before signal\n",getpid()); int i,j,k,status; int func(); signal(18,func()); /*设置18号 信号的处理程序*/ while((i=fork())==-1); if(i==0) { //子进程执行 sleep(6); printf("Child %d: A signal from my parent is recived.\n",getpid()); } else { //父进程执行 j=kill(i,18); /*向子进程发送信号18*/ printf("Parent: signal 18 has been sent to child %d,returned %d.\n",i,j); k=wait(&status); //等待子进程结束 printf("After wait %d,Parent %d: finished.\n",k,getpid()); exit(0); } } int func() /*处理程序*/ { printf("I am Process %d: It is signal 18 processing function.\n",getpid()); return 0; } ```
新人求教c语言问题,出现switch函数没有起作用,直接跳到下一步
> 部分代码如下,在Choose函数中:想使用一个循环,结果在第一个那个部分进行选择时出现错误, 选择Choicepass()函数后,Choicepass()函数仅仅执行到"scanf("%c",&M);", 再直接进入Choose函数中的" printf("是否重新进行?\nc->继续\ne->退出:");"这条语句。 想要知道为什么,求大神为新手求解,万分感谢! 结果如图: [图片说明](https://img-ask.csdn.net/upload/201610/18/1476786503_31561.png)! int Choicepass() { int n,T,L,S1,S2,S3; char M; printf("Please choose the model:\na->easy\nb->normal\nc->difficulty\n:"); scanf("%c",&M); switch(M) //选择难度所用函数 { case 'a': { srand(time(0)); n = rand()%10+1; T = 3; S1 = Guess1(n,T); }break; case 'b': { srand(time(0)); n = rand()%50+1; printf("You should get the answer from 1~50.\nPlease choose the TimesLimit(5~10):"); scanf("%d",&T); S2 = Guess2(n,T); }break; case 'c': { srand(time(0)); n = rand()%100+1; printf("You should get the answer from 1~100.\nPlease choose the TimesLimit(5~15):"); scanf("%d",&T); S3 = Guess3(n,T); }break; } L = 1; return L ; } /*选择关卡模式或者选择难度模式*/ int Choose() { int L,T; char k,h; printf("选择关卡模式或者自由选择难度模式:\ng->关卡\nz->自由:"); scanf("%c",&h); if(h == 'c') L = Customspass(); else if(h == 'z') L = Choicepass(); else printf("ERROR!\n"); printf("是否重新进行?\nc->继续\ne->退出:"); scanf("%c",&k); if(k == 'c') T = Choose(); else printf("游戏结束!\n"); return T; }
为什么执行修改功能后会出错(乱码或者多4个空格),是哪个地方出现了问题,具体应该怎么改?
``` //功能:顺序串的基本功能 #include <iostream.h> #include <conio.h> #include <windows.h> #include <iomanip.h> #include <string> using namespace std; #define maxsize 50//顺序串的总空间大小 enum returninfo{success,fail,overflow,underflow,range__error,empty};//定义返回信息清单 class String { public: String();//构造函数 ~String();//析构函数 returninfo strcreate();//创建串 returninfo strinsert(int position,char newstr[],int str_length);//插入 returninfo strdelete(int beginposition,int endposition);//删除 returninfo strmodify(int beginposition,int endposition,char newstr[]);//修改 int strsearch(char newstr[]);//查找 void strtraverse();//遍历 int strlength();//求串长 private: char *str;//串 int length;//长度 }; String::String()//构造函数 { str=new char[maxsize];//申请数组空间 } String::~String()//析构函数 {} returninfo String::strcreate()//创建串 { int i=-1,ch; cout<<"请输入要创建的字符串(Ctrl+z结束输入):"<<endl; while((ch=getch())!=26) { cout<<char(ch); i++; if(ch!=13) str[i]=char(ch); else i=i-1; cout.flush();//为了每次输入后可以立即显示所输入的字符,先要清除缓冲区 } length=i+1; cout<<endl; return success; } returninfo String::strinsert(int position,char newstr[],int str_length)//插入,当插入的字符串在原串末尾时,就相当于合并字符串 { int j; if(position>length+1||position<=0)//如果位置错误,返回位置错误 return range__error; if(str_length+length>maxsize) return overflow; for(j=length-1;j>=position-1;j--)//数据移动 str[j+str_length]=str[j]; position=position-1; for(j=0;j<str_length;position++,j++)//插入 str[position]=newstr[j]; length=str_length+length; return success; } returninfo String::strdelete(int beginposition,int endposition)//删除 { int i,j; if(length==0) return empty; if(beginposition>length||endposition>length||beginposition<=0||endposition<=0||beginposition>endposition) return range__error;//如果位置错误则返回错误标志 for(i=beginposition,j=endposition;j<length;j++,i++) str[i-1]=str[j]; length=length-(endposition-beginposition+1); return success; } returninfo String::strmodify(int beginposition,int endposition,char newstr[])//修改 { int i,j,k,str_length,count,newlength,returnvalue; char *newdata; count=endposition-beginposition+1; str_length=strlen(newstr); if(length==0) return empty; if(beginposition>length||endposition>length||beginposition<=0||endposition<=0||beginposition>endposition) return range__error;//如果位置错误则返回错误标志 for(i=0,j=beginposition-1;i<str_length&&i<count;j++,i++)//处理相同长度的一部分 str[j]=newstr[i]; if(str_length>count)//当输入串的长度大于需要修改串的长度时,处理后面多的一部分 { newlength=str_length-count; newdata=new char[newlength]; for(i=count,k=0;i<str_length;i++,k++) newdata[k]=newstr[i]; returnvalue=strinsert(endposition+1,newdata,newlength); if(returnvalue==overflow) return overflow; } if(str_length<count)//当输入串的长度小于需要修改串的长度时,直接删除一部分 strdelete(beginposition+str_length,endposition); return success; } int String::strsearch(char newstr[])//查找 { int i=0,str_length,position=0,count=0;//是否相等标志,count用来确定比较时原串的移动 if(length==0) return -1; str_length=strlen(newstr); for(;i<length&&count<str_length;i++) { if(str[i]==newstr[count]) { position=i-str_length+2; count++; continue; } else { if(position==1) i=i-count; count=0; position=0; } } return position; } void String::strtraverse()//遍历 { int i,j; if(length>0) { cout<<endl<<"实际数据从1开始"<<endl; cout<<"位置: "; for(i=0;i<=length/10;i++) cout<<"|---"<<i<<"----|"; cout<<endl; cout<<"位置: "; for(i=0;i<=length/10;i++) { for(j=0;j<=9;j++) cout<<j; } cout<<endl; cout<<"当前串:"; for(i=0;i<length;i++) cout<<str[i]; cout<<endl; } else cout<<"字符串为空!"<<endl; } int String::strlength()//求串长 { return length; } /* 定义一个实现顺序表功能的菜单处理类interfacebase */ class interfacebase { private: String Stringonface; public: void clearscreen(void);//清屏 void showmenu(void);//显示菜单函数 int userchoice(void);//用户的选项 returninfo processmenu(int menuchoice);//菜单函数 }; void interfacebase::clearscreen(void) { system("cls"); } void interfacebase::showmenu(void) { cout<<"顺序串基本功能菜单"<<endl; cout<<"=================="<<endl; cout<<"1.创建一个串"<<endl; cout<<"2.插入"<<endl; cout<<"3.删除"<<endl; cout<<"4.修改"<<endl; cout<<"5.查找"<<endl; cout<<"6.遍历"<<endl; cout<<"7.求串长"<<endl; cout<<"0.退出"<<endl; cout<<"=================="<<endl; } int interfacebase::userchoice(void) { int menuchoice; cout<<"请输入您的选择:"; cin>>menuchoice; return menuchoice; } returninfo interfacebase::processmenu(int menuchoice) { int position,str_length,beginposition,endposition,returnvalue; switch(menuchoice)//根据用户的选择进行相应的操作 { case 1: returnvalue=Stringonface.strcreate(); if(returnvalue==success) { cout<<"建立顺序串操作成功!"<<endl; } break; case 2: { cout<<"请输入需要插入的位置:"; cin>>position; string str; char temp; cout<<"输入需要插入的字符串,按回车键结束输入:"<<endl; while((temp=getchar())!='\n') { str +=temp; } const int LEN =str.length(); char* newstr = new char[LEN];//根据输入字符串的长度,创建字符数组 for(int i=0;i<LEN;i++) //将字符串保存到字符数组中 { newstr[i]=str[i]; } cout<<"请输入串长:"; cin>>str_length; returnvalue=Stringonface.strinsert(position,newstr,str_length); if(returnvalue==range__error) cout<<"对不起,插入的位置超出了范围!"<<endl; else if(returnvalue==overflow) cout<<"对不起,插入后的串长超出了范围!"<<endl; else cout<<"顺序串插入操作成功!"<<endl; delete newstr; } break; case 3: { cout<<"请输入串需要删除的开始位置:"; cin>>beginposition; cout<<"请输入串需要删除的结束位置:"; cin>>endposition; returnvalue=Stringonface.strdelete(beginposition,endposition); if(returnvalue==empty) cout<<"对不起,顺序串为空!"<<endl; else if(returnvalue==range__error) cout<<"对不起,删除的位置超出了范围!"<<endl; else cout<<"删除操作成功!"<<endl; } break; case 4: { cout<<"请输入串需要修改的开始位置:"; cin>>beginposition; cout<<"请输入串需要修改的结束位置:"; cin>>endposition; string str; char temp; cout<<"请输入修改的新字符串,按回车键结束输入:"<<endl; while((temp=getchar())!='\n') { str +=temp; } const int LEN =str.length(); char* newstr = new char[LEN];//根据输入字符串的长度,创建字符数组 for(int i=0;i<LEN;i++) //将字符串保存到字符数组中 { newstr[i]=str[i]; } returnvalue=Stringonface.strmodify(beginposition,endposition,newstr); if(returnvalue==empty) cout<<"对不起,顺序串为空!"<<endl; else if(returnvalue==range__error) cout<<"对不起,修改的位置超出了范围!"<<endl; else if(returnvalue==overflow) cout<<"对不起,修改后的串长超出了范围!"<<endl; else cout<<"修改操作成功!"<<endl; delete newstr; } break; case 5: { string str; char temp; cout<<"请输入需要查找的字符串,按回车键结束输入:"<<endl; while((temp=getchar())!='\n') { str +=temp; } const int LEN =str.length(); char* newstr = new char[LEN];//根据输入字符串的长度,创建字符数组 for(int i=0;i<LEN;i++) //将字符串保存到字符数组中 { newstr[i]=str[i]; } position=Stringonface.strsearch(newstr); cout<<"需要查找的字符串出现的位置:"<<position<<endl; delete newstr; } break; case 6: Stringonface.strtraverse(); cout<<"遍历操作成功!"<<endl; break; case 7: cout<<"顺序串目前的长度为:"<<Stringonface.strlength()<<endl; cout<<"求顺序串长度操作成功!"<<endl; break; case 0: exit(0); default: cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl; break; } return success; } /* 程序主入口 */ void main(void) { int menuchoice;//定义变量,菜单选单项的选择 interfacebase interfacenow; system("color f0");//修改屏幕的背景色和字的颜色 interfacenow.clearscreen();//清屏 while(1)//永真循环 { interfacenow.showmenu();//显示菜单 menuchoice=interfacenow.userchoice();//获取用户的选择 interfacenow.processmenu(menuchoice);//处理用户的选择 system("pause");//暂停 interfacenow.clearscreen();//清屏 } }//主函数结束 ```
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
死磕YOLO系列,YOLOv1 的大脑、躯干和手脚
YOLO 是我非常喜欢的目标检测算法,堪称工业级的目标检测,能够达到实时的要求,它帮我解决了许多实际问题。 这就是 YOLO 的目标检测效果。它定位了图像中物体的位置,当然,也能预测物体的类别。 之前我有写博文介绍过它,但是每次重新读它的论文,我都有新的收获,为此我准备写一个系列的文章来详尽分析它。这是第一篇,从它的起始 YOLOv1 讲起。 YOLOv1 的论文地址:https://www.c
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背
有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好。想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着”背“来记忆的,所以今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等,这样的话,以后面试官让你举例子,你也能够顺手拈来。 1、管道 我们来看一条 Linux 的语句 netstat -tulnp | gr...
20行Python代码爬取王者荣耀全英雄皮肤
引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了。我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成。 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片
网络(8)-HTTP、Socket、TCP、UDP的区别和联系
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据。 一、TCP与UDP的不同 1. 是否需要建立连接。 UDP在传送数据之前不需要先建立连接;TCP则提供面向连接的服务; 2. 是否需要给出确认 对方的传输层在收到UDP报文后,不需要给出任何确认,而 TCP需要给出确认报文,要提供可靠的、面向连接的传输服务。 3.虽然UDP不提供可靠交...
简明易理解的@SpringBootApplication注解源码解析(包含面试提问)
欢迎关注文章系列 ,关注我 《提升能力,涨薪可待》 《面试知识,工作可待》 《实战演练,拒绝996》 欢迎关注我博客,原创技术文章第一时间推出 也欢迎关注公 众 号【Ccww笔记】,同时推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《提升能力,涨薪可待篇》- @SpringBootApplication注解源码解析 一、@SpringBootApplication 的作用是什
防劝退!数据结构和算法难理解?可视化动画带你轻松透彻理解!
大家好,我是 Rocky0429,一个连数据结构和算法都不会的蒟蒻… 学过数据结构和算法的都知道这玩意儿不好学,没学过的经常听到这样的说法还没学就觉得难,其实难吗?真难! 难在哪呢?当年我还是个小蒟蒻,初学数据结构和算法的时候,在忍着枯燥看完定义原理,之后想实现的时候,觉得它们的过程真的是七拐八绕,及其难受。 在简单的链表、栈和队列这些我还能靠着在草稿上写写画画理解过程,但是到了数论、图...
西游记团队中如果需要裁掉一个人,会先裁掉谁?
2019年互联网寒冬,大批企业开始裁员,下图是网上流传的一张截图: 裁员不可避免,那如何才能做到不管大环境如何变化,自身不受影响呢? 我们先来看一个有意思的故事,如果西游记取经团队需要裁员一名,会裁掉谁呢,为什么? 西游记团队组成: 1.唐僧 作为团队teamleader,有很坚韧的品性和极高的原则性,不达目的不罢休,遇到任何问题,都没有退缩过,又很得上司支持和赏识(直接得到唐太宗的任命,既给
开挂的人生!那些当选院士,又是ACM/IEEE 双料Fellow的华人学者们
昨日,2019年两院院士正式官宣,一时间抢占了各大媒体头条。 朋友圈也是一片沸腾,奔走相告,赶脚比自己中了大奖还嗨皮! 谁叫咱家导师就是这么厉害呢!!! 而就在最近,新一年度的IEEE/ACM Fellow也将正式公布。 作为学术届的顶级荣誉,不自然地就会将院士与Fellow作比较,到底哪个含金量更高呢? 学术君认为,同样是专业机构对学者的认可,考量标准不一,自然不能一概而论。 但...
聊聊C语言和指针的本质
坐着绿皮车上海到杭州,24块钱,很宽敞,在火车上非正式地聊几句。 很多编程语言都以 “没有指针” 作为自己的优势来宣传,然而,对于C语言,指针却是与生俱来的。 那么,什么是指针,为什么大家都想避开指针。 很简单, 指针就是地址,当一个地址作为一个变量存在时,它就被叫做指针,该变量的类型,自然就是指针类型。 指针的作用就是,给出一个指针,取出该指针指向地址处的值。为了理解本质,我们从计算机模型说起...
Python语言高频重点汇总
Python语言高频重点汇总 GitHub面试宝典仓库——点这里跳转 文章目录Python语言高频重点汇总**GitHub面试宝典仓库——点这里跳转**1. 函数-传参2. 元类3. @staticmethod和@classmethod两个装饰器4. 类属性和实例属性5. Python的自省6. 列表、集合、字典推导式7. Python中单下划线和双下划线8. 格式化字符串中的%和format9.
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
代码详解:如何用Python快速制作美观、炫酷且有深度的图表
全文共12231字,预计学习时长35分钟生活阶梯(幸福指数)与人均GDP(金钱)正相关的正则图本文将探讨三种用Python可视化数据的不同方法。以可视化《2019年世界幸福报告》的数据为例,本文用Gapminder和Wikipedia的信息丰富了《世界幸福报告》数据,以探索新的数据关系和可视化方法。《世界幸福报告》试图回答世界范围内影响幸福的因素。报告根据对“坎特里尔阶梯问题”的回答来确定幸...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
(经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
今年正式步入了大四,离毕业也只剩半年多的时间,回想一下大学四年,感觉自己走了不少弯路,今天就来分享一下自己大学的学习经历,也希望其他人能不要走我走错的路。 (一)初进校园 刚进入大学的时候自己完全就相信了高中老师的话:“进入大学你们就轻松了”。因此在大一的时候自己学习的激情早就被抛地一干二净,每天不是在寝室里玩游戏就是出门游玩,不过好在自己大学时买的第一台笔记本性能并不是很好,也没让我彻底沉...
如何写一篇技术博客,谈谈我的看法
前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 我一直推崇学技术可以写技术博客去沉淀自己的知识,因为知识点实在是太多太多了,通过自己的博客可以帮助自己快速回顾自己学过的东西。 我最开始的时候也是只记笔记,认为自己能看得懂就好。但如果想验证自己是不是懂了,可以写成技术博客。在写技术博客的...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
面试还搞不懂redis,快看看这40道面试题(含答案和思维导图)
Redis 面试题 1、什么是 Redis?. 2、Redis 的数据类型? 3、使用 Redis 有哪些好处? 4、Redis 相比 Memcached 有哪些优势? 5、Memcache 与 Redis 的区别都有哪些? 6、Redis 是单进程单线程的? 7、一个字符串类型的值能存储最大容量是多少? 8、Redis 的持久化机制是什么?各自的优缺点? 9、Redis 常见性...
大学四年自学走来,这些珍藏的「实用工具/学习网站」我全贡献出来了
知乎高赞:文中列举了互联网一线大厂程序员都在用的工具集合,涉及面非常广,小白和老手都可以进来看看,或许有新收获。
互联网公司的裁员,能玩出多少种花样?
裁员,也是一门学问,可谓博大精深!以下,是互联网公司的裁员的多种方法:-正文开始-135岁+不予续签的理由:千禧一代网感更强。95后不予通过试用期的理由:已婚已育员工更有责任心。2通知接下来要过苦日子,让一部分不肯同甘共苦的员工自己走人,以“兄弟”和“非兄弟”来区别员工。3强制996。员工如果平衡不了工作和家庭,可在离婚或离职里二选一。4不布置任何工作,但下班前必须提交千字工作日报。5不给活干+...
【设计模式】单例模式的八种写法分析
网上泛滥流传单例模式的写法种类,有说7种的,也有说6种的,当然也不排除说5种的,他们说的有错吗?其实没有对与错,刨根问底,写法终究是写法,其本质精髓大体一致!因此完全没必要去追究写法的多少,有这个时间还不如跟着宜春去网吧偷耳机、去田里抓青蛙得了,一天天的....
《面试宝典》:检验是否为合格的初中级程序员的面试知识点,你都知道了吗?查漏补缺
欢迎关注文章系列,一起学习 《提升能力,涨薪可待篇》 《面试知识,工作可待篇》 《实战演练,拒绝996篇》 也欢迎关注公 众 号【Ccww笔记】,原创技术文章第一时间推出 如果此文对你有帮助、喜欢的话,那就点个赞呗,点个关注呗! 《面试知识,工作可待篇》-Java笔试面试基础知识大全 前言 是不是感觉找工作面试是那么难呢? 在找工作面试应在学习的基础进行总结面试知识点,工作也指日可待,欢...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
微博推荐算法简述
在介绍微博推荐算法之前,我们先聊一聊推荐系统和推荐算法。有这样一些问题:推荐系统适用哪些场景?用来解决什么问题、具有怎样的价值?效果如何衡量? 推荐系统诞生很早,但真正被大家所重视,缘起于以”facebook”为代表的社会化网络的兴起和以“淘宝“为代表的电商的繁荣,”选择“的时代已经来临,信息和物品的极大丰富,让用户如浩瀚宇宙中的小点,无所适从。推荐系统迎来爆发的机会,变得离用户更近: 快...
GitHub 标星 1.6w+,我发现了一个宝藏项目,作为编程新手有福了!
大家好,我是 Rocky0429,一个最近老在 GitHub 上闲逛的蒟蒻… 特别惭愧的是,虽然我很早就知道 GitHub,但是学会逛 GitHub 的时间特别晚。当时一方面是因为菜,看着这种全是英文的东西难受,不知道该怎么去玩,另一方面是一直在搞 ACM,没有做一些工程类的项目,所以想当然的以为和 GitHub 也没什么关系(当然这种想法是错误的)。 后来自己花了一个星期看完了 Pyt...
相关热词 c#如何定义数组列表 c#倒序读取txt文件 java代码生成c# c# tcp发送数据 c#解决时间格式带星期 c#类似hashmap c#设置istbox的值 c#获取多线程返回值 c# 包含数字 枚举 c# timespan
立即提问

相似问题

1
想知道这个程序输入在怎样的字符串后,可以结束输入执行程序。
1
为什么 "<<" 会报错, 没有与这些操作数匹配的<<操作符,输出d.day()或者d.year(),也不是输出定义的数据
1
C++串口通信writefile()后为什么要Sleep,readfile()才能读取到数据?
2
用tensorflow做机器翻译时训练代码有问题
1
PHP网站语句如何优化,希望和高手一起探讨下
2
请教各位大神:一种新的数组排序,初测速度是快速排序的50倍,有无市场价值,时间复杂度能计算出来吗?
2
控制台程序连接db2数据库时,连接正确,下一步SQLExecDirect 执行一句SQL语句失败,求大神告知原因。
0
纯C贪吃蛇运行有时会卡死,求大佬帮助?
1
C++的这个有类模板的代码怎么改成三个文件(seqstack.h、seqstack.cpp、main.cpp)?具体代码是怎么样的?
1
类模板实例化(整型)后,再实例化(浮点型),为什么只能用整型?
1
为什么执行修改功能后会出错(乱码或者多4个空格),是哪个地方出现了问题,具体应该怎么改?
0
koa 一次执行两条sql语句为什么会出问题?
5
怎么把js函数的参数变成全局变量,用到后面的函数中运算
1
单链表查找运算报SIGSEGV错误
1
FFmpeg - 为什么从pcm提取音频,编码为mp3以后,时长变多了,声音也颤抖
1
关于c语言 fopen触发断点问题,求大神解惑
2
(大一新生刚学的c语言,卑微提问,我好像没有C币啥的哎),为什么编译没问题但是程序好像执行不了,就像没运行就直接结束了
1
引发了未经处理的异常:读取访问权限冲突。 this->**matrix** 是 0xCDDDCDDE。
2
求教大佬们,这个“读取位置 0xCCCCCCCC 时发生访问冲突。”的异常该如何解决?