最近在使用VS2015进行在线调试的时候出现诡异一幕(好像以前遇到过一次):git
变量赋值以后,在线调试仍是没法改变!!github
变量赋值以后,在线调试仍是没法改变!!函数
解决方案有两种:测试
尽可能不要在Release模式下打断点进行调试(观测的值和printf打印的值对应不上).net
在线调试使用debug,运行结果测试使用releasedebug
这个规范包括不少方面,具体参考微软的代码规范调试
好比遇到一个事情:
-0.5
和-1.0*0.5
代码规范前者就是通不过,后者彻底能够code
遇到的问题老是很奇葩,-1%31=????
,负数和正数的取余是多少?
-1 % 30 = -1
-1 % 30 = 29
到底哪一个是正确的?
网上也没具体的一些资料,都是各有各的说法,如下给出一个取余代码
#ifndef MOD #define MOD(a,b) (abs(a+b) % abs(b)) #endif
直接上代码:
typedef struct IMAGE_S_t { int rows; int cols; void* data; }IMAGE_S; void CartToPolar(IMAGE_S*src1, IMAGE_S*src2, IMAGE_S* magnitude, IMAGE_S*angle) { int i, j; float tmpData1, tmpData2, tmpAngle; assert(src1->rows == src2->rows); assert(src1->rows == src2->rows); for (i = 0; i < src1->rows; i++) { for ( j = 0; j < src1->cols; j++) { tmpData1 = *((float*)src1->data + src1->cols*i + j); tmpData2 = *((float*)src2->data + src2->cols*i + j); *((float*)magnitude->data + magnitude->cols*i + j) = sqrt(pow(tmpData1, 2) + pow(tmpData2, 2)); tmpAngle = atan2(tmpData2, tmpData1); *((float*)angle->data + angle->cols*i + j) = tmpAngle < 0 ? tmpAngle + 2.*CV_PI : tmpAngle; } } return ; }
举个例子:
// 解算[[1,1],[1,1]] // 矩阵不为满秩的状况下,QR的方法是解算不出来的(可能有改进的方法,网上看了几个都解算不出来) // 对[[0,0],[0,0]]等状况作了一些小trick // python结果eigenValue:[0,0]. eigenVector:[[1,0],[0,1]] // 基本思路没改变
小trick,作项目中正好用到:
具体细节请参考QP解算C代码
void ImageGetEigen(IMAGE_S* src, IMAGE_S* eigenValue, IMAGE_S* eigenVector, int iterNum) { assert(src->rows == src->cols); assert(src->rows > 0); IMAGE_S temp, temp_R; int i, j, k; float tmpValue; ImageCreate(&temp, src->rows, src->cols, FloatFlag); ImageCreate(&temp_R, src->rows, src->cols, FloatFlag); ImageCreate(eigenValue, src->rows, 1, FloatFlag); ImageCreate(eigenVector, src->rows, src->cols, FloatFlag); memcpy(temp.data, src->data, sizeof(float)*src->rows*src->cols); //使用QR分解求矩阵特征值 for (int k = 0; k < iterNum; k++) { ImageQR(&temp, eigenVector, &temp_R); free(temp.data);//因为ImageDot直接建立dst,因此这里得free,后期能够改进 ImageDot(&temp_R, eigenVector, &temp); } //获取特征值并排序 for (k = 0; k < temp.cols; k++) { tmpValue = ((float*)temp.data)[k * temp.cols + k]; for (i = k + 1; i < temp.cols; i++) { if (((float*)temp.data)[i * temp.cols + i]>tmpValue) { tmpValue = ((float*)temp.data)[i * temp.cols + i]; ((float*)temp.data)[i * temp.cols + i] = ((float*)temp.data)[k * temp.cols + k]; ((float*)temp.data)[k * temp.cols + k] = tmpValue; } } ((float*)eigenValue->data)[k] = ((float*)temp.data)[k * temp.cols + k]; } ImageEig(src, eigenVector, eigenValue); free(temp.data); free(temp_R.data); for ( i = 0; i < eigenValue->rows*eigenValue->cols; i++) { if (isnan(((float*)eigenValue->data)[i])) ((float*)eigenValue->data)[i] = 0.0f; } for (i = 0; i < eigenVector->rows*eigenVector->cols; i++) { if (isnan(((float*)eigenVector->data)[i])) ((float*)eigenVector->data)[i] = 0.0f; } float numT[4]; numT[0] = ((float*)src->data)[0 * src->cols + 0]; numT[1] = ((float*)src->data)[0 * src->cols + 1]; numT[2] = ((float*)src->data)[1 * src->cols + 0]; numT[3] = ((float*)src->data)[1 * src->cols + 1]; if (Equal(numT[0], numT[1]) && Equal(numT[0], numT[2]) && Equal(numT[0], numT[3])) { memset(eigenValue->data, 0, sizeof(float)*eigenValue->rows*eigenValue->cols); memset(eigenVector->data, 0, sizeof(float)*eigenVector->rows*eigenVector->cols); ((float*)eigenVector->data)[0 * eigenVector->cols + 0] = 1; ((float*)eigenVector->data)[1 * eigenVector->cols + 1] = 1; } return; }
举个例子:
假设有一批数据 2019-01-11 0x01 0x32 0x41, 2019-01-11 0x01 0x32 0x41, 2019-01-11 0x01 0x32 0x41,等 1W 行
我如今想保存这些数据,而且读取出来
垂手可得的想法是fopen
,接着使用fprintf
进行操做
二进制的话,使用fopen
和fwrite
、fread
这里涉及到一个换行,二进制怎么换行?
其实二进制根本不用考虑换行的问题,直接进行保存读写就好了
#if 1 unsigned char flag_t = 0; if (flag_t) { FILE* fp_test = fopen("./data.bat", "wb"); struct XXX *frameinfo = new XXX[3]; for (size_t i = 0; i < 3; i++) { frameinfo[i].ID = i; frameinfo[i].TimeStamp = i + 1; frameinfo[i].TimeFlag = i + 2; frameinfo[i].SendType = i + 3; frameinfo[i].RemoteFlag = i + 4; frameinfo[i].ExternFlag = i + 5; frameinfo[i].DataLen = i + 6; unsigned char ppp[8] = { i,i + 1,i,i + 2,i + 3,i + 4,i + 5,i + 6 }; memcpy(frameinfo[i].Data, ppp, sizeof(unsigned char) * 8); memcpy(frameinfo[i].Reserved, ppp, sizeof(unsigned char) * 3); } double curtime; for (int index_frame = 0; index_frame < 3; index_frame++) { fwrite(&curtime, sizeof(double), 1, fp_test); fwrite(&frameinfo[index_frame], sizeof(XXX), 1, fp_test); fflush(fp_test); } } else { FILE* fp_test = fopen(".//data//pic_20191030_183053_can0.bat", "rb"); XXX frameinfo = new XXX[3]; double time; for (size_t i = 0; i < 300000; i++) { fread(&time, sizeof(double), 1, fp_test); fread(&frameinfo[0], sizeof(XXX), 1, fp_test); Sleep(5); } } #endif