2011年8月16日

使用winavr的过程中,遇到的有关volatile的问题

摘要: SIGNAL(SIG_OUTPUT_COMPARE0A){timecount ++;}……while(1){ if(timecount > = 10) { R_LED_ON; timecount = 0; break; }}定时中断设置为2ms一次程序中有这样两部分,执行完前面一部分后,就会在while循环等待,直到进入十次定时中断后,timecount=10,就执行if,退出while循环,功能是用于控制整个程序运行大循环的时间。但实际运行时,通过仿真发现,总是无法进入if语句,解决办法为将timecount定义时前加volatile或者在makefile中将优化等级设为0;(将优化等 阅读全文

posted @ 2011-08-16 16:50 dusts 阅读(487) 评论(0) 推荐(0) 编辑

2011年7月26日

经典抽象数据类型 堆栈(笔记)

摘要: 获取内存来存储值有三种方案:静态数组,动态分配的数组、动态分配的链式结构。用静态数组实现堆栈:#include "stack.h"#include <assert.h>#define STACK_SIZE 100static STACK_TYPE stack[STACK_SIZE];static int top_element = -1;void push (STACK_TYPE value){ assert(!is_full()); top_element += 1; stack[top_element] = value;}void pop(void){ as 阅读全文

posted @ 2011-07-26 16:27 dusts 阅读(416) 评论(0) 推荐(0) 编辑

2011年7月25日

字符串常量

摘要: 当一个字符串常量出现于表达式中时,它的值是个指针常量。编译器把这些指定的字符copy存储在内存的某个位置,并存储一个指向第一个字符的指针。"xyz"+1表示指针值加上1,结果是个指针,指向字符串的第二个字符:y#include<stdio.h>int main(){int value = 11;putchar("0123456789ABCDEF"[value%16]);return 0;}输出结果为B。用类似此法可以方便的将十进制转换为16进制。 阅读全文

posted @ 2011-07-25 16:51 dusts 阅读(166) 评论(0) 推荐(0) 编辑

函数指针

摘要: 函数指针最常见的用途:转换表 和 作为参数传递给另一个函数。简单声明一个函数指针后,在对函数指针执行间接访问前必须把它初始化为指向某个函数。int f(int);int (*pf)(int) = &f;//&可有可无,因为函数名被使用时总是被编译器转换成函数指针。-----三种方式调用函数:int ans;ans =f(25);//函数名f会首先被转换成一个函数指针,该指针指定函数在内存在的位置,然后函数调用操作符调用该函数执行开始于这个地址的代码;ans = (*pf)(25);//把函数指针转换成一个函数名,这个转换并不是真正需要的,因为编译器在执行函数调用操作符之前又会把 阅读全文

posted @ 2011-07-25 14:21 dusts 阅读(241) 评论(0) 推荐(1) 编辑

2011年7月22日

常见的动态内存分配错误

摘要: 在使用动态分配的内存时,常出现的错误为:对null指针进行解引用操作(*),对分配的内存进行操作时越过边界,释放并非动态分配的内存、试图释放一块动态分配的内存的一部分以及一块动态内存被释放之后被继续使用。传递给free的指针必须是从malloc、calloc、realloc函数返回的指针,传给free函数一个指针,让它释放一块并非动态分配的内存可能导致程序立即终止或在晚些时候终止。试图释放一块动态分配的内存的一部分也可能引起类似问题。例如pi = malloc(10 * sizeof(int));free(pi + 5);//释放后五个这样企图释放内存的一部分是不容许的,必须整块一起释放。但r 阅读全文

posted @ 2011-07-22 13:05 dusts 阅读(1025) 评论(0) 推荐(0) 编辑

2011年7月12日

如何从深层嵌套的循环中迅速跳出

摘要: 因为break一次只能跳出一层循环,所以如果想从多层嵌套中迅速跳出有以下方法:1、goto语句while(condition1){ while(condition2) { while(condition3) if(some disaster) goto quit; }}quit: ;2、设置一个状态标志:enum {EXIT ,OK}status;...status = OK;while(status == OK && condition1){ while(status == OK && condition2){ while(status == OK & 阅读全文

posted @ 2011-07-12 10:05 dusts 阅读(1188) 评论(0) 推荐(1) 编辑

2011年7月11日

const 关键字 笔记

摘要: const修饰的值并不是常量,而是只读的变量。其值在编译时不能被使用,因为编译器在编译时不知道其存储的内容。C++ 里 const 变量一般默认 static 连接方式也就是其它 .cpp 文件看不到,所以用 extern 声明也没用可将 const 变量的声明放在 .h 文件里,需要使用此常量的 .cpp 都 #include 它编译器通常不为普通const只读变量分配存储空间,而是将它们保存在符号表中,这使得Tam它成为一个编译期间的值,没有了存储和读内存的操作,使它的效率很高。#define M 3 //宏常量const int N = 5; //此时未将N 放入内存......int 阅读全文

posted @ 2011-07-11 16:19 dusts 阅读(576) 评论(0) 推荐(0) 编辑

2011年7月5日

C语言 命令行参数

摘要: 在支持C语言的环境中,可以在程序开始执行时将命令行参数传递给程序。调用主函数main时,有两个参数,第一个参数表示运行程序时命令行中参数的数目;第二个参数表示指向字符串数组的指针,其中每个字符串对应一个参数。main(int argc, char *argv[])argc和argv是习惯性用法,可以更改。argv是一个指向指针的指针,这个数组的每个元素都是一个字符指针,指向的第一个参数就是程序的名称,最后一个是NULL。#include <stdio.h>int main(int argc, char *argv[]){int i;for(i = 1; i < argc; i 阅读全文

posted @ 2011-07-05 15:18 dusts 阅读(4611) 评论(0) 推荐(1) 编辑

指针与数组 (笔记)

摘要: 字符数组初始化的一种方法:char str[] = {"I am happy!"};也可以省略花括号{}char str[] = "I am happy!";只能通过调用strcpy函数来实现将一个字符串赋给一个字符数组,而不能用赋值语句讲一个字符串常量或者字符数组直接复制为一个字符数组:str1 = “china”;//错误str1 = str2;//错误strcpy(str1, str2);strcpy(str1, "china");以上是用字符数组存放字符串,另外, C++ 定义了一种新的数据类型——字符串类型(string)要 阅读全文

posted @ 2011-07-05 11:35 dusts 阅读(266) 评论(0) 推荐(0) 编辑

2011年6月30日

宏定义及拓展

摘要: #define的替换文本可以任意,比如:#define forever for (; ;)宏定义可以带参数#define max(a,b) ((a)>(b)?(a),(b))//形参(a,b)每次出现都会被替换为对应的实际参数可以用#undef 取消名字的宏定义。形参不能用带引号的字符串替换,但是如果在替换文本中,参数名以#作为前缀,结果将被拓展为由实际参数替换该参数的带引号的字符串。比如:#define dprint(expr) printf(#expr "=%g\n",expr)使用语句dprint(x/y);=========>printf("x 阅读全文

posted @ 2011-06-30 16:07 dusts 阅读(456) 评论(0) 推荐(1) 编辑

导航