Debug Assertion Failed!
Program: ...o\documents\visual studio 2013\Projects\MFCOS\Debug\MFCOS.exe
File: f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp
Line: 4345
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
貼出全部代碼,求大神幫忙QAQ謝謝
// CHPF.cpp : 實作檔案
//
#include "stdafx.h"
#include "MFCOS.h"
#include "CHPF.h"
#include "afxdialogex.h"
#define getpch(type) (type*)malloc(sizeof(type))
#define NULL 0
// CCHPF 對話框
IMPLEMENT_DYNAMIC(CCHPF, CDialogEx)
CCHPF::CCHPF(CWnd* pParent /*=NULL*/)
: CDialogEx(CCHPF::IDD, pParent)
, m_name(_T(""))
, m_intN(_T(""))
, m_prioritynumber(_T(""))
, m_runningtime(_T(""))
, m_result(_T(""))
{
}
CCHPF::~CCHPF()
{
}
void CCHPF::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT2, m_name);
DDX_Text(pDX, IDC_EDIT1, m_intN);
DDX_Text(pDX, IDC_EDIT3, m_prioritynumber);
DDX_Text(pDX, IDC_EDIT4, m_runningtime);
DDX_Text(pDX, IDC_EDIT5, m_result);
}
BEGIN_MESSAGE_MAP(CCHPF, CDialogEx)
ON_EN_CHANGE(IDC_EDIT2, &CCHPF::OnChangeEdit2)
ON_EN_CHANGE(IDC_EDIT3, &CCHPF::OnChangeEdit3)
ON_EN_CHANGE(IDC_EDIT4, &CCHPF::OnChangeEdit4)
ON_EN_CHANGE(IDC_EDIT1, &CCHPF::OnChangeEdit1)
ON_BN_CLICKED(IDOK, &CCHPF::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, &CCHPF::OnClickedButton1)
ON_BN_CLICKED(IDC_BUTTON2, &CCHPF::OnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CCHPF::OnClickedButton3)
ON_EN_CHANGE(IDC_EDIT5, &CCHPF::OnChangeEdit5)
END_MESSAGE_MAP()
// CCHPF 訊息處理程式
struct pcb { /* 定義行程控制塊PCB */
char name[10];
char state; //行程狀態
int super; //優先數
int ntime; //行程運行時間
int rtime;
struct pcb* link;
}*ready = NULL, *p;
typedef struct pcb PCB;
void CCHPF::OnChangeEdit1()
{
// TODO: 如果該控制元件是 RICHEDIT 控制元件,它將不
// 發送此通知,除非重寫 CDialogEx::OnInitDialog()
// 函式并呼叫 CRichEditCtrl().SetEventMask(),
// 同時將 ENM_CHANGE 標志“或”運算到掩碼中。
// TODO: 在此添加控制元件通知處理程式代碼
UpdateData(true);
CString str;
GetDlgItemText(IDC_EDIT1, str);
m_intN = str; //獲得行程數
N = _ttoi(m_intN);
UpdateData(false);
}
void CCHPF::OnChangeEdit2()
{
// TODO: 如果該控制元件是 RICHEDIT 控制元件,它將不
// 發送此通知,除非重寫 CDialogEx::OnInitDialog()
// 函式并呼叫 CRichEditCtrl().SetEventMask(),
// 同時將 ENM_CHANGE 標志“或”運算到掩碼中。
// TODO: 在此添加控制元件通知處理程式代碼
UpdateData(true );
CString str;
GetDlgItemText(IDC_EDIT2, str);
m_name = str; //獲得行程名
name = m_name;
UpdateData(false);
}
void CCHPF::OnChangeEdit3()
{
// TODO: 如果該控制元件是 RICHEDIT 控制元件,它將不
// 發送此通知,除非重寫 CDialogEx::OnInitDialog()
// 函式并呼叫 CRichEditCtrl().SetEventMask(),
// 同時將 ENM_CHANGE 標志“或”運算到掩碼中。
// TODO: 在此添加控制元件通知處理程式代碼
UpdateData(true);
CString str;
GetDlgItemText(IDC_EDIT3, str);
m_prioritynumber= str; //獲得行程優先數
prioritynumber = _ttoi(m_prioritynumber);
UpdateData(false);
}
void CCHPF::OnChangeEdit4()
{
// TODO: 如果該控制元件是 RICHEDIT 控制元件,它將不
// 發送此通知,除非重寫 CDialogEx::OnInitDialog()
// 函式并呼叫 CRichEditCtrl().SetEventMask(),
// 同時將 ENM_CHANGE 標志“或”運算到掩碼中。
// TODO: 在此添加控制元件通知處理程式代碼
UpdateData(true);
CString str;
GetDlgItemText(IDC_EDIT4, str);
m_runningtime = str; //獲得行程運行時間
runningtime = _ttoi(m_runningtime);
UpdateData(false);
}
void CCHPF::OnBnClickedOk() //確定后將行程數傳給調度實作函式(不知道該怎么用)
{
// TODO: 在此添加控制元件通知處理程式代碼
//CDialogEx::OnOK();
//CCHPF().OnChangeEdit1();
}
void CCHPF::OnClickedButton1() //添加行程,功能:重置編輯框為可編輯狀態
{
// TODO: 在此添加控制元件通知處理程式代碼
UpdateData(true);
printf("\ninput呼叫成功!\n");
p = getpch(PCB);
strcpy_s(p->name, CCHPF().name);
p->super = CCHPF().prioritynumber;
p->ntime = CCHPF().runningtime;
p->rtime = 0; p->state = 'w';
p->link = NULL;
sort(); /* 呼叫 sort 函式*/
m_name = "";
m_prioritynumber = "";
m_runningtime = "";
UpdateData(false);
}
void CCHPF::OnClickedButton3() //繼續調度(好像也沒啥用)
{
// TODO: 在此添加控制元件通知處理程式代碼
}
void CCHPF::OnChangeEdit5() //顯示調度程序中當前行程
{
// TODO: 如果該控制元件是 RICHEDIT 控制元件,它將不
// 發送此通知,除非重寫 CDialogEx::OnInitDialog()
// 函式并呼叫 CRichEditCtrl().SetEventMask(),
// 同時將 ENM_CHANGE 標志“或”運算到掩碼中。
// TODO: 在此添加控制元件通知處理程式代碼
UpdateData(true);
if (p->rtime == p->ntime)
{
SetDlgItemText(IDC_EDIT5,_T( "\n 行程"));
SetDlgItemText(IDC_EDIT5,_T( p->name));
SetDlgItemText(IDC_EDIT5,_T( "已完成.\n"));
free(p);
}
else
{
PCB* pr;
SetDlgItemText(IDC_EDIT5, _T("\n***當前正在運行的行程是:"));
SetDlgItemText(IDC_EDIT5,_T( p->name));
SetDlgItemText(IDC_EDIT5,_T( "\r\n"));/*顯示當前運行行程*/
SetDlgItemText(IDC_EDIT5, _T("\n 行程名 \t 狀態 \t 優先級 \t 行程運行時間 \t 行程運行時間 \n"));
SetDlgItemText(IDC_EDIT5, _T(p->name));
SetDlgItemText(IDC_EDIT5, _T(&p->state));
SetDlgItemInt(IDC_EDIT5, _T(p->super));
SetDlgItemInt(IDC_EDIT5, _T(p->ntime));
SetDlgItemInt(IDC_EDIT5, _T(p->rtime));//顯示行程
pr = ready;
SetDlgItemText(IDC_EDIT5, _T("\n ****當前就緒佇列狀態為:\n")); /*顯示就緒佇列狀態*/
while (pr != NULL)
{
SetDlgItemText(IDC_EDIT5,_T( "\n 行程名 \t 狀態 \t 優先級 \t 行程運行時間 \t 行程運行時間 \n"));
SetDlgItemText(IDC_EDIT5, _T(pr->name));
SetDlgItemText(IDC_EDIT5, _T(&p->state));
SetDlgItemInt(IDC_EDIT5, _T(p->super));
SetDlgItemInt(IDC_EDIT5, _T(p->ntime));
SetDlgItemInt(IDC_EDIT5, _T(p->rtime));//顯示行程
pr = pr->link;
}
}
UpdateData(false);
}
int CCHPF::space() //計算行程控制塊個數
{
int l = 0; PCB* pr = ready;
while (pr != NULL)
{
l++;
pr = pr->link;
}
return(l);
}
void CCHPF::sort() /* 建立對行程進行優先級排列函式*/
{
PCB *first, *second;
int insert = 0;
if ((ready == NULL) || ((p->super)>(ready->super))) /*優先級最大者,插入隊首,佇列先進先出*/
{
p->link = ready;
ready = p;
}
else /* 行程比較優先級,插入適當的位置中*/
{
first = ready;
second = first->link;
while (second != NULL)
{
if ((p->super)>(second->super)) /*若插入行程比當前行程優先數大,*/
{ /*插入到當前行程前面*/
p->link = second;
first->link = p;
second = NULL;
insert = 1;
}
else /* 插入行程優先數最低,則插入到隊尾*/
{
first = first->link;
second = second->link;
}
}
if (insert == 0)
first->link = p;
}
}
void CCHPF::running() /* 建立行程就緒函式(行程運行時間到,置就緒狀態*/
{
(p->rtime)++;
if (p->rtime == p->ntime)
CCHPF().OnChangeEdit5();/* 呼叫 destroy 函式*/
else
{
(p->super)--;
p->state = 'w';
sort(); /*呼叫 sort 函式*/
}
}
void CCHPF::OnClickedButton2() //完成行程添加,開始調度
{
// TODO: 在此添加控制元件通知處理程式代碼
UpdateData(true);
int len, h = 0;
len = space();
while ((len != 0) && (ready != NULL))
{
//h++;
//printf("\n The execute number:%d \n", h);
p = ready;
ready = p->link;
p->link = NULL;
p->state = 'R';
CCHPF().OnChangeEdit5();
running();
}
UpdateData(false);
}
uj5u.com熱心網友回復:
原因是UpdateData發生遞回呼叫。具體來說,以
ON_EN_CHANGE(IDC_EDIT2, &CCHPF::OnChangeEdit2)
m_name 變化會觸發OnChangeEdit2,在OnChangeEdit2中會UpdateData。
void CCHPF::OnChangeEdit2()
{
// TODO: 如果該控制元件是 RICHEDIT 控制元件,它將不
// 發送此通知,除非重寫 CDialogEx::OnInitDialog()
// 函式并呼叫 CRichEditCtrl().SetEventMask(),
// 同時將 ENM_CHANGE 標志“或”運算到掩碼中。
// TODO: 在此添加控制元件通知處理程式代碼
UpdateData(true );
CString str;
GetDlgItemText(IDC_EDIT2, str);
m_name = str; //獲得行程名 這里m_name發生變化,又會觸發UpdateData,從而發生遞回呼叫
name = m_name;
UpdateData(false);
}
原因如上,如何解決你還得結合自己代碼邏輯修改。
用心回答每個問題,如果有幫助,請采納答案好嗎,謝謝~~~
uj5u.com熱心網友回復:
可是我是在呼叫void CCHPF::OnClickedButton2() 時出錯的QAQ
uj5u.com熱心網友回復:
//要單純防止UpdateData遞回呼叫,可設定一個全域變數比如
int g_InUpdateData=https://bbs.csdn.net/topics/0;
void CCHPF::OnChangeEdit2()
{
if (g_InUpdateData) return;
g_InUpdateData=https://bbs.csdn.net/topics/1;
...
g_InUpdateData=https://bbs.csdn.net/topics/0;
}
uj5u.com熱心網友回復:
保證每一次控制元件值發生改變,才要呼叫UpdateData。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/99774.html
標籤:基礎類
