我遇到过的vs、c++等问题的总结

1.如何配置vs的可执行exe、dll的路径。

我遇到过的vs、c++等问题的总结_第1张图片

这么设置的话就不用再在系统的path路径下设置了。

2.如何解决winh.h出现语法错误的问题,这一般是由于打开老版本的directShow引起的。

解决方法是把DirectX的include文件放到sdk的include路径的后面见图,这个要手工添加不能按下黑色的小三角使用对话框添加。:

我遇到过的vs、c++等问题的总结_第2张图片

3.出现char与Cstring转换错误,这是由于Cstring是宽字符,转换的时候出错了。去掉工程的Unicode支持就可以了


4.在mfc程序中,是不可以调用AfxWinInit(::GetModuleHandle(NULL),NULL,::GetCommandLine(),0)这个函数的,因为在mfc程序框架中已经调用过了。

5.标准c++中的std::string 转换成char*的做法:

string 转化 char类型 
string str;
char *a;
a=str.c_ctr();

6.如何立即重绘mfc窗口

http://wenku.baidu.com/link?url=kvxtJtAipKJQahBz81HqJdgS9IHdKF2acMI1pYt2g52yWTLZY-tbcM67Kfm-nuYL085bu7qV86OyFvDXOi94E8nVZ_AlkLVQld2AOh0db_W

在view类中调用:

this->Invalidate();
		//this->UpdateWindow();

7.class重定义。

原因是.h文件被多次包含,解决办法:在头文件中加入

#pragma once

8.在c++类的静态变量 a例如:

class  t
{
static int a ;
void hello();
};
在初始化时应该采用

int t::a = 3;
的形式。否则会产生link 错误:无法解析的外部符号:a之类的错误。

9.  vs2010 错误提示框:文件加载 使用 简体中文(GB2312)编码加载文件C:\Users\Administrator\AppData\Local\Temp\nxhgjasi.5au\Temp\Properies\AssemblyInfo.cs时,有些字节已用Unicode替换字符替换。保存该文件将不会保留原始文件内容。 解决方法

http://mituhao.diandian.com/post/2012-01-05/40027609137 

利用上面的网址介绍的方法大部分人发现根本不能用,因为大部分人的vs上面的那个选项的对勾是打上的,解决方法是:

(1)在那个选项上的对勾去掉,点击确定。

(2) 重启vs

(3) 把那个对勾选上。

(4)重新启动vs。ok问题解决。

我出现这个问题的原因是由于我使用了ue的列模式,然后直接保存了,没有转换成行模式。

10:在windows sdk环境下使用多线程编程:

多线程编程的难点在于同步,

#include<Windows.h>
#include<process.h>
#include<iostream>
DWORD WINAPI thread(LPVOID pvoid)
{
	HANDLE hMutex = (HANDLE)pvoid;
	while(1)
	{
		WaitForSingleObject(hMutex,INFINITE);
		std::cout<<"thread"<<std::endl;
		ReleaseMutex(hMutex);
	}
	return 0;
}

int main()
{
	HANDLE  hMutex;
	hMutex = CreateMutex(NULL,FALSE,"onlyOne");
	if(hMutex)
	{
		if(ERROR_ALREADY_EXISTS == GetLastError() )
		{
			std::cout<<"alread run"<<std::endl;
			return -1;
		}
	}
	//_beginthread(thread,0,NULL);
	HANDLE hTread1= CreateThread(NULL,0,thread,(LPVOID)hMutex,0,NULL);
	CloseHandle(hTread1);
	while(1)
	{
		WaitForSingleObject(hMutex,INFINITE);
		std::cout<<"main"<<std::endl;
		Sleep(200);
		ReleaseMutex(hMutex);
	}
}


11.如何把int型转换成string或者char*型:利用sprintf函数完美解决。

参考网址:http://bbs.csdn.net/topics/220013347

#include<iostream>

int main()
{
	int a = 20;
	char buf[10];
	sprintf(buf,"%d",a);
	std::cout<<buf<<std::endl;
	std::cin>>a;
	return 0;
}


12.如何在c++(vs2010环境)中写相对路径。

#include<iostream>
#include<opencv\cv.h>
#include<opencv\highgui.h>
using namespace cv;
using namespace std;

int main()
{
	cv::Mat mat= imread("hello.jpg");
	char *t = "./tt/temp.jpg";
	if( imwrite(t,mat) == false)
		std::cout<<"tt"<<std::endl;
	return 0;
}

13在c++类中实现多线程。

http://hi.baidu.com/neutblue/item/eeea9d7e60edc92fd6a89c62

http://blog.sina.com.cn/s/blog_4cce4f6a0100buel.html

我推荐使用的一种方法:使用友元函数方法:友元函数既是一个独立的函数,又可以访问类中的私有变量,又符合线程要求是一个独立函数的要求,所以我认为是实现多线程的很好的一个选择。

