博文
volatile(2006-11-18 11:06:00)
摘要:volatile的用法
避免编译器优化的用法 转自<海涛的笔记> _lindwenvolatile的本意是“易变的” 由于访问寄存器的速度要快过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......
笔记(2006-11-17 20:11:00)
摘要:1 不区分大小写的 字符串比较string.compare("需要比较的字符串1","需要比较的字符串2",true)=0true 表示不区分大小写 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(); //取消输入的换行符&......
线程的创建 ???(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); ......
二叉树其他运算(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......
二叉树各种非递归遍历(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......
树的层号表示转化为树的孩子表示(数组方式)(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......
树的括号表示转化为树的孩子(数组方式)表示方式(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; //输出根节点的值 for(i=0;i<m;i++) &nb......
