Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

c++小记录 #1

Open
liuxq opened this issue Oct 29, 2016 · 0 comments
Open

c++小记录 #1

liuxq opened this issue Oct 29, 2016 · 0 comments
Labels

Comments

@liuxq
Copy link
Owner

liuxq commented Oct 29, 2016

<<和 >> 操作符不能读写二进制文件
对于二进制存储string,在文本里保存的也是asc11,跟直接存文本差不错
生成dll时对外接口的参数中不要有string(vector等猜测也不行)否则会有删除临时string时堆异常,至少我做的那个例子是这样,不是道是否恒成立。
类导出dll类导出dll类导出dll,最好让导出.h和导入.h共用,否则容易不一致,如果不一致,将会在大部分情况是没有错误的,而在小部分情况(如使用release时)程序崩溃,导致极难找到错误所在。另外程序不要只在debug下跑,很多错误(例如内存泄露)只在release时才会出现


char temp[10][10];
char destTemp[10][10];
memcpy(destTemp,temp,100);
复制的单位是所有元素数(而不是想自己考虑的那样以10个为单位);


10是换行
char a[20] = {'a','b','c',10,'a','b'};
cout<< a<<endl;
显示结果是:
abc
ab
ifstream aa;aa.get();可以得到字符,包括换行符


while (inFileReader.peek() == ' ' || inFileReader.peek() == '\t')
{
inFileReader.ignore();
}
用于去掉空格


dfs可以通过bool数组保存状态,对处理过得状态作为临界条件
可以使用筛法计算n内的所有素数,时空复杂度都为o(n)


std::string 和string不一样,比如:一个支持“==”,一个不支持


注意注意在c++中如果不导入math.h,则abs(double)会使double截尾。usaco中不支持abs(double)只支持int,导入math.h也不行,


ofstream 写文件时到最后close或flush或超过了缓存才会真的写到文件中,或者调用了endl


struct char4
{
unsigned char a:4;
unsigned char b:4;
}
可以这样来节省空间
vector::resize(n,v) .在0-min(n,size)之间的值是不变的,后面的值赋为v


dll还需要lib作为引导库,其中记录了函数头信息,但是在发布之后lib信息都被链接到了exe中,就不需要在发布文件件中再放入lib文件了


vtk小tip
actor 如果new了并且render->addActor了,就要render->removeactor,但是只new一次actor,后面的render->addActor就不需要render->removeactor了
sgrid->GetPointData()->GetScalars()->GetRange()才能获得当前scalar范围
而sgrid->GetPointData()->GetArray(int)->GetRange()获取的范围不对
vtkdataArray 要调用getRange之后才会计算范围


glsl
uniform sampler2D tex;定义的变量如果没有在代码中引用,则不会成功定义,不会放到表中
opengl中的quad点的顺序是需要顺时针的
glColor3ub要记得加u不然很悲剧


需要设置项目依赖项,否则其他项目中lib是不可见的
动态链接库版本:
/MD Multithreaded DLL 使用导入库MSVCRT.LIB
/MDd Debug Multithreaded DLL 使用导入库MSVCRTD.LIB
静态库版本:
/ML Single-Threaded 使用静态库LIBC.LIB
/MLd Debug Single-Threaded 使用静态库LIBCD.LIB
/MT Multithreaded 使用静态库LIBCMT.LIB
/MTd Debug Multithreaded 使用静态库LIBCMTD.LIB
使用一个开源库,先看生成库时使用的运行时库,在调用时必须一致


openGL在使用拾取时,注意鼠标的y值使用viewport[3]来减,此时viewport中的高和宽不可以归一,因为归一后高可能不再是屏幕的高,此时有两种应对变形的解决方案:1.使用glOrtho对应当前窗口的宽和高,2.viewport继续归一,只是不再使用viewport[3]来减,而是使用当前窗口的高来减
gldisableClientState(GL_COLOR_ARRAY);再glEnableClientState(GL_COLOR_ARRAY);时必须重新指定颜色数组,其他数组也一样
glewInit();必须先调用才能使用glew库里的东西
在写入帧缓存时不需要glEnable(texture_2D);想想也不需要,前者是要把纹理帖到表面上
半透明要记得先绘制不透明的,再绘制半透明的
帧缓冲对象需要给它指定深度纹理,才能向其中写入带深度测试的结果,否则深度测试没法进行
纹理一旦取出来了(bind)就不可以再往里写,除非重启帧缓存

GL_TEXTURE_RECTANGLE需要注意,sample时,坐标并不归一,而GL_TEXTURE_2D的坐标是归一的
openGL的透视投影是把坐标按照ortho的参数使之在三个方向都规约到-1-1之间,而在范围之外的点被裁减掉,之后再由viewport参数进行光栅化。
向量叉乘的左右手定则按照坐标系而变换,是左手坐标系就用左手,否则就用右手
旋转矩阵的推导,先把p分解为x和y方向的两个向量的和,之后旋转x和y向量,再做加法


vector多线程时,如果一个线程在写,另一个同时读的条件是集合的元素是小类型如(double)而如果存着vector等大数据,则不可以同时读写
集合中pushback元素时,集合中该元素的地址跟原来元素的地址是不同的

QSplitter当delete时,里面放置的widget也一起delete

定义结构体的时候,成员最好能从大到小来定义,那样能相对的省空间

CMyString& CMyString::operator =(const CMyString &str) {
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData, str.m_pData);
return *this;
}这样是可以的,虽然m_pData是私有的,但是可以访问,因为跟自己的同一个类
顺序表删除多个元素时,可以通过类似partition的思想,遍历一次删除完全
signal里面的函数参数只能写类型,不能写变量名字

Vc6.0中的fstream必须要加ios::out才能创建文件

@liuxq liuxq changed the title c++小记录 #1 c++小记录 Oct 29, 2016
@liuxq liuxq added the blog label Oct 29, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant