获取新创建的堆栈溢出错误 类
Getting Stack Overflow Error on newly created classes
我正在重构我的 8080 Space Invaders 模拟器。我已经将一些方法移动到 CPU class 中,将其他方法移动到 _8080 class 中。我正在使用 Visual Studio,所以有一个 MainForm class。现在,当我 运行 程序时,我在 _8080 class 中的 CPU class 声明中收到堆栈溢出错误。问题是,当我删除它进行测试时,我在 MainForm 声明中得到它,然后在 CPU class 中我得到它用于 class.[=16 中的相同声明=]
这是_8080的全部class
namespace SpaceInvaders
{
class _8080
{
private CPU cpu = new CPU(); // ERROR IS THROWN HERE **
private MainForm MainForm = new MainForm();
public void StartEmulator()
{
cpu.initialiseEmulator(); // Reset
LoadProgram("invaders.rom"); // Load ROM
cpu.emulateCPU();
}
private bool LoadProgram(string filename)
{
Console.WriteLine("\nLoading: " + filename + "\n");
//Initialize(); //reset
//load file
byte[] loadedProgramBytes = null;
try
{
loadedProgramBytes = File.ReadAllBytes(filename);
}
catch (Exception Ex)
{
Debug.WriteLine(Ex.ToString());
}
//verify file is not empty
if (loadedProgramBytes == null)
{
Debug.WriteLine("Error loading program. The byte array loaded is null.");
return false;
}
int lSize = loadedProgramBytes.Count();
for (int i = 0; i < lSize; ++i)
{
cpu.memory[i] = loadedProgramBytes[i]; // Store file into memory.
}
Debug.WriteLine("ROM loaded in successfully.\n");
return true;
}
private void updateScreen(int addr, int val)
{
int x = addr >> 5;
int y = 255 - ((addr & 0x1f) << 3);
for (int bit = 1; bit <= 128; bit <<= 1)
{
//screenBuffer.SetPixel(x, y--, (bit & val) != 0 ? Color.White : Color.Black);
}
//Bitmap clone = (Bitmap)screenBuffer.Clone();
//MainForm.pictureBox1.BackgroundImage = clone;
}
}
}
抛出的异常是
System.WhosebugException HResult=0x800703E9 Message=Exception
of type 'System.WhosebugException' was thrown.
有人知道如何解决这个问题吗?我是这个网站的新手,所以不确定它是如何工作的,发布了很长的 class 文本等。我不想用代码让人们负担过重,但同时我明白如果没有足够的信息就很难提供帮助。如果有帮助,我在下面的程序中为每个 classes 添加了三个 Pastebin。
https://pastebin.com/gYhhQd5D << 主窗体 Class
https://pastebin.com/MhdGwanm << _8080 Class
https://pastebin.com/T9t6dNjL << CPU Class
谢谢。
CPU 构造函数正在调用 MainForm 构造函数,后者正在调用 CPU 构造函数,它是...
这很可能是由于构造函数调用的无限循环。
例如
class _8080 {
private CPU cpu;
private MainForm MainForm;
public _8080 (CPU cpu, MainForm, mainForm) {
this.cpu = cpu;
this.MainForm = mainform;
}
}
也将此应用到 CPU 和 MainForm class
删除:
private _8080 _8080 = new _8080();
private MainForm MainForm = new MainForm();
来自 CPU class(对于粘贴 bin 代码,您不会在那里使用它们)
在 8080 中,您的代码使用 cpu 和主窗体
在 Mainform 中,您的代码使用(注释)8080
因此,在 Mainform 中创建全局 cpu 并将其传递给其他构造函数
private CPU cpu = new CPU(); //Remember you removed from cpu class the 2 lines with the new ....
private _8080 _8080 = new _8080(this, cpu);
public MainForm()
{
InitializeComponent();
}
[...]
而 8080 class 删除初始化并添加构造函数:
private CPU cpu;
private MainForm MainForm;
public 8080( MainForm _MainForm, CPU _cpu)
{
cpu = _cpu;
MainForm = _MainForm;
}
// 请注意,为了尽量减少代码更改,我错误地使用了命名约定。伙计们,不要在家里这样做
我正在重构我的 8080 Space Invaders 模拟器。我已经将一些方法移动到 CPU class 中,将其他方法移动到 _8080 class 中。我正在使用 Visual Studio,所以有一个 MainForm class。现在,当我 运行 程序时,我在 _8080 class 中的 CPU class 声明中收到堆栈溢出错误。问题是,当我删除它进行测试时,我在 MainForm 声明中得到它,然后在 CPU class 中我得到它用于 class.[=16 中的相同声明=]
这是_8080的全部class
namespace SpaceInvaders
{
class _8080
{
private CPU cpu = new CPU(); // ERROR IS THROWN HERE **
private MainForm MainForm = new MainForm();
public void StartEmulator()
{
cpu.initialiseEmulator(); // Reset
LoadProgram("invaders.rom"); // Load ROM
cpu.emulateCPU();
}
private bool LoadProgram(string filename)
{
Console.WriteLine("\nLoading: " + filename + "\n");
//Initialize(); //reset
//load file
byte[] loadedProgramBytes = null;
try
{
loadedProgramBytes = File.ReadAllBytes(filename);
}
catch (Exception Ex)
{
Debug.WriteLine(Ex.ToString());
}
//verify file is not empty
if (loadedProgramBytes == null)
{
Debug.WriteLine("Error loading program. The byte array loaded is null.");
return false;
}
int lSize = loadedProgramBytes.Count();
for (int i = 0; i < lSize; ++i)
{
cpu.memory[i] = loadedProgramBytes[i]; // Store file into memory.
}
Debug.WriteLine("ROM loaded in successfully.\n");
return true;
}
private void updateScreen(int addr, int val)
{
int x = addr >> 5;
int y = 255 - ((addr & 0x1f) << 3);
for (int bit = 1; bit <= 128; bit <<= 1)
{
//screenBuffer.SetPixel(x, y--, (bit & val) != 0 ? Color.White : Color.Black);
}
//Bitmap clone = (Bitmap)screenBuffer.Clone();
//MainForm.pictureBox1.BackgroundImage = clone;
}
}
}
抛出的异常是
System.WhosebugException HResult=0x800703E9 Message=Exception of type 'System.WhosebugException' was thrown.
有人知道如何解决这个问题吗?我是这个网站的新手,所以不确定它是如何工作的,发布了很长的 class 文本等。我不想用代码让人们负担过重,但同时我明白如果没有足够的信息就很难提供帮助。如果有帮助,我在下面的程序中为每个 classes 添加了三个 Pastebin。
https://pastebin.com/gYhhQd5D << 主窗体 Class
https://pastebin.com/MhdGwanm << _8080 Class
https://pastebin.com/T9t6dNjL << CPU Class
谢谢。
CPU 构造函数正在调用 MainForm 构造函数,后者正在调用 CPU 构造函数,它是...
这很可能是由于构造函数调用的无限循环。
例如
class _8080 {
private CPU cpu;
private MainForm MainForm;
public _8080 (CPU cpu, MainForm, mainForm) {
this.cpu = cpu;
this.MainForm = mainform;
}
}
也将此应用到 CPU 和 MainForm class
删除:
private _8080 _8080 = new _8080();
private MainForm MainForm = new MainForm();
来自 CPU class(对于粘贴 bin 代码,您不会在那里使用它们)
在 8080 中,您的代码使用 cpu 和主窗体
在 Mainform 中,您的代码使用(注释)8080
因此,在 Mainform 中创建全局 cpu 并将其传递给其他构造函数
private CPU cpu = new CPU(); //Remember you removed from cpu class the 2 lines with the new ....
private _8080 _8080 = new _8080(this, cpu);
public MainForm()
{
InitializeComponent();
}
[...]
而 8080 class 删除初始化并添加构造函数:
private CPU cpu;
private MainForm MainForm;
public 8080( MainForm _MainForm, CPU _cpu)
{
cpu = _cpu;
MainForm = _MainForm;
}
// 请注意,为了尽量减少代码更改,我错误地使用了命名约定。伙计们,不要在家里这样做