博文

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总是与优化有关,编译器有一种技术叫做数据流分析,分析程序中的变量在哪里赋值、在哪里使用、在哪里失效,分析结果可以用于常量合并,常量传播等优化,进一步可以死代码消除。但有时这些优化不是程序所需要的,这时可以用volatile关键字禁止做这些优化,volatile的字面含义是易变的,它有下面的作用: 1 不会在两个***作之间把volatile变量缓存在寄存器中。在多任务、中断、甚至setjmp环境下,变量可能被其他的程序改变,编译器 自己无法知道,vol......

阅读全文(1991) | 评论:0

笔记(2006-11-17 20:11:00)

摘要:1 不区分大小写的 字符串比较string.compare("需要比较的字符串1","需要比较的字符串2",true)=0true 表示不区分大小写 false 表示区分大小写(为默认的)。相等返回 0 2,字符串变大小写 “字符串”.ToLower        "字符串“.ToUpper 3......

阅读全文(1810) | 评论:0

转载的(2006-11-16 21:11:00)

摘要:1、我所认为的“幸福”其实是每个人心里的一种感受,但大部分人总会将自己所期望的或是得不到的“幸福”转交给别人,而我们每个人需要的幸福不可能是同一种,哪怕是一个人在不同时期所需要的也不会是完全一样的,我们常常被动地接受了别人的“幸福”,这习惯让我们开始厌倦了,所以在这样的环境中感到越来越不幸福了。还好不想长大也长大了,“幸福”更重要是自己的选择,我选择了活在当下,只要此时拥有的我都会觉得是幸福的,因为在下一刻也许就有很多东西我们不再拥有了,但失去也是幸福的,上帝永远都是公平的,当祂为你关上一扇门的时候,祂一定会为你在另一个地方开启一扇窗的。 2、成长来自改变,改变来自决心,决心来自信心 3、这世界并不会在意你的自尊,指望你在自我感觉良好之前先要有所成就 4、什麼樣的思想.什麼樣的生活. 什麼樣的選擇.什麼樣的結局. 5、树的方向由风决定,人的方向由自己决定 6、昨天下决心,今天努力,明天成功。扛过今天晚上就能成就之前的所有努力。成功,只在于再坚持一下的毅力中。 7、爱情是留给懂得爱自己的人的。爱,是爱慕,是感觉;情,是情感,是积累;爱情是一段旅程,是两张车票,是愿意一起驶往人生的尽头,而且包容体谅和懂得,相濡以沫,执手偕老。   ......

阅读全文(2224) | 评论:0

图的邻接矩阵创建算法(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();                      //取消输入的换行符&......

阅读全文(5921) | 评论:0

线程的创建 ???(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,(LPTHREAD_START_ROUTINE)display1,  (LPVOID)NULL,0,&dwThreadID1); ......

阅读全文(2665) | 评论: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,x);   if(p)    return p;   else    return locate(t......

阅读全文(2695) | 评论:0

二叉树各种非递归遍历(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;                    //栈顶指针}seqstack; void push(seqstack* s,bintree t) //进栈{ s......

阅读全文(7386) | 评论:0

树的层号表示转化为树的孩子表示(数组方式)(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;                     treenode tree[maxsize];      &n......

阅读全文(3177) | 评论:0

树的括号表示转化为树的孩子(数组方式)表示方式(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];           /......

阅读全文(3793) | 评论:0

一般树的 创建以及各种遍历(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;                     //输出根节点的值  for(i=0;i<m;i++) &nb......

阅读全文(3772) | 评论:0