查找函数的调用关系
来源:互联网 发布:武忠祥高数怎么样知乎 编辑:程序博客网 时间:2024/05/08 15:11
// mytest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <list>
#include <map>
using namespace std;
#define MAINFUNID 0
typedef map<int, vector<int>> MAP_INT_VEC;
typedef list<vector<int>> LIST_VEC;
void PrintVector(vector<int> &vecFuncNodeId)
{
vector<int>::iterator it;
for (it = vecFuncNodeId.begin(); it != vecFuncNodeId.end(); it++ )
{
cout<<*it<<" ";
}
cout<<endl<<endl;
}
//解析函数ID
void GetFuncNodeIdByLine(string strline, vector<int> &vecFuncNodeId)
{
int uiFuncNodeId = 0;
string strfunid;
while( strline.find(' ') != string::npos)
{
strfunid = strline.substr(0, strline.find(' '));
uiFuncNodeId = atoi(strfunid.c_str());
#if 0
//cout<<"int fun id: " << uiFuncNodeId<<endl;
if (uiFuncNodeId == 0)
{
vecFuncNodeId.insert(vecFuncNodeId.begin(),uiFuncNodeId);
}
else
{
vecFuncNodeId.push_back(uiFuncNodeId);
}
#endif
vecFuncNodeId.push_back(uiFuncNodeId);
strline = strline.substr(strline.find(' ')+1);
//cout<<"strline:"<<strline<<endl;
}
//cout<<"strline: "<<strline<<endl;
//题目保证了每行末尾没有空格
uiFuncNodeId = atoi(strline.c_str());
//cout<<"int fun id: " << uiFuncNodeId<<endl;
vecFuncNodeId.push_back(uiFuncNodeId);
}
//被调函数是主函数,删除该元素
void DeleteElemOfVec(vector<int> &vecFunId, int elem)
{
vector<int>::iterator iter = vecFunId.begin();
for (iter = vecFunId.begin(); iter != vecFunId.end();)
{
if(*iter == elem)
{
iter = vecFunId.erase(iter);
}
else
{
iter++;
}
if(iter == vecFunId.end()) //要控制迭代器不能超过整个容器
{
break;
}
}
}
//去除相邻的重复元素去除相邻的重复元素
void DistinctVector(vector<int> &vec)
{
vector<int>::iterator itNewEnd;
itNewEnd = unique(vec.begin(), vec.end());
vec.erase(itNewEnd, vec.end());
}
//合并两个vector容器
void CombineVector(vector<int> &vec1, vector<int> &vec2, vector<int> &vec3)
{
if (!vec1.empty())
{
//从vec3的首地址插入vec1 首尾间元素
vec3.insert(vec3.begin(), vec1.begin(), vec1.end());
}
if (!vec2.empty())
{
//从vec3的尾地址插入vec2首尾间元素
vec3.insert(vec3.end(), vec2.begin(), vec2.end());
}
//vec3默认升序排序
sort(vec3.begin(), vec3.end());
//去掉vec3中的相邻的重复元素
DistinctVector(vec3);
}
//获取该函数的调用关系
void GetFuncCallRelation(string strline, MAP_INT_VEC &mapFunCallRelate)
{
int uiFuncCallId = 0;
vector<int> vecFuncNodeId;
vector<int> vecFuncBeCalledNodeId;
GetFuncNodeIdByLine(strline, vecFuncNodeId);
PrintVector(vecFuncNodeId);
if (!vecFuncNodeId.empty())
{
//获取调用函数
uiFuncCallId = vecFuncNodeId[0];
#if 0
//去除相邻的重复元素去除相邻的重复元素
vector<int>::iterator itNewEnd;
itNewEnd = unique(vecFuncNodeId.begin(), vecFuncNodeId.end());
vecFuncNodeId.erase(itNewEnd, vecFuncNodeId.end());
PrintVector(vecFuncNodeId);
#endif
for (vector<int>::iterator it= vecFuncNodeId.begin() + 1; it != vecFuncNodeId.end(); it++)
{
//cout << *it<<endl;
vecFuncBeCalledNodeId.push_back(*it);
}
//vector 默认是按升序排列,即从小到大
sort(vecFuncBeCalledNodeId.begin(), vecFuncBeCalledNodeId.end());
//删除被调函数容器中的主函数ID
DeleteElemOfVec(vecFuncBeCalledNodeId, MAINFUNID);
//去除相邻的重复元素去除相邻的重复元素
DistinctVector(vecFuncBeCalledNodeId);
PrintVector(vecFuncBeCalledNodeId);
}
//判断调用函数在map容器中是否存在,如存在,合并被调函数
MAP_INT_VEC::iterator it = mapFunCallRelate.find(uiFuncCallId);
if (it == mapFunCallRelate.end())
{
mapFunCallRelate[uiFuncCallId] = vecFuncBeCalledNodeId;
}
else
{
vector<int> vecCombineElem;
CombineVector(mapFunCallRelate[uiFuncCallId] ,vecFuncBeCalledNodeId, vecCombineElem);
mapFunCallRelate[uiFuncCallId] = vecCombineElem;
}
//PrintVector(vecFuncCallRelation);
}
//从txt 文件中读取数据
void ReadDataByFileToFunCallRelate(string tmpstr, MAP_INT_VEC &mapFunCallRelate)
{
int line = 1;
vector<int> vecFuctId;
//vector<int> vecFuctCallRelation;
//char str[100];
ifstream infile("D://VisualStudio2010/Projects/mytest/mytest/input.txt");
cout<<"Read from file:" << endl;
if (! infile.is_open())
{
cout<<"Error opening file";
exit(1);
}
while(!infile.eof())
{
getline(infile, tmpstr);
//cout <<line<<": "<<tmpstr.c_str()<<endl;
line++;
//GetFuncNodeIdByLine(tmpstr, vecFuctId);
GetFuncCallRelation(tmpstr,mapFunCallRelate);
}
infile.close();
//PrintVector(vecFuctId);
}
int FindFunCallRelation(MAP_INT_VEC &mapFunCallRelate, vector<int> &vecFunRelate)
{
//LIST_VEC ListBeCalledFunVec;
int FunCallNodeId = 0;
int FunNodeId = 0;
list<int> listFunNodeId;
vector<int> vecBeCalledId;
if (!mapFunCallRelate.empty())
{
//将map容器的的key存在list容器中
MAP_INT_VEC::iterator iter;
for (iter = mapFunCallRelate.begin(); iter != mapFunCallRelate.end(); iter++)
{
FunCallNodeId = iter->first;
cout << "callnodeid: "<<FunCallNodeId<<endl;
vecBeCalledId = iter->second;
for (int i = 0; i < vecBeCalledId.size(); i++)
{
cout << vecBeCalledId[i] << " ";
}
cout<<endl;
listFunNodeId.push_back(FunCallNodeId);
}
FunNodeId = listFunNodeId.front();
vecFunRelate.push_back(FunNodeId);
//map key默认从小到大排序,第一个元素的key不为主函数,则该关系中午主函数
if (FunNodeId != MAINFUNID)
{
return -1;
}
cout<<endl<<"FunNodeId: ";
for (list<int>::iterator iter = listFunNodeId.begin(); iter != listFunNodeId.end(); )
{
FunNodeId = listFunNodeId.front();
listFunNodeId.remove(*iter++);
//cout<<FunNodeId<<" ";
#if 1
if (mapFunCallRelate.find(FunNodeId) != mapFunCallRelate.end())
{
for(int i = 0 ; i < mapFunCallRelate[FunNodeId].size(); i++)
{
if (find(listFunNodeId.begin(), listFunNodeId.end(), mapFunCallRelate[FunNodeId][i]) != listFunNodeId.end())
{
cout << mapFunCallRelate[FunNodeId][i] << " ";
vecFunRelate.push_back(mapFunCallRelate[FunNodeId][i]);
}
else
{
continue;
}
}
}
else
{
continue;
}
#endif
}
cout<<endl;
}
return 0;
}
char* szOutputFileName = "D://VisualStudio2010/Projects/mytest/mytest/output.txt";
void WriteDataToFile(vector<int> &vecData)
{
ofstream outputfile(szOutputFileName);
if (outputfile.is_open())
{
cout<<"Function call relation: "<<endl;
for (int i = 0 ; i < vecData.size(); i++)
{
outputfile<<vecData[i]<<endl;
}
outputfile.close();
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string linestr;
vector<int> vecFunRelate;
MAP_INT_VEC mapFunCallRelate;
ReadDataByFileToFunCallRelate(linestr, mapFunCallRelate);
FindFunCallRelation(mapFunCallRelate, vecFunRelate);
PrintVector(vecFunRelate);
WriteDataToFile(vecFunRelate);
return 0;
}
int FindFunCallRelation(MAP_INT_VEC &mapFunCallRelate, vector<vector<int>> &vecFunRelate)
{
int iFunCallNodeId = 0;
int FunNodeId = 0;
int index = 0;
list<int> listCallFunNodeId;
vector<int> vecBeCalledId;
vector<int> vecMainCallingId;
if (!mapFunCallRelate.empty())
{
//将map容器的的key存在list容器中
//map的首key存于vertor容器,key默认从小到大排序,第一个元素的key不为主函数,则该关系中午主函数
MAP_INT_VEC::iterator itLocate = mapFunCallRelate.find(MAINFUNID);
if (itLocate != mapFunCallRelate.end())
{
vecMainCallingId.push_back(MAINFUNID);
vecFunRelate.push_back(vecMainCallingId);
listCallFunNodeId.push_back(MAINFUNID);
}
else
{
return -1;
}
cout << "--------------------------------------------------------------------------"<<endl;
MAP_INT_VEC::iterator iter;
for (iter = mapFunCallRelate.begin(); iter != mapFunCallRelate.end(); iter++)
{
iFunCallNodeId = iter->first;
cout << "callnodeid: "<<iFunCallNodeId<<endl;
vecBeCalledId = iter->second;
for (int i = 0; i < vecBeCalledId.size(); i++)
{
cout << vecBeCalledId[i] << " ";
}
cout<<endl;
//listCallFunNodeId.push_back(iFunCallNodeId);
}
cout << "--------------------------------------------------------------------------"<<endl;
//MAP_INT_VEC::iterator iter;
for (iter = mapFunCallRelate.begin(); iter != mapFunCallRelate.end(); iter++)
{
vector<int> vecCallingId;
iFunCallNodeId = iter->first;
cout <<"first value - "<<iFunCallNodeId <<" ;";
vecBeCalledId = iter->second;
for (int i = 0; i < vecBeCalledId.size(); i++)
{
//cout << i << " ";
if (mapFunCallRelate.find(vecBeCalledId[i]) != mapFunCallRelate.end() && find(listCallFunNodeId.begin(), listCallFunNodeId.end(), vecBeCalledId[i]) == listCallFunNodeId.end())
{
cout << vecBeCalledId[i] << " ";
vecCallingId.push_back(vecBeCalledId[i]);
listCallFunNodeId.push_back(vecBeCalledId[i]);
}
else
{
continue;
}
}
vecFunRelate.push_back(vecCallingId);
cout<<endl;
}
cout << "--------------------------------------------------------------------------"<<endl;
cout<<"output result: "<<endl;
for (list<int>::iterator iter = listCallFunNodeId.begin(); iter != listCallFunNodeId.end(); iter++)
{
cout<<*iter<<" ";
}
cout<<endl;
}
else
{
return -1;
}
return 0;
}
char* szOutputFileName = "D://VisualStudio2010/Projects/mytest/mytest/output.txt";
void WriteDataToFile(vector<vector<int>> &vecData)
{
ofstream outputfile(szOutputFileName);
if (outputfile.is_open())
{
cout<<"Function call relation: "<<endl;
for (int i = 0 ; i < vecData.size(); i++)
{
for (int j = 0; j < vecData[i].size(); j++)
{
outputfile<<vecData[i][j]<<" ";
cout<<vecData[i][j]<<" ";
}
cout<<endl;
outputfile<<endl;
}
outputfile.close();
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int ret;
string linestr;
vector<int> vecFunRelate;
vector<vector<int>> vecOutputFunRelate;
MAP_INT_VEC mapFunCallRelate;
ReadDataByFileToFunCallRelate(linestr, mapFunCallRelate);
ret = FindFunCallRelation(mapFunCallRelate, vecOutputFunRelate);
if (ret == 0)
{
WriteDataToFile(vecOutputFunRelate);
}
PrintVector(vecFunRelate);
return 0;
}
- 查找函数的调用关系
- 函数调用-栈的关系
- 调用函数和被调用函数的关系
- eclipse中查找函数的所有调用
- eclipse中查找函数的所有调用
- eclipse中查找函数的所有调用
- 新的C++函数调用关系方法
- REDQueue中各个函数的调用关系
- 如何取得C# 的函数调用关系
- JM86的编码函数调用关系
- 函数调用与参数的关系
- lucene写索引的函数调用关系
- Lucene查询的函数调用关系
- Lucene生成查询的函数调用关系
- 浅析函数之间的调用关系
- linux系统调用,内核函数的关系
- Java继承关系构造函数的调用
- Python Class之间函数的调用关系
- Java中BigDecimal的8种舍入模式
- jquery 如何监听div内容的变化
- 详解ssh/https远程连接Git服务器
- 画廊etiennelawlor imagegallery真正全屏,使用隐藏状态栏和沉浸式浮动Toolbar
- 计算机网络体系结构
- 查找函数的调用关系
- java进阶五(jvm)
- 矩阵的之字型遍历
- 查询联系人封装工具类
- web服务经常瘫痪
- 实现OAuth2.0服务端【授权码模式(Authorization Code)】
- Android网页中启动Acitivity
- UGUI技术之LayoutGroup布局实现详解
- Ubuntu 不完全安装手册