1.前言
这篇文章是将我在编写排序算法时遇到的一些比较有用的问题的解决方法记录下来。
2.初探main函数参数的含义
int main(int argc, char const *argv[])
argv[0]存放了可执行程序的位置, argv[]有argc个,,argc默认为1;argc程序时传递给main()函数的命令行参数个数
3.防止头文件重复引用导致重复定义报错
当我们头文件调用了其他头文件时,就容易因为重复定义而报错,如头文件a.hpp:
#include <iostream>
#include "mylist.hpp"
using namespace std;
void BubbleSort1(MyList *L1)………………
………………
其引用了mylist.hpp,而当我在主函数中,再引用mylist.hpp和a.hpp时,便会产生重复定义的错误:
In file included from simple_selection_sort.hpp:5:0,
from main.cpp:3:
mylist.hpp:9:8: error: redefinition of ‘struct MyList’
解决方法:
在我们写头文件时,需要先进行条件判断:
#ifndef _MYLIST_HPP_
#define _MYLIST_HPP_
……
#endif
这样当我们的编译器第一次打开该头文件时,会因为没有定义这个东西而执行#endif以前的语句,下一次打开时就发现已经定义了就不用执行了
改进后的mylist.hpp:
#ifndef _MYLIST_HPP_
#define _MYLIST_HPP_ //防止多次引用该头文件时报错
#include <iostream>
using namespace std;
#define MAXSIZE 100
struct MyList //创建顺序表
{
int data[MAXSIZE];
int length = 0; //顺序表的长度
};
void MySwap(MyList *L1, int i, int j) //交换下标为i和j的元素
{
int templt = L1->data[i];
L1->data[i] = L1->data[j];
L1->data[j] = templt;
}
void ShowList(MyList *L1) //打印顺序表元素
{
for(int i = 0; i < L1->length; i++)
{
cout << L1->data[i] << endl;
}
cout << "总长度为:" << L1->length << endl;
}
#endif
这是个好习惯,这样我们的头文件在被多次引用时,也不会出现重复定义的错误
4.使用gdb工具进行简单的程序调试
在Linux环境下,使用gdb对代码进行调试是非常快速方便的,我只用了几个基础的:
4.1.makefile编写
在makefile中需要在编译.o文件时,加入-g参数:
main: main.o
g++ -o main main.o
main.o: main.cpp mylist.hpp bubble_sort.hpp simple_selection_sort.hpp
g++ -g -c main.cpp
clean:
rm -f *.o
只有在编译.o文件时加入即可
4.2.启动gdb,加载和浏览文件
定位到当前程序可执行文件目录下后,命令行:gdb
然后使用:file ./可执行文件名 加载当前可执行文件,注意如果出现:没有符号表被读取。请使用 "file" 命令,需要重新对程序进行make
使用l,list进行分页浏览,回车键是重复执行上一次命令:
4.3.设置断点,查看变量值,单步执行
通过:break 行号,或者 b 行号,在相应的行设置断点,使用step、next单步执行
然后使用run,将程序运行到断点处,如果要进入函数内部,则使用step,不进入就使用next,进入函数内部后可以进行变量查看等操作:
使用finish可以退出函数