DoubleLi

qq: 517712484 wx: ldbgliet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

随笔分类 -  C++/C

上一页 1 ··· 31 32 33 34 35 36 37 38 39 ··· 47 下一页

摘要:1.首先要陆避免头文件的相互引用: 解决方法: 有两个类A和B, 在各自的头文件中声明对方,而不能用包含, 即要用class 而不能用 include2. 两个类的初始化顺序: 一定要明确两个类的初始化顺序, 如果在类A中初始化B, 就不要再在B中初始化A; 即可以在A的构造函数中m_b(new B());3.在各自的头文件中应只声明对方的指针对像,而不要试图在头文件中去实例化;否则你会发现 这样的错误: 错误 1 error C2146: 语法错误 : 缺少“;”(在标识符“m_b”的前面) A.h 错误 2 error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不. 阅读全文
posted @ 2013-05-11 11:23 DoubleLi 阅读(819) 评论(0) 推荐(0)

摘要:fsetpos()详解 函数原型:int fsetpos(FILE *fp, const fpos_t *pos);头文件:#include<stdio.h>是否是标准函数:是函数功能:将文件指针定位在pos指定的位置上。该函数的功能与前面提到的fgetpos相反,是将文件指针fp按照pos指定的位置在文件中定位。pos值以内部格式存储,仅由fgetpos和fsetpos使用。返回值:成功返回0,否则返回非0。例程如下 应用fsetpos函数定位文件指针。#include <stdio.h>void main( void ){ FILE *fp; fpos_t pos; 阅读全文
posted @ 2013-05-07 16:51 DoubleLi 阅读(1263) 评论(0) 推荐(0)

