查找函数的调用关系

来源:互联网 发布:武忠祥高数怎么样知乎 编辑:程序博客网 时间: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;
}

0 0
原创粉丝点击