自己对于写程序还处于菜鸟阶段,很多用法尚未涉及或者还不清晰。总是想着等每个程序写完再来总结,却发现早已无从下手。于是想到了这个方法,每次遇到问题并解决之后第一时间到这个日志上记录下来。于是有了此文。

ivandark   处于边缘的菜的不能再菜的程序猴子一年半

——2012.11.10

1.声明空间并初始化内存

声明空间: 一维:int *a;   a = (int*)malloc(sizeof(int)*size);  //size为数组大小

二维:int **a;  a=(int**)malloc(sizeof(int*)*row);  //

for(int i=0;i<col;i++)

{

a[i] = (int*)malloc(sizeof(int)*col);

}

初始化内存:因为不初始化,动态声明的数组赋值不正常

一维和二维的初始化是不一样的。

一维:memset(a,0,sizeof(a));

二维:边分配内存边初始化:

int **a;  a=(int**)malloc(sizeof(int*)*row);  //

for(int i=0;i<col;i++)

{

a[i] = (int*)malloc(sizeof(int)*col);

memset(a[i],0,sizeof(int)*col); // 貌似只能这么写 不可以效仿一维的格式

}

删除:  free(a); //一维和二维的一样

如果你像上面对a分配刚好的够用的内存并对其赋值运算,再释放会出现错误after normal block(#207) at  。

经过查找发现不少人曾经出现过此问题。

原因描述(引用网络):这是典型的内存溢出错误,常在内存的delete处发生,而且一般在debug版本中可能出现,release版本中可能并不报错.出现这个错误的原因一般都是malloc/new申请的内存溢出.因为在c++中,如果用new分配一段内存,操作的时候改变了该部分的大小,在delete时就会出错.

因为申请了一个size为5的内存,但是strcpy过去了一个size为6的字符串,因此破坏了这个指针,运行debug版本的时候就 会出现先前的错误,但是在release版本中,溢出一个字节的内存很有可能是没有错误的,然后潜在的隐患是肯定存在的,因此,我们在debug遇到这样 的错误时候一定要仔细检查对new/malloc出的指针的操作.

解决方案:我是为a数组多分配了一个(int**)内存 程序运行正常

2.C语言读取txt文本

txt格式是我们利用编程语言处理数据时,数据常用的存储格式。

下面介绍常用的用于读写的函数:

打开:FILE *fp;     if((fp=fopen("E:\\test.txt","rt"))==NULL)   //" "里面的是文件路径  "rt"表示读取方式     {printf("cannot open file\n");return;     }

关闭:fclose(fp);

读取:这里分为很多函数:

fscanf();这个是个人感觉比较好用的。从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束。比如我们想把fp中的数据存到二维数组a中 ("%f"表示以浮点形式读取)

for(i=0;i<M;i++){for(j=0;j<N;j++)fscanf(fp,"%f",&a[i][j]);}

fread();     fread( void *buffer, size_t size, size_tcount, FILE *stream);根据msdn中的说明不难使用,这里不赘述。

写入:

fwrite();  :fwrite(buffer,size,count,fp);  (1)buffer:是一个指针,对fwrite来说,是要输出数据的地址。  (2)size:要写入的字节数;  (3)count:要进行写入size字节的数据项的个数;  (4)fp:目标文件指针。

3.VC读取txt文本

对话框形式打开:

void COpenDataDlg::OnBtnOpendata()
{// TODO: Add your control notification handler code herestatic char BASED_CODE file[] = "TXT Files (*.TXT)|*.txt|所有文件(*.*)|*.*||";  //文件类型说明字符串CFileDialog SelectFile (TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,file,NULL); //文件对话框初始化(点击浏览时候的对话框) 第一个TRUE表示以打开方式;false是以保存的方式;file表示打开的是什么文件其他参数 显示对话框 隐藏只读,SelectFile.DoModal(); //弹出对话框CString FileName; FileName=SelectFile.GetPathName();//得到所选文件路径m_FileName = FileName;UpdateData(FALSE);//把后台数据刷新到前台显示}

读取:跟C语言相同。好像可以用vc中的方法 CFile什么的,但是暂时没搞懂,先放着。
输出:跟C相同。

 char str[50];  //数组大小可以根据输出的内容大小而定,这里为了简便声明了静态数组CFile file(_T("E:\\result.txt"), CFile::modeCreate | CFile::modeWrite);for(i=0; i<8; i++) //8是要输出的字符的个数 可以根据需要变化 或者先求一个长度再用长度变量替换8{sprintf(str, "%d,%d\r\n",i,showID[i]);  //showID里存储的是要写入数据file.Write(str, strlen(str) * sizeof(char));}file.Close();MessageBox("结果已输出到E:\\result.txt");

4.opencv取像素灰度宏

(CV_IMAGE_ELEM(pImg1,uchar,i,j)  //注意i j  i代表y轴方向  j代表x轴方向 别弄反了

5.程序在调试态下正常,执行时候mfc基础类停止运行

DAMAGE:After normal block(#****)

这种问题通常是由于动态分配内存导致的。可以检查一下以下三种情况:

(1)数组访问越界
int a[5];
a[5] = 3; //越界了
(2)动态分配数组越界
int *a;
int lenth1 = 2;
int lenth2 = 3;
a = (int*)malloc(sizeof(int)*lenth1);
memset(a,0,sizeof()*lenth2);
free(a);

这里初始化的数组长度比定义的要长,出错

(3)动态声明的空间没有被释放
所有动态声明的数组在一个函数结束之后一定一定要free掉!
但是在子函数中好像是无所谓的。只要在功能的主函数中释放即可。

6.最近用过的Opencv 函数

(1)CvMat 创建并初始化矩阵

    CvMat Ma;cvInitMatHeader(&Ma,row,col,CV_64FC1,FC,CV_AUTOSTEP);//CV_64FC1 表示64位浮点数 可以根据需要换成其他

(2)cvEigenVV

见另一篇转载文章   http://blog.csdn.net/ivandark/article/details/8228029

(3)cvGetSize 得到矩阵尺寸 返回CvSize结构体

例如: CvSize size;

size = cvGetSize(IplImage* img);  //返回图像长宽

(4) cvSaveImage

  保存图像到文件

  int cvSaveImage( const char* filename, const CvArr* image );  //filename 直接给路径名,用字符串  指针用图像的指针 比如IplImage   filename   文件名。   image   要保存的图像。   函数cvSaveImage保存图像到指定文件。 图像格式的的选择依赖于filename的扩展名,请参考cvLoadImage。只有8位单通道或者3通道(通道顺序为'BGR' )可以使用这个函数保存。如果格式,深度或者通道不符合要求,请先用cvCvtScale 和cvCvtColor转换;或者使用通用的cvSave保存图像为XML或者YAML格式。

  保存图像到文件   int cvSaveImage( const char* filename, const CvArr* image );   filename   文件名。   image   要保存的图像。   函数cvSaveImage保存图像到指定文件。图像格式的的选择依赖于filename的扩展名,请参考cvLoadImage。只有8位单通道或者3通道(通道顺序为'BGR' )可以使用这个函数保存。如果格式,深度或者通道不符合要求,请先用cvCvtScale 和cvCvtColor转换;或者使用通用的cvSave保存图像为XML或者YAML格式。
(5)初始化 IplImage*
明确  IplImage* 中的灰度数据存在imageData里
   IplImage* KL_Img1;CvSize size = cvGetSize(pImg1);KL_Img1 = cvCreateImage(size, 8, 1); // 创建8位单通道图像memset(KL_Img1->imageData, 0.0,sizeof(KL_Img1->imageData));// 将内存拷贝到图像中的imageData中

7.如何重绘

所谓重绘,就是讲程序中变量保存的数据源源不断的刷新到界面上。实现过程大概可以分为如下几步:
(1)以绘制点为例,先在VIew里设置一个变量IsDraw,初始值为False。
(2)我们需要把在函数func1中绘制的点保存在一个数组里,我是在Doc类下新建了一个数组空间。
(3)当自己写的绘制函数执行完毕后,所有要重绘的点数据也全部存到数组中了,这里把IsDraw赋值为TRUE
(4)然后在OnDraw函数中开始重绘,重绘内容就是func1中画的东西,只不过这次我们要从Doc里的数组调取数据而已。因为如果不执行func1,Ondraw是没的可画的,所以在重绘前还要加上if判断,如果IsDraw==TRUE,则执行重绘。
8.C语言取整问题
(1)向下取整
直接强制转换。如int i = 2.5  , i=2
(2)向上取整
函数ceil 。 如 int i = ceil(2.5) ,i=3
 
9.C语言txt文件读取操作
(1)打开
    FILE *fp;
   fp = fopen("E:\\.txt","r");
  if(!fp)//容错
  {
        printf("ERROR");   return 0;
  }
(2)读取——非循环 只读一个数值
  fscanf(fp,"%d",&N);
(3)读取——循环 读一组数存入数组
for(i=0;i<N;i++)
{
      fscanf(fp."%d",&a[i]);   //读取浮点数一定要用 %lf 不要用%f 原因:http://blog.csdn.net/lutx/article/details/5072043
}
    
(4)写文件
 
 mkdir("E:\\STU");                        //在硬盘新建文件夹和文件!!!
 fp2 = fopen("E:\\STU\\result.txt","w");
for(i=0;i<N;i++)
{
      fprintf(fp,"%d\t",result[i]);
 
      if((i+1)%10 == 0)
      {
            fprintf(fp,"\n");
      }
}
(5)文件指针问题
     fgetc(fp); //可以使当前文件指针向后移动一位。在跳过空格 回车 很有用 
     while(!feof(fp))//读到文件末就停止 否则继续读
 
(6)fseek介绍 <整理并摘抄自百度百科>
  A.函数原型:int fseek(FILE *stream, long offset, int fromwhere); //负责文件指针操纵:如果执行成功则返回0(文件stream的内部指针以参数3为基准,偏移参数2的量),失败返回-1
  B.参数3可以有: (偏移起始位置:起始位置0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))
  C.主要作用:移动文件内部指针的位置,可以用来计算文件长度
  例子:
int main()
{FILE *fp;fp = fopen("E:\\a.txt","r");fseek(fp,0L,SEEK_END);//移动文件指针到末尾int len = ftell(fp1);//顺便求个长度呗  经过试验 txt中 空格算一个长度 回车算两个//ftell用于得到文件位置指针当前位置相对于文件首的偏移字节数fseek(fp,0L,SEEK_SET);//把文件指针再移动到开始fseek(fp,100L,SEEK_SET); //再把文件指针移动到离文件开头处100字节fseek(fp,100L,SEEK_CUR); //再把文件指针移动到离当前位置处100字节fseek(fp,100L,SEEK_END); //再把文件指针移动到离文件结尾处100字节fseek(fp,-100L,SEEK_SET);//再把文件指针"退回"到离文件结尾处100字节return 0;
}

 (7)读取字符串
  A.fgetc函数:从文件中读取一个字符,读取一个字节后,光标位置后移一个字节。
 
例子:
   while(!feof(fp1))  //从文件中读取字符串 并计算字母字符的个数{ch = fgetc(fp1); //一个一个字符的读if(ch==EOF)//文件末端{printf("%d",count);printf("\n");}if(isalpha((int)ch))//判断ch是否为字母  字母的ASCII码:ASCII码:65~90号为26个大写英文字母,97~122号为26个小写英文字母!!!{str[count] = ch; //存入字符串中count++;}}

  B.fputc函数————将字符ch写到文件指针fp所指向的文件的当前写指针的位置。
例子:
       char msg[] = "Hello world";    int i = 0; //方法一while (msg[i]&&(i<strlen(msg)))    {       fputc(msg[i], fp1);       i++;    }  //方法二fprintf(fp1,"%s",msg);

C.ctype.h —— 处理字符常用的头文件
用例:
   //isalpha:检查ch是否是字母 是字母则返回非0 否则返回0if(isalpha((int)ch))...//判断ch是否为字母  char ch//isdigit:检查ch是否为数字0-9 是则返回非0 否则返回0//islower:检查是否为小写字母//isupper:检查是否为大写字母//isalnum:检查是否是字母或数字//ispunct:是否是标点字符//isspace:是否是空格符/跳格符/控制字符/换行符ch = tolower((int)ch);//大写字母转成小写字母  ;  toupper小写转大写

D.fgets —— 读取字符串

char *fgets(char *s, int n, FILE *stream);
fgets函数的调用形式如下:fgets(str,n,fp);
此处,fp是文件指针;str是存放在字符串的起始地址;n是一个int类型变量。
函数的功能是从fp所指文件中读入n-1个字符放入str为起始地址的空间内;
如果在未读满n-1个字符之时,已读到一个换行符或一个EOF(文件结束标志),则结束本次读操作,读入的字符串中最后包含读到的换行符。
因此,确切地说,调用fgets函数时,最多只能读入n-1个字符。读入结束后,系统将自动在最后加'\0',并以str作为函数值返回。
 
通俗的讲:
比如有文件
Hello world!
Hello Hello world!
代码为:
int main()
{FILE *fp1;fp1 = fopen("E:\\test.txt","r");char msg1[20];char msg2[20];fgets(msg1,4,fp1); //m=4fgets(msg2,7,fp1); //n=7printf("%s\n",msg1);printf("%s\n",msg2);return 0;}


情况一:(m=4 n=7)
输出:
Hel
lo wor
情况二:(m=4,n=20)如果使用fgets() 读取文件的时候bufsize大于该行的字符总数加2(多出来的两个,一个保存文件本身的'\n'换行,一个保存字符串本身的结束标识'\0'),文件并不会继续读下去,仅仅只是这一行读取完,随后指向文件的指针会自动偏移至下一行。
Hel
lo world!
情况三:(m=15,n=4)
Hello world!
Hel
情况四:(m=15,n=20)
Hello world!
 
Hello Hello world!
(8)按行读取数据<待续>

    
10.C语言读取raw
 
  //开始读
 unsigned char *tmp = (unsigned char*)malloc(sizeof(unsigned char)*256*256);
 memset(tmp,0,sizeof(tmp));
 fread(tmp,sizeof(unsigned char),256*256,fp1);
//格式转换后再处理
int* data = (int*)malloc(sizeof(int)*256*256);
 memset(data,0,sizeof(data));
 for(i=0;i<=255*255;i++)
 {
  data[i] = (int)tmp[i];
 }
//开始写
fwrite(tmp,sizeof(unsigned char),256*256,fp2);  //tmp 为 unsigned char
 

自己在CODING过程中遇到的问题以及解决(C/VC)相关推荐

  1. hadoop过程中遇到的错误与解决方法

    hadoop过程中遇到的错误与解决方法 参考文章: (1)hadoop过程中遇到的错误与解决方法 (2)https://www.cnblogs.com/zhjh256/p/10669881.html ...

  2. 计算机组装时遇到的问题,计算机组装及正常维修过程中遇到的问题和解决方法.doc...

    <计算机组装及正常维护过程中遇到的问题和解决方法> 指导老师:XXX 班级:XXX 姓名:XXX 学号:XXXX 计算机组装遇到的问题和解决方法 在安装之前要特别注意下面这些事项:第一.防 ...

  3. 使用遇到的问题_聚氯化铝在使用过程中遇到的问题及解决方法

    聚氯化铝在使用过程中遇到的问题及解决方法 随着现在工业的发展改良,现在的工业废水水质的变化幅度大,导致处理方面也有新的问题出现,常见的有聚氯化铝投入水中产生泡沫,药剂堵塞泵等问题. 聚氯化铝投入水中产 ...

  4. 将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法

    将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法 参考文章: (1)将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法 (2) ...

  5. 记flume部署过程中遇到的问题以及解决方法(持续更新)

    项目需求是将线上服务器生成的日志信息实时导入kafka,采用agent和collector分层传输,app的数据通过thrift传给agent,agent通过avro sink将数据发给collect ...

  6. postgreSQL与postGIS安装过程中遇到的坑及解决

    记录一下postgreSQL与postGIS安装过程中遇到的坑及解决 写到前面 postgreSQL安装 postgreSQL安装包下载 postgreSQL安装 postGIS的安装 postGIS ...

  7. ac ap方案 华为_今天给大家总结下AC+AP架构使用过程中的若干问题及解决办法

    原标题:今天给大家总结下AC+AP架构使用过程中的若干问题及解决办法 早前发布了一篇<手把手教您如何大范围无线组网>,当时有朋友留言要我给点更详细的配置,有朋友建议用华为设备,也有朋友建议 ...

  8. crossover的使用过程中出现的问题和解决方法

    crossover的使用过程中出现的问题和解决方法: 原因分析: 出现X11丢失的主要是因为缺少的X11软件包,这一错误在Mac OS 10.6系统上发生的频率比较高,在Mac OS 10.8及更高版 ...

  9. 硒鼓加粉过程中常见缺陷对照表及解决方法!

    硒鼓加粉过程中常见缺陷对照表及解决方法! 1.问题:底灰 原因:低湿高温;PCR(充电辊)缺陷;磁辊护套及涂层缺陷;PCR或电晕电接触点缺陷;OPC(感光鼓)缺陷;不良碳粉;高压电源不良. 解决方法: ...

最新文章

  1. (转帖)eclipse 下 搭建 django开发环境
  2. 量子计算基础知识-2019/11/12
  3. 算法设计与分析——贪心算法——背包问题
  4. 地方政府大数据发展的现实与理想
  5. CSS:媒体查询 CSS3 Media Queries
  6. Linux CGLIB升级,cglib升级建议
  7. 阿里P9谈程序员——程序员的青春饭
  8. oracle 数据迁移跑批,Oracle数据库纯数据的导出与导入
  9. 西门子逻辑运算指令_西门子plc位逻辑运算指令
  10. 如何在移动硬盘上安装Linux系统?WIN10 + Ubuntu 18.0.4(LTS)
  11. WingIDE5注册破解的方法
  12. 微信每日早安推送给女朋友,小白也可以学会
  13. RGB接口和MPU接口区别
  14. python+opencv3生成一个自定义纯色图
  15. 计算机网络专业的自我鉴定,计算机网络专业的自我鉴定
  16. ECSHOP 银联在线支付 PHP 银联商务
  17. JavaScript 10个常见用法
  18. 逻辑斯第回归、softmax分类与多层感知器
  19. Android探索之旅(第二十九篇)QRCode终极秘术之三码合一(微信,QQ,支付宝)
  20. 医护管理平台系统服务器,康软智能移动医护管理系统

热门文章

  1. 【Linux】20.shell脚本 检测是否 ping 通
  2. Maven入门指南(一)
  3. Apache Maven 入门篇
  4. 利用 Java dump 进行 JVM 故障诊断
  5. 使用 C++ 的 StringBuilder 提升 4350% 的性能
  6. Java异常处理总结
  7. 通过JDBC进行简单的增删改查(以MySQL为例)
  8. 卷积Groups Group Convolutions
  9. Hadoop教程(四):理解MapReduce、MapReduce计数器和连接、MapReduce Hadoop程序连接数据
  10. ElementUI的组件拆解之Tooltip