9.10 二分查找 gcc makefile gdb调试

 二分查找的迭代和递归实现:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int find1(int *a, int low , int high , int key)//迭代二分查找
  4. {
  5. int mid = 0;
  6. while (low <= high)
  7. {
  8. mid = (low+high)/2;
  9. if (a[mid] == key)
  10. return mid;
  11. else if (a[mid] < key)
  12. low = mid + 1;
  13. else
  14. high = mid -1;
  15. }
  16. return -1;
  17. }
  18. int find2(int *a, int low , int high , int key) //递归二分查找
  19. {
  20. if (low > high)
  21. return -1;
  22. int mid = (low+high)/2;
  23. if (a[mid] == key)
  24. return mid;
  25. else if (a[mid] < key)
  26. find1(a,mid+1,high,key);
  27. else
  28. find1(a,low,mid-1,key);
  29. }
  30. int main()
  31. {
  32. int array[13] = {2,6,8,12,32,64,67,78,98,104,120,134,140};
  33. int key = find2(array,0,12,140);
  34. printf("%d\n",array[key]);
  35. return 0;
  36. }


gcc常用选项

9.10  二分查找 gcc makefile gdb调试


gcc是如何知道文件类型呢?通过文件扩展名判断文件类型

9.10  二分查找 gcc makefile gdb调试



makefile规则遵循以下通用形式

target:dependency [dependency[…]]                           //dependency是依赖的意思
command
command
[…]
每个command第一个字符必须是tab键,而不是空格键,不然make会报错并停止。




稍微复杂的makefile,内容如下:

start:hello.o
        gcc -o hello hello.o

hello.o:
        gcc -o hello.o -c hello.c

target start后面的hello.o代表其下的command依赖与hello.o这个target。
所以make先执行了hello.o这个target下的command。



在makefile使用变量:

CC=gcc
SRCS=hello.c
OBJS=$(SRCS:.c=.o)
EXEC=hello

start:hello.o
        $(CC) -o $(EXEC) $(OBJS) 
        @echo ‘---------------ok---------------‘

hello.o:
        $(CC) -o $(OBJS) -c $(SRCS) 

clean:
        rm -f hello.o

增加变量CC,SRCS、OBJS、EXEC,即每个引用变量CC的地方的展开成变量的值。
OBJS=$(SRCS:.c=.o),意思是将SRCS变量中的.c替换为.o。




Makefile的模式规则

.SUFFIXES: .c .o    表示任何x.c文件与x.o关联
.c.o:     表示make定义了一条规则,任何x.o文件都从 x.c编译而来
make定义了一些有用的预定义变量
9.10  二分查找 gcc makefile gdb调试

在makefile使用自动变量和模式规则的例子并且可以编译多个源文件

.SUFFIXES:.c .o
CC=gcc
SRCS=hello.c\
pub.c

OBJS=$(SRCS:.c=.o)
EXEC=hello

start:$(OBJS)
        $(CC) -o $(EXEC) $(OBJS) 
        @echo ‘---------------ok---------------‘

.c.o:
        $(CC) -o $@ -c $< 

clean:
        rm -f $(OBJS)



gdb调试一定要加上-g选项:


gdb 程序名 [corefile]    corefile是可选的,但能增强gdb的调试能力。
Linux默认是不生成corefile的,所以需要在用户profile文件中添加

vi  .profile
ulimit -c unlimited
. .profile


gdb app core





9.10 二分查找 gcc makefile gdb调试

上一篇:关于数据库保存的二进制图片无法在colorbox插件中显示的解决办法


下一篇:Mysql中的基础函数