?? error.cpp
字號:
////////////////////////////////////////////
// //
// Error.cpp //
// 錯誤處理模塊 //
// 接受系統錯誤報告并屏幕反饋給用戶 //
// 最后更新時間:2004年4月23日11:33 //
// //
////////////////////////////////////////////
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include "Window.h"
#include "Error.h"
extern Window winEdit;
void ShowError
(
const ErrorType ErrorCode, // 錯誤類型代碼
const int LineNo, // 發生錯誤的行號
const char Extra[MaxY] // 附加信息,變量、標識符等
)
{
char strTemp[MaxY];
char Message[MaxY];
// 置錯誤代碼
Error = ErrorCode;
if (NoShown)
{
// 不顯示錯誤模式
return;
}
switch (ErrorCode)
{
case ErrorOpening:
// 打開文件錯誤
strcpy(Message, "Opening file error!");
break;
case ErrorSaving:
// 存儲文件錯誤
strcpy(Message, "Saving file error!");
break;
case ErrorNoFreeMemoryInEdit:
// 在編輯狀態下無可用內存報告
strcpy(Message, "No free memory. Reduce your codes.");
break;
case ErrorTooLong:
// 不能再添加新的行
strcpy(Message, "Cannot add a new line.");
break;
case ErrorPrint:
// 打印錯誤
strcpy(Message, "Print error.");
break;
case ErrorNoFreeMemoryInRun:
// 在運行狀態下無可用內存報告
strcpy(Message, "No free memory. Reduce your variables.");
break;
case ErrorUnwantedPart:
// 語句后面有多余部分
strcpy(Message, "Unwanted tail after line");
break;
case ErrorVar:
// 非法的變量名
strcpy(Message, "Invalid variable name");
break;
case ErrorMissingAS:
// 缺少關鍵字AS
strcpy(Message, "Missing AS after variable");
break;
case ErrorMissingVarType:
// 缺少變量類型
strcpy(Message, "Missing variable type");
break;
case ErrorMissingArraySize:
// 缺少數組大小
strcpy(Message, "Missing array range size");
break;
case ErrorExpression:
// 表達式錯誤
strcpy(Message, "Error in expression");
break;
case ErrorMissingExpression:
// 缺少表達式
strcpy(Message, "Missing expression");
break;
case ErrorPrintSeparate:
// 非法的分隔符
strcpy(Message, "Invalid separate symbol");
break;
case ErrorQuotation:
// 字符串后缺少雙引號
strcpy(Message, "Missing '\"' after string");
break;
case ErrorMustInteger:
// 循環變量必須為整數
sprintf(Message, "Must use integer variable '%s'", Extra);
break;
case ErrorUnmatchForVar:
// NEXT后的循環變量不匹配
sprintf(Message, "Unmatch loop variable '%s' after 'NEXT'", Extra);
break;
case ErrorMissingForVarGiveValue:
// FOR語句中缺少賦值語句
strcpy(Message, "Missing giving value to variable");
break;
case ErrorMissingTO:
// FOR語句中缺少TO
strcpy(Message, "Missing 'TO'");
break;
case ErrorMissingSTEP:
// FOR語句中缺少STEP
strcpy(Message, "Missing 'STEP'");
break;
case ErrorMissingNEXT:
// 缺少NEXT
strcpy(Message, "Missing 'NEXT' in program.");
break;
case ErrorUnwantedNEXT:
// 多余的NEXT語句
strcpy(Message, "Unwanted 'NEXT'");
break;
case ErrorUnwantedCONTINUE:
// 多余的CONTINUE語句
strcpy(Message, "Unwanted 'CONTINUE'");
break;
case ErrorUnwantedBREAK:
// 多余BREAK語句
strcpy(Message, "Unwanted 'BREAK'");
break;
case ErrorMoreFor:
// 太多的FOR語句
strcpy(Message, "Too many loops in program");
break;
case ErrorMoreNestFor:
// 太多的循環嵌套哦
strcpy(Message, "Too many nested loops in program");
break;
case ErrorMissingTHEN:
// 缺少THEN
strcpy(Message, "Missing 'THEN' or having unwanted tail");
break;
case ErrorMissingENDIF:
// 缺少ENDIF
strcpy(Message, "Missing 'END IF' in program.");
break;
case ErrorBool:
// 布爾表達式錯誤
strcpy(Message, "Boolean expression error");
break;
case ErrorUnwantedELSE:
// 多余的ELSE
strcpy(Message, "Unwanted 'ELSE'");
break;
case ErrorUnwantedENDIF:
// 多余的ENDIF
strcpy(Message, "Unwanted 'END IF'");
break;
case ErrorMoreIf:
// 太多的IF語句
strcpy(Message, "Too many 'IF' in program.");
break;
case ErrorMoreNestIf:
// 太多的IF嵌套
strcpy(Message, "Too many nested 'IF' in program.");
break;
case ErrorSubName:
// 錯誤的過程名
strcpy(Message, "Sub name error");
break;
case ErrorMissingSubName:
// 缺少過程名
strcpy(Message, "Missing sub name");
break;
case ErrorMissingENDSUB:
// 缺少ENDSUB
strcpy(Message, "Missing 'END SUB' in program.");
break;
case ErrorUnwantedENDSUB:
// 多余的END SUB
strcpy(Message, "Unwanted 'END SUB'");
break;
case ErrorUnwantedRETURN:
// 多余的RETURN語句
strcpy(Message, "Unwanted 'RETURN'");
break;
case ErrorMoreSub:
// 太多的過程
strcpy(Message, "Too many sub in program");
break;
case ErrorNoSuchSub:
// 無法找到此過程
sprintf(Message, "Can not find such sub '%s'", Extra);
break;
case ErrorSubPosition:
// 過程內不得再定義過程
strcpy(Message, "Sub position error");
break;
case ErrorMissingRange:
// 數組變量中缺少下標
strcpy(Message, "Missing range in array variable");
break;
case ErrorUnwantedComma:
// 多余的逗號
strcpy(Message, "Unwanted comma here");
break;
case ErrorRangeOverflow:
// 數組下標溢出
strcpy(Message, "Array variable range overflow");
break;
case ErrorLocatePara:
// LOCATE參數個數錯誤
strcpy(Message, "The bumber of locate parameter error");
break;
case ErrorCoordinate:
// LOCATE語句中坐標錯誤
strcpy(Message, "Coordinate in locate is wrong");
break;
case ErrorUndefined:
// 變量未定義
sprintf(Message, "Undefined variable '%s'", Extra);
break;
case ErrorDim:
// 數組維數不匹配
sprintf(Message, "Array dimension not match on '%s'", Extra);
break;
case ErrorMissingBracketInArray:
// 數組使用時缺少右括號
sprintf(Message, "Missing ')' at array variable %s", Extra);
break;
case ErrorMissingSubscript:
// 數組缺少下標
sprintf(Message, "Missing range subscript");
break;
case ErrorMissingVar:
// 缺少變量
strcpy(Message, "Missing variable name");
break;
case ErrorCannotDelArray:
// 不能刪除數組變量的某個元素
strcpy(Message, "Can not delete array element");
break;
case ErrorDelayTime:
// 延遲時間錯誤
strcpy(Message, "Time of delay error");
break;
case ErrorRND:
// RND參數錯誤
strcpy(Message, "RND parameter error");
break;
case ErrorZeroDivision:
// 零做除數
strcpy(Message, "Divided by zero");
break;
case ErrorSyntax:
// 語法錯誤
strcpy(Message, "Syntax error");
break;
case ErrorMissingParameter:
// 在函數后面缺少參數
strcpy(Message, "Missing parameter after function");
break;
case ErrorInput:
// 輸入錯誤
strcpy(Message, "Input not match");
break;
case ErrorSerious:
strcpy(Message, Extra);
exit(0);
default:
printf("No error message, add it. %d", Error);
int Key;
Receive(Key);
break;
}
// 警報
Sound();
// 得到最終顯示信息
char Mess[MaxY] = "";
if (LineNo > -1)
{
sprintf(Mess, "%s at line %d", Message, LineNo + 1);
}
else
{
sprintf(Mess, " %s ", Message);
}
if (LineNo > -1)
{
// 有附帶行號信息
puttext(1, 1, 80, 25, TextMirror);
// 設置錯誤行為當前行
TextX = LineNo;
TextY = LengthOf(TextX);
if (LineNo < x0 || LineNo >= x0 + winEdit.High())
{
// 超處當前屏
x0 = LineNo;
PrintText(winEdit.Top() + 1);
}
// 計算光標位置
NowX = LineNo - x0 + winEdit.Top() + 1;
NowY = winEdit.Left() + TextY + 1;
ShowPosition();
// 滾動垂直滾動條
winEdit.ScrollVertical(TextX);
}
// 顯示錯誤窗口
int Len = strlen(Mess);
Window Error(6, (76 - Len) / 2 + 2, 10, (76 - Len) / 2 + Len + 5, true, false);
char ErrorTitle[15] = "";
sprintf(ErrorTitle, "Error %d#", ErrorCode);
Error.SetTitle(ErrorTitle);
Error.SetColor(WHITE, LIGHTGRAY, RED, LIGHTGRAY);
Error.Add(Mess);
Error.Show();
Error.Wait();
Error.Hide();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -