博文
volatile(2006-11-18 11:06:00)
摘要:volatile的用法
避免编译器优化的用法 转自<海涛的笔记> _lindwen
volatile的本意是“易变的”
由于访问寄存器的速度要快过RAM,所以编译器一般都会作减少存取外部RAM的优化。比如:
static int i=0;
int main(void)
{
...
while (1)
{
if (i) dosomething();
}
}
/* Interrupt service routine. */
void ISR_2(void)
{
i=1;
}
程序的本意是希望ISR_2中断产生时,在main当中调用dosomething函数,但是,由于编译器判断在main函数里面没有修改过i,因此
可能只执行一次对从i到某寄存器的读***作,然后每次if判断都只使用这个寄存器里面的“i副本”,导致dosomething永远也不会被
调用。如果将将变量加上volatile修饰,则编译器保证对此变量的读写***作都不会被优化(肯定执行)。此例中i也应该如此说明。
一般说来,volatile用在如下的几个地方:
1、中断服务程序中修改的供其它程序检测的变量需要加volatile;
2、多任务环境下各任务间共享的标志应该加volatile;
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义;
另外,以上这几种情况经常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中可以通过关中断来实
现,2中可以禁止任务调度,3中则只能依靠硬件的良好设计了。
volatile 的含义
volatile总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量......
笔记(2006-11-17 20:11:00)
摘要:1 不区分大小写的 字符串比较
string.compare("需要比较的字符串1","需要比较的字符串2",true)=0
true 表示不区分大小写 false 表示区分大小写(为默认的)。
相等返回 0
2,字符串变大小写
“字符串”.ToLower
"字符串“.ToUpper
3......
转载的(2006-11-16 21:11:00)
摘要:1、我所认为的“幸福”其实是每个人心里的一种感受,但大部分人总会将自己所期望的或是得不到的“幸福”转交给别人,而我们每个人需要的幸福不可能是同一种,哪怕是一个人在不同时期所需要的也不会是完全一样的,我们常常被动地接受了别人的“幸福”,这习惯让我们开始厌倦了,所以在这样的环境中感到越来越不幸福了。还好不想长大也长大了,“幸福”更重要是自己的选择,我选择了活在当下,只要此时拥有的我都会觉得是幸福的,因为在下一刻也许就有很多东西我们不再拥有了,但失去也是幸福的,上帝永远都是公平的,当祂为你关上一扇门的时候,祂一定会为你在另一个地方开启一扇窗的。
2、成长来自改变,改变来自决心,决心来自信心
3、这世界并不会在意你的自尊,指望你在自我感觉良好之前先要有所成就
4、什麼樣的思想.什麼樣的生活. 什麼樣的選擇.什麼樣的結局.
5、树的方向由风决定,人的方向由自己决定
6、昨天下决心,今天努力,明天成功。扛过今天晚上就能成就之前的所有努力。成功,只在于再坚持一下的毅力中。
7、爱情是留给懂得爱自己的人的。爱,是爱慕,是感觉;情,是情感,是积累;爱情是一段旅程,是两张车票,是愿意一起驶往人生的尽头,而且包容体谅和懂得,相濡以沫,执手偕老。
......
图的邻接矩阵创建算法(2006-05-08 23:08:00)
摘要:#include <iostream>
#include<stdio.h>
using namespace std;
#define FINITY 5000 //此处用5000代表最大
#define m 20 //最大顶点树
typedef char vertextype; //顶点值类型
typedef int edgetype; //权值类型
typedef struct
{
vertextype vexs[m]; //顶点值类型
edgetype edges[m][m]; //邻接矩阵
int n,e; //顶点总数 和 边树
}mgraph; //邻接矩阵表示的图类型
// 图的邻接矩阵创建算法
void createmgraph1(mgraph *g)
{
int i,j,k,w;
cout<<"\n输入图的顶点数:";
cin>>g->n;
cout<<"\n输入图的边数:";
cin>>g->e;
getchar(); &n......
线程的创建 ???(2006-04-20 20:18:00)
摘要:// 我创建了两个线程,本意是 要通过 临界区 实现 线程同步,
在这里 如果去掉 进入(或退出)临界区操作, 可以看到临界区的 作用
但如果都 去掉(即去掉临界区操作那部分) 或 都不 去掉 的话,结果一样,
知道的朋友帮忙改下怎么才能使 两个线程 随机 发生 ????????????
#include<iostream.h>
#include<windows.h>
CRITICAL_SECTION hCritical;
void display1()
{
EnterCriticalSection(&hCritical);
cout<<"Thread1 is runing!"<<endl;
LeaveCriticalSection(&hCritical);
}
void display2()
{
EnterCriticalSection(&hCritical);
cout<<"Thread2 is runing!"<<endl;
LeaveCriticalSection(&hCritical);
}
void main()
{
InitializeCriticalSection(&hCritical);
static HANDLE hHandle1=NULL;
static HANDLE hHandle2=NULL;
DWORD dwThreadID1;
while(1)
{
hHandle1=CreateThread((LPSECURITY_ATTRIBUTES)NULL,
0......
二叉树其他运算(2006-04-19 17:27:00)
摘要:#include <iostream>
using namespace std;
typedef char datatype;
typedef struct node
{
datatype data;
struct node *lchild,*rchild;
}bintnode;
typedef bintnode *bintree;
bintree root; //指向树根结点指针
// 二叉树的创建(按前序遍历顺序)
void createbintree(bintree *t)
{
char ch;
if((ch=getchar())==' ')
*t=NULL;
else
{
*t=(bintnode*)malloc(sizeof(bintnode));
(*t)->data=ch;
createbintree(&(*t)->lchild);
createbintree(&(*t)->rchild);
}
}
//二叉树的查找算法
bintree locate(bintree t,datatype x)
{
bintree p;
if(t==NULL)
return NULL;
else
if(t->data==x)
return t;
else
{
p=locate(t->lchild,......
二叉树各种非递归遍历(2006-04-13 19:34:00)
摘要:#include <iostream>
using namespace std;
//二叉树链式存储的头文件
typedef char datatype; //结点属性值类型
typedef struct node //二叉树结点的类型
{
datatype data;
struct node* lchild,*rchild;
}bintnode;
typedef bintnode *bintree;
bintree root; //指向二叉树根结点指针
//下面是些栈的操作 为非递归实现做准备
typedef struct stack //栈结构定义
{
bintree data[100]; //data 元素类型为 指针
int tag[100]; //为栈中元素作的标记,用于后序遍历
int top; //栈顶指针
}......
树的层号表示转化为树的孩子表示(数组方式)(2006-04-11 23:43:00)
摘要:#include<iostream>
using namespace std;
#define m 3 //树的度数
#define maxsize 50 //数组元素个数最大值
typedef char datatype;
typedef struct node //树的扩充孩子表示(数组方式)法中结点类型 多了 双亲
{
datatype data;
int child[m];
int parent;
}treenode;
typedef struct //层号表示法中结点的类型
{
int lev;
datatype data;
}levelnode;
treen......
树的括号表示转化为树的孩子(数组方式)表示方式(2006-04-10 20:28:00)
摘要://树的括号表示转换成树的孩子(数组方式)表示 算法
#include <iostream>
#include<stdio.h>
using namespace std;
#define m 3 //树的度数
#define maxsize 20 //数的孩子表示法对应数组大小
#define bmaxsize 25 //树的括号表示对应数组大小
typedef char datatype; //树中节点值类型
typedef struct node //树的孩子表示法中节点类型
{
datatype data;
int child[m];
}treenode;
treenode tree[maxsize]; //树的孩子表示法存储数组
int root; //根结点的下标
int length; //树中实际所含结点的个数
char p[bmaxsize]; ......
一般树的 创建以及各种遍历(2006-04-04 23:09:00)
摘要:// 先按前序遍历创建一棵 三度 树,然后按 前序,后序,层次 遍历此树
#include <iostream>
using namespace std;
#define m 3
typedef char datatype;
typedef struct node
{
datatype data;
struct node* child[m];
}node,*tree;
tree root;
// 按前序遍历 创建一棵度数为3的树的递归算法
void createtree(tree *p) //*p 可以换成p 吗?
{
int i;
char ch;
if((ch=getchar())==' ') *p=NULL; //建立一棵空树
else
{
*p=(tree)malloc(sizeof(node)); //用new 怎么建立
(*p)->data=ch;
for(i=0;i<m;i++)
createtree(&(*p)->child[i]);
}
}
//树的前序遍历递归算法
void preorder(tree p) //P为指向树根的指针
{
int i;
if(p!=NULL) //树不为空
{
cout<<p->data; &nbs......