#include<iostream>
#include<process.h>
#include<Windows.h>
class t;
void setA(t &_t,int b);
class t{
public:
	friend void setA(PVOID pvoid );
private:
	int a;

};
struct param{
public:
	t &_t;
	int b;
};
void setA(PVOID pvoid )
{
	//t *ptr = (t*)pvoid ;
	param *ptr = (param *)pvoid ;
	for(int i=0;i<20000;i++)
	{
		ptr->_t.a = 2;
		std::cout<<ptr->_t.a<<std::endl;
	}
}
void main()
{
	t _t;
	int b = 0;
	param p ={_t,b};
	param *ptr = &p;
	_beginthread(setA,0,&p);
	Sleep(3000);
	std::cout<<"main()"<<std::endl;

	//std::cout<<_t.a <<std::endl;

}

14:处理时间的函数:

http://blog.csdn.net/coder_xia/article/details/6566708

另外补充:time函数在windows系统中的单位是秒。

15:

VS2010 C++编译报错LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏  

解决办法:

http://longtianyu1.blog.163.com/blog/static/99819652012113112827491/

终极解决方案:
VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK1123” 错误,解决方案为将 项目|项目属性|配置属性|清单工具|输入和输出|嵌入清单 “是”改为“否”即可,但是没新建一个项目都要这样设置一次。
在建立VS2010 Win32 Project项目时,按照上面解决方案依然发生了“error LNK1123”错误,经过上网查资料,解决方案为:
第一步:与上相同。
第二步:将 项目|项目属性|配置属性|连接器|清单文件|嵌入清单 “是”改为“否”。
第三步:一般计算机经过上两步设置就能解决问题了,但是如果还有问题,那就按一下方法解决:
计算机是否为64bit操作系统,如是,继续2。
查找是否有两个cvtres.exe。一个是C:\Program Files(x86)\Microsoft Visual Studio 10.0\vc\bin\cvtres.exe, 另一个是C:\Windows\Microsoft.NET\Framework\v
4.0.30319\cvtres.exe。右键属性|详细信息 查看两者版本号,删除/重命名较旧的版本,或者重新设置Path变量。

意外的是,治本的办法是第三步,删除旧版本的cvtres.exe后,就不需要每次都设置配置了。

16  如何调试mfc程序。

wchar_t *test = L"hello";
OutputDebugString(test);即可在输出窗口出现调试出的“hello”字符串

TRACE("Create database successful.");  可以起到跟他一样的效果。

17: 使用std::vector 删除元素。

#include<vector>
#include<iostream>
using namespace std;

void main()
{
	vector<int> a ;
	a.push_back(1);
	a.push_back(2);
	a.push_back(3);
	a.push_back(4);
	a.push_back(5);
	vector<int>::iterator it;
	for(it = a.begin();it != a.end();it++)
	{
		if(*it== 3)
		{
			it =	a.erase(it);
		}
		cout<<*it<<endl;
	}

}

18:如何避免出现空悬指针

delete p;
p = nullptr;

19:在c++中如何存储位

std::bitset

20.在mfc中如何使用cArray。

http://msdn.microsoft.com/en-us/library/ms926680     msdn文档。

http://blog.csdn.net/password318/article/details/6858647 carray的使用例子

carray分的种类可以参看msdn文档。使用例子见下:

void ClllView::OnDraw(CDC* /*pDC*/)
{
	ClllDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;
	//OutputDebugString(L"ttt");
	CArray<CPoint,CPoint&> m_Array;//普通array使用
	m_Array.SetSize(10,10);
	CPoint pt1(10,10);
	m_Array.Add(pt1);
	CPoint pt2(10,50);   
	m_Array.Add(pt2);    
	CPoint pt3(10,100);
	CPoint pt4(200,33);
	m_Array.Add(pt3);  
	m_Array.Add(pt4);
	int size = m_Array.GetSize();
	CClientDC dc(this);
	dc.MoveTo(0,0);
	CPoint pt;
	for(int i=0;i<size;i++)
	{
		pt= m_Array.GetAt(i);
		dc.LineTo(pt);
		OutputDebugString(L"tt");
	}
	CStringArray ar;//cstringarray使用
	CString str("111111");
	ar.Add(str);
	OutputDebugString(str.GetString());
	// TODO: 在此处为本机数据添加绘制代码
}

21:ctime的使用

CTime  time = CTime::GetCurrentTime();
	CString str = time.Format("%H:%M:%S");
	pdc->TextOutW(0,0,str);

22:MFC中的定时器的KillTimer(IDTIMER1)函数应该在窗口销毁之前调用,否则就会出现断言错误。SetTimer(IDTIMER1,1000,NULL);函数应该在窗口创建之后调用,否则同样会出现错误。

23:mfc的Cstring转换成double是atof,double转换成Cstring是formate。%lf。

24:使窗口处在最 前面

CRect rcMy;
	::GetWindowRect(m_hWnd, rcMy); //得到当前的窗口位置
	//设为总在最前
	SetWindowPos(&wndTopMost, rcMy.left,  rcMy.top, rcMy.Size().cx, rcMy.Size().cy, SWP_SHOWWINDOW);
	//取消总在最前
	//SetWindowPos(&wndNoTopMost, rcMy.left,  rcMy.top, rcMy.Size().cx, rcMy.Size().cy, SWP_SHOWWINDOW); 

25:CFileDialog自动改变当前目录问题解决方案

http://blog.csdn.net/zhuce0001/article/details/8990850

26:串口的写法:

m_portNum="\\\\.\\COM10";不应该只写com10

你可能感兴趣的:(我遇到过的vs、c++等问题的总结)