二分查找 gcc makefile gdb调试
二分查找的迭代和递归实现:
![](//images0.cnblogs.com/blog/660888/201409/150014419184959.png)
![](//images0.cnblogs.com/blog/660888/201409/150014431997001.png)
![](//images0.cnblogs.com/blog/660888/201409/150014435434430.png)
#include <stdio.h>
#include <stdlib.h>
int find1(int *a, int low , int high , int key)//迭代二分查找
{
int mid = 0;
while (low <= high)
{
mid = (low+high)/2;
if (a[mid] == key)
return mid;
else if (a[mid] < key)
low = mid + 1;
else
high = mid -1;
}
return -1;
}
int find2(int *a, int low , int high , int key) //递归二分查找
{
if (low > high)
return -1;
int mid = (low+high)/2;
if (a[mid] == key)
return mid;
else if (a[mid] < key)
find1(a,mid+1,high,key);
else
find1(a,low,mid-1,key);
}
int main()
{
int array[13] = {2,6,8,12,32,64,67,78,98,104,120,134,140};
int key = find2(array,0,12,140);
printf("%d\n",array[key]);
return 0;
}
gcc常用选项
![](http://images0.cnblogs.com/blog/660888/201409/150014419184959.png)
gcc是如何知道文件类型呢?通过文件扩展名判断文件类型
![](http://images0.cnblogs.com/blog/660888/201409/150014431997001.png)
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定义了一些有用的预定义变量
![](http://images0.cnblogs.com/blog/660888/201409/150014435434430.png)
在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