调用函数时出现断点(无其他内容)(问题已解决,一是修改为引用,二是更新vs和easyx库版本,感谢各位大佬)

0

使用的是vs2019,第一个代码和第二个代码分属两个头文件中的类,问题出现在第二个代码最后的SetLine函数上,运行直接显示出现一个断点(其他的都没给),经测试,直接将第二个代码更为第三个代码无问题,且第二个代码函数内部增加断点时晚于BUG的出现,调用第一个代码中的其他函数操作结构体(gridLine)时无问题。

另附有两个库文件的全部内容,在第四、第五个代码,第六个代码把有用的部分整合在了一起。

求教大佬!!!

第一个代码

#pragma once

#include <graphics.h>

struct LINEDATA
{
	LINESTYLE style;
	COLORREF color;
};

class LINE
{
public:
	void SetLine(LINEDATA lineData);
	void SetLine(LINEDATA& lineData, int thickness, COLORREF color);
};

void LINE::SetLine(LINEDATA lineData)
{
	setlinecolor(lineData.color);
	setlinestyle(&lineData.style);
	return;
}

第二个代码

class GAME
{
private:
	LINE line;
	LINEDATA gridLine;
public:
	GAME();
	void GridDraw(int x, int y);
	void FlagDraw(int x, int y);
};

void GAME::GridDraw(int x, int y)
{
	setfillcolor(RGB(220, 220, 220));
	line.SetLine(gridLine);
	fillrectangle(x, y, x + 10, y + 10);
	return;
}

第三个代码(省去了部分已有内容)

void GAME::GridDraw(int x, int y)
{
	setfillcolor(RGB(220, 220, 220));
	setlinecolor(gridLine.color);
	setlinestyle(&gridLine.style);
	//line.SetLine(gridLine);
	fillrectangle(x, y, x + 10, y + 10);
	return;
}

第四个代码

#pragma once

#include <graphics.h>

struct LINEDATA
{
	LINESTYLE style;
	COLORREF color;
};

class LINE
{
public:
	void SetLine(LINEDATA lineData);
	void SetLine(LINEDATA& lineData, int thickness, COLORREF color);
};

void LINE::SetLine(LINEDATA lineData)
{
	setlinecolor(lineData.color);
	setlinestyle(&lineData.style);
	return;
}

void LINE::SetLine(LINEDATA& lineData, int thickness, COLORREF color)
{
	lineData.color = color;
	lineData.style.thickness = thickness;
	return;
}

第五个代码

#pragma once

#include <graphics.h>

#include "LOADING.h"

#include "LINE.h"

class GAME
{
private:
	LINE line;
	LINEDATA gridLine;
public:
	GAME();
	void GridDraw(int x, int y);
	void FlagDraw(int x, int y);
};

GAME::GAME()
{
	LOADING loading;

	getlinestyle(&gridLine.style);
	line.SetLine(gridLine, 2, RGB(248, 248, 255));
	Sleep(1000);
	closegraph();
	initgraph(300, 160);
	for (int i = 0;i < 30;i++)
	{
		for (int j = 0;j < 16;j++)
		{
			GridDraw(i * 10, j * 10);
		}
	}
	return;
}

void GAME::GridDraw(int x, int y)
{
	setfillcolor(RGB(220, 220, 220));
	setlinecolor(gridLine.color);
	setlinestyle(&gridLine.style);
	//line.SetLine(gridLine);
	fillrectangle(x, y, x + 10, y + 10);
	return;
}

void GAME::FlagDraw(int x, int y)
{
	;
}

第六个代码

#include <graphics.h>


struct LINEDATA
{
	LINESTYLE style;
	COLORREF color;
};


class LINE
{
public:
	void SetLine(LINEDATA lineData);
	void SetLine(LINEDATA& lineData, int thickness, COLORREF color);
};

void LINE::SetLine(LINEDATA lineData)
{
	setlinecolor(lineData.color);
	setlinestyle(&lineData.style);
	return;
}

void LINE::SetLine(LINEDATA& lineData, int thickness, COLORREF color)
{
	lineData.color = color;
	lineData.style.thickness = thickness;
	return;
}

class GAME
{
private:
	LINE line;
	LINEDATA gridLine;
public:
	GAME();
	void GridDraw(int x, int y);
	void FlagDraw(int x, int y);
};

GAME::GAME()
{
	//LOADING loading;
	initgraph(50, 50);

	getlinestyle(&gridLine.style);
	line.SetLine(gridLine, 2, RGB(248, 248, 255));
	Sleep(1000);
	closegraph();
	initgraph(300, 160);
	for (int i = 0;i < 30;i++)
	{
		for (int j = 0;j < 16;j++)
		{
			GridDraw(i * 10, j * 10);
		}
	}
	return;
}

void GAME::GridDraw(int x, int y)
{
	setfillcolor(RGB(220, 220, 220));
	//setlinecolor(gridLine.color);
	//setlinestyle(&gridLine.style);
	line.SetLine(gridLine);
	fillrectangle(x, y, x + 10, y + 10);
	return;
}

void GAME::FlagDraw(int x, int y)
{
	;
}

int main()
{
	GAME game;
}
ava
苍穹之上

2021-1-19

0

我认为唯一有可能的原因是由于在 line.SetLine(gridLine); 时传进去的是一整个结构体,这样一来对 setlinestyle 执行操作时,使用的将会是临时变量,而 settlinestyle 可能在未完全复制完之前就返回了(其它线程),然后被释放,所以没有复制完。不过这只是一种猜测。可以试着传指针或者引用试试。

ava
六月

2021-1-19

实测有用,谢谢大佬!!!(以下一些碎碎念)为啥我之前用自定义的TEXT结构体保存信息,用TEXT.h中的setText调用(没错,就是换了个皮)没出问题啊,而且我这不是单线程操作吗? -  苍穹之上  2021-1-19
技术讨论社区