摘要:可等待定时器问题:1. 需要的函数:CreateWaitableTimer,SetWaitableTimer.前者创建一个可等待定时器句柄,后者设置等待定时器触发的条件.我们可以多次调用SetWaitableTimer来重置可等待定时器.重置后之前的定时器将关闭.2. 主要看两段代码:代码一:(这段代码在网上出现的概率是较大的)[cpp] view plaincopyprint?HANDLE hTimer = CreateWaitableTimer( NULL,FALSE,NULL ); LARGE_INTEGER li; li.QuadPart = 0; if( !SetWaitab... 阅读全文
posted @ 2013-05-07 15:49 DoubleLi 阅读(1162) 评论(0) 推荐(0)

摘要:HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SD BOOL bManualReset, // reset type BOOL bInitialState, // initial state LPCTSTR lpName // object name ); 该函数创建一个Event同步对象,并返回该对象的Handle lpEventAttributes 一般为NULL bManualReset 创建的Event是自动复位还是人工复位 ,如果true,人工复位, 一旦该Event被设置为有信号,则它一... 阅读全文
posted @ 2013-05-07 14:31 DoubleLi 阅读(2504) 评论(0) 推荐(0)

摘要:void clearerr(FILE * stream); 相关函数 feof 函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标。int fclose(FILE * stream); 相关函数 close,fflush,fopen,setbuf 函数说明 fclose()用来关闭先前fopen()打开的文件。此动作会让缓冲区内的数据写入文件中,并释放系统所提供的文件资源。 返回值 若关文件动作成功则返回0,有错误发生时则返回EOF并把错误代码存到errno。 错误代码 EBADF表示参数stream非已打开的文件。 范例 请参考fopen()。FILE *... 阅读全文
posted @ 2013-05-07 11:21 DoubleLi 阅读(346) 评论(0) 推荐(0)

摘要:1.fread 和 fwrite: fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出。声明:#include <stdio.h> size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);参数解释:size指出一条记录的长度,nmemb指出要读或写多少条记录,这些记录在ptr所指的内存空间中连续存放,共占si 阅读全文
posted @ 2013-05-07 11:20 DoubleLi 阅读(1240) 评论(0) 推荐(0)

摘要:打开一个文件 :ShellExecute(NULL, NULL, "c://mfc类库详解.chm", NULL, NULL, SW_SHOWNORMAL);打开一个文件夹: ShellExecute(NULL, NULL, "c://", NULL, NULL, SW_SHOWNORMAL);在资源管理器中打开:ShellExecute(NULL, "explore", "c://", NULL, NULL, SW_SHOWNORMAL);搜索一个文件夹 : ShellExecute(NULL, "fi 阅读全文
posted @ 2013-05-05 01:30 DoubleLi 阅读(568) 评论(0) 推荐(0)

摘要:1前言 当程序的运行结果与程序员预想的不一样,如死机,计算值不正确,出现内存访问冲突等,就需要进行调试2进行调试前的准备工作 因为程序调试是一项十分耗时的工作,很难估计出将要花费多长时间,因此在调试前,一定要做好充分准备,尽量避免做无用功:1.构造好的测试步骤,让程序出错有规律性或出错的概率越大越好2.被调试程序及相关库是最符合要求的版本3.工程临时文件如.ncb被删除4.整个工程被重新编译5.应用程序的链接路经与调试路径保持一致6.单体测试全部通过3出错位置和原因的确定3.1几种典型错误的原因1 内存莫名其妙的失效原因:内存指针被多处引用,被多处释放2 多线程条件下死机原因:线程中由于用了S 阅读全文
posted @ 2013-05-05 01:27 DoubleLi 阅读(1346) 评论(0) 推荐(1)

摘要:定时器在Windows 的程序中的作用不可忽略,也随处可见。设定一个时间间隔每0.5秒或者1秒钟刷新一次时钟,这样就可以完成一个简单的电子钟程序。在不同的编程工具中定时器的用法也不同,Visual C++中也给我们提供了实现这种功能的方法,而且方法不只一种。在窗口类中是使用定时器比较很简单,用SetTimer()设置了定时器之后,并在Class Wizard中添加了WM_TIMER消息映射后,您就可以在映射函数OnTimer()中添加代码实现,来定时完成您的任务,而且还支持任意多个定时器,这种方法大家可能都会用。但是在非窗口的类中,使用定时器就没那么简单了,在类消息映射中就找不到OnTimer 阅读全文
posted @ 2013-05-04 20:42 DoubleLi 阅读(770) 评论(0) 推荐(0)

摘要:在使用 VC、 VB、 Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置 ODBC数据源。对于一般用户而言,配置 ODBC数据源可能是一件比较困难的工作。 而且,在实际应用中,用户往往要求在同一个应用程序中访问不同的数据源,因此采用一般的加载方法就有了无法克服的缺陷。为能在程序中完成这一工作,方便应用程序的使用,本文以 VC为开发环境介绍两种在应用程序中动态加载 ODBC系统数据源的方法。 方法一:修改注册表 设计思路 一般情况下,当用户在控制面板中配置好 ODBC数据源后, Windows系统便在注册表中加入了一些子键来存储用户的配置结果。当应用程序需要用... 阅读全文
posted @ 2013-05-04 20:15 DoubleLi 阅读(349) 评论(0) 推荐(0)

摘要:从功能简单的数据库(如JetEngine)到复杂的大型数据库系统(如oracle),VC++6.0都提供了一些编程接口。本文主要介绍以下五种:1.ODBCAPI; 2.MFCODBC类; 3.MFCDAO类;(数据访问对象) 4.MFC的OLE/DB; 5.ActiveX数据对象(ADO)。1.开放数据库连接(ODBCAPI):提供了一个通用的编程接口,允许程序与多种不同的数据库连接。它为Oracle,SQLServer,MSExcel等都提供了驱动程序,使得用户可以使用SQL语句对数据库进行直接的底层功能操作。在使用ODBCAPI时,用户须引入的头文件为\"sql.h\" 阅读全文
posted @ 2013-05-04 20:12 DoubleLi 阅读(331) 评论(0) 推荐(0)

摘要:我们在EX10这个工程中,选择菜单中「Build」→「Rebuild All」,重新编译所有的工程文件,可以看到如下输出: 从这个输出中,我们可以看到可执行程序EX10.exe的产生,经过了两个步骤:首先,C++编译器对工程中的三个源文件fish.cpp、animal.cpp单独进行编译(Compiling…)。在编译时,先由预处理器对预处理指令(#include、#define和#if)进行处理,在内存中输出翻译单元(一种临时文件)。编译器接受预处理的输出,将源代码转换成包含机器语言指令的三个目标文件(扩展名为obj的文件):EX10.obj、fish.obj、animal.obj.注意,在 阅读全文
posted @ 2013-05-04 20:06 DoubleLi 阅读(480) 评论(0) 推荐(0)

摘要:用VC来写程序,有时总是出这样那样的问题,没办法只能自己上网查资料来解决,在这里把自己常见的问题和一些技巧贴出来分享给大家,希望对大家有用,也省去大家再去搜索的烦恼……1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Release状态。C/C++标签中的Category选General,Optimizations选Disable(Debug),Debut info选Program Database.在Link标签中选中Generate debug info复选框。 注:只是一个介乎Debug和Release的中间状 阅读全文
posted @ 2013-05-04 20:03 DoubleLi 阅读(1753) 评论(0) 推荐(0)

摘要:在工业生产控制系统中,有许多需要定时完成的操作,如:定时显示当前时间,定时刷新屏幕上的进度条,上位机定时向下位机发送命令和传送数据等。特别是在对控制性能要求较高的控制系统和数据采集系统中,就更需要精确定时操作。众所周知,Windows是基于消息机制的系统,任何事件的执行都是通过发送和接收消息来完成的。这样就带来了一些问题,如一旦计算机的CPU被某个进程占用,或系统资源紧张时,发送到消息队列中的消息就暂时被挂起,得不到实时处理。因此,不能简单地通过Windows消息引发一个对定时要求严格的事件。另外,由于在Windows中已经封装了计算机底层硬件的访问,所以要想通过直接利用访问硬件来完成精确定时 阅读全文
posted @ 2013-05-04 19:59 DoubleLi 阅读(1978) 评论(0) 推荐(0)

摘要:用户感觉到软件的好用,就是可以定时地做一些工作,而不需要人参与进去。比如每天定时地升级病毒库,定时地下载电影,定时地更新游戏里的人物。要想实现这些功能,就可以使用定时器的API函数CreateWaitableTimer和SetWaitableTimer来实现了,这对API函数创建的时钟是比较精确的,可以达到100倍的10亿分之一秒。函数CreateWaitableTimer和SetWaitableTimer声明如下:WINBASEAPI__outHANDLEWINAPICreateWaitableTimerA( __in_opt LPSECURITY_ATTRIBUTES lpTimerAtt 阅读全文
posted @ 2013-05-04 19:56 DoubleLi 阅读(353) 评论(0) 推荐(0)

摘要:C++强大的功能来源于其丰富的类库及库函数资源。C++标准库的内容总共在50个标准头文件中定义。在C++开发中,要尽可能地利用标准库完成。这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费时间、人力重新开发呢;(2)质量:标准库的都是经过严格测试的,正确性有保证;(3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平;(4)良好的编程风格:采用行业中普遍的做法进行开发。 在C++程序设计课程中,尤其是作为第一门程序设计课程,我们注重了语法、语言的机制等方面的内容。程序设计能力的培养有个过程,跨过基本的原理性知识直接进入到工程中的普遍做法,由于. 阅读全文
posted @ 2013-05-01 23:19 DoubleLi 阅读(335) 评论(0) 推荐(0)

摘要:对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。 #include <iostream>using namespace std;class CExample {private: int a;public: CExample(int b) { a=b;} void Show () { cout<<a<<endl; }};int main(){ CExample A(100); CExample B=A; B.Show 阅读全文
posted @ 2013-05-01 22:50 DoubleLi 阅读(541) 评论(1) 推荐(1)

摘要:在一个函数的内部,return的时候返回的都是一个拷贝,不管是变量、对象还是指针都是返回拷贝,但是这个拷贝是浅拷贝。1.如果返回一个基本类型的变量,比如:int a;a = 5;return a;那么就会a的一个拷贝,即5返回,然后a就被销毁了。尽管a被销毁了,但它的副本5还是成功地返回了,所以这样做没有问题。2.但是对于非动态分配(new/malloc)得到的指针,像1那么做就会有问题,比如在某个函数内部:int a[] = {1, 2};return a;那么也会返回指针a的一个拷贝,我们假定a的地址值为0x002345FC,那么这个0x2345FC是能够成功返回的。当return执行完. 阅读全文
posted @ 2013-05-01 01:18 DoubleLi 阅读(451) 评论(0) 推荐(0)

摘要:为了避免同一个文件被include多次,C/C++中有两种方式,一种是#ifndef方式,一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别,但是两者仍然还是有一些细微的区别。 方式一: #ifndef __SOMEFILE_H__ #define __SOMEFILE_H__ ... ... // 声明、定义语句 #endif 方式二: #pragma once ... ... // 声明、定义语句 #ifndef的方式受C/C++语言标准支持。它不光可以保证同一个文件不会被包含多次,也能保证内容完全相同的两个文件(... 阅读全文
posted @ 2013-04-27 15:34 DoubleLi 阅读(3817) 评论(0) 推荐(1)

摘要:临界区(Critical Section) 保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 临界区包含两个操作原语: EnterCriticalSection() 进入临界区 LeaveCriticalSection() 离开临界区 EnterCriticalSection()语句执行后代码将进入临界区以后无论发生什么,必须确保与之匹配的.. 阅读全文
posted @ 2013-04-26 17:06 DoubleLi 阅读(356) 评论(0) 推荐(1)

上一页 1 ··· 31 32 33 34 35 36 37 38 39 ··· 47 下一页