導航:首頁 > 編程語言 > 關系圖代碼

關系圖代碼

發布時間:2023-06-15 03:16:37

1. 函數調用關系圖可以提供哪些與測試有關的信息

繪制函數調用關系圖對理解大型程序大有幫助。我想大家都有過一邊讀源碼(並在頭腦中維護一個調用棧),一邊在紙上畫函數調用關系,然後整理成圖的經歷。如果運氣好一點,藉助調試器的單步跟蹤功能和call stack窗口,能節約一些腦力。

不過如果要分析的是腳本語言的代碼,那多半隻好老老實實用第一種方法了。如果在讀代碼之前,手邊就有一份調用圖,豈不妙哉?下面舉出我知道的幾種免費的分析C/C++函數調用關系的工具

函數調用關系圖(call graph)是圖(graph),而且是有向圖,多半還是無環圖(無圈圖)——如果代碼中沒有直接或間接的遞歸的話。Graphviz是專門繪制有向圖和無向圖的工具,所以很多call graph分析工具都以它為後端(back end)。那麼前端呢?就看各家各顯神通了。

調用圖的分析分析大致可分為「靜態」和「動態」兩種,所謂靜態分析是指在不運行待分析的程序的前提下進行分析,那麼動態分析自然就是記錄程序實際運行時的函數調用情況了。

靜態分析又有兩種方法,一是分析源碼,二是分析編譯後的目標文件

分析源碼獲得的調用圖的質量取決於分析工具對編程語言的理解程度,比如能不能找出正確的C++重載函數。Doxygen是源碼文檔化工具,也能繪制調用圖,它似乎是自己分析源碼獲得函數調用關系的。GNU cflow也是類似的工具,不過它似乎偏重分析流程圖(flowchart)。

對編程語言的理解程度最好的當然是編譯器了,所以有人想出給編譯器打補丁,讓它在編譯時順便記錄函數調用關系。CodeViz(其靈感來自Martin Devera (Devik) 的工具)就屬於此類,它(1.0.9版)給GCC 3.4.1打了個補丁。

另外一個工具egypt的思路更巧妙,不用大動干戈地給編譯器打補丁,而是讓編譯器自己mp出調用關系,然後分析分析,交給Graphviz去繪圖。不過也有人另起爐灶,自己寫個C語言編譯器(ncc),專門分析調用圖,勇氣可嘉。不如要是對C++語言也這么干,成本不免太高了。分析C++的調用圖,還是藉助編譯器比較實在。

2. matlab 如何繪制層級關系圖

closeall,clearall;clc;
cm=[
0,0,0,0,0;
0,0,0,1,0;
0,0,0,1,0;
0,0,1,0,1;
1,0,0,0,0];
IDS={'S1','S2','S3','S4','S5'};
bg=biograph(cm,IDS);
set(bg.Nodes,'Shape','circle');
set(bg,'layoutType','radial');
dolayout(bg);
bg.nodes(1).position=[100,300];
bg.nodes(5).position=[100,250];
bg.nodes(4).position=[100,200];
bg.nodes(3).position=[50,200];
bg.nodes(2).position=[100,150];
dolayout(bg,'pathsonly',true);
view(bg);

輸出如下:

3. jquery怎麼實現關系圖的繪制

實例代碼如下:
<!DOCTYPE html >
<head>
<title>jQuery漸顯效果的人物多級關系圖</title>
<meta http-equiv="content-type" content="text/html;charset=gb2312">
<style type="text/css">
#box{width:500px;height:500px;position:relative;}
.host{position:absolute;width:100px;height:50px;line-height:50px;text-align:center;color:#000000;background-color:#eeeeee;border:#000000 1px solid;font-weight:bolder;}
.guest{position:absolute;width:80px;height:40px;line-height:40px;text-align:center;color:#999999;background-color:#FFFFFF;border:#000000 1px solid;cursor:pointer;}
.relationship{position:absolute;width:60px;height:20px;color:#aaa;line-height:20px;font-size:12px;text-align:center;}
</style>
<script src="http://www.codefans.net/ajaxjs/jquery1.3.2.js"></script>
<script type="text/javascript">
var relationName = [
{name:"成龍",friend:[
{name:"房祖名",relationship:"父子"},
{name:"林鳳嬌",relationship:"夫妻"},
},
{name:"房祖名",friend:[
{name:"成龍",relationship:"父子"},
{name:"林鳳嬌",relationship:"母子"},
},
{name:"林鳳嬌",friend:[
{name:"成龍",relationship:"夫妻"},
{name:"房祖名",relationship:"母子"},
},
{name:"吳綺莉",friend:[
{name:"成龍",relationship:"緋聞"},
{name:"林鳳嬌",relationship:"情敵"},
},
{name:"徐靜蕾",friend:[
{name:"李亞鵬",relationship:"電影"},
{name:"韓寒",relationship:"娛樂圈"},
},
{name:"方大同",friend:[
{name:"房祖名",relationship:"情敵"},
{name:"薛凱琪",relationship:"否認拍拖"},
},
{name:"薛凱琪",friend:[
{name:"方大同",relationship:"否認拍拖"},
{name:"房祖名",relationship:"女友"}]
}
]
var relation = {
radius:150,
boxW:500,
boxH:500,
hostW:100,
hostH:50,
guestW:80,
guestH:40,
relationW:60,
relationH:20,
angle:0,
id:"box",
init:function(array,n){//傳入參數1:數組 參數2:第幾個
this.array = array;
this.appendHost(this.array,n);
this.appendQuest(this.array,n);
this.appendRelationShip(this.array,n);
},
appendHost:function(array,n){
var box = $("#"+this.id);
var host ="<span class='host'>"+array[n].name+"</span>";
box.append(host)
this.postHost();
},
postHost:function(){
var x = (this.boxW - this.hostW)/2;
var y = (this.boxH - this.hostH)/2;
$(".host").css({
left:x,
top:y
})
},
appendQuest:function(array,n){
var box = $("#"+this.id);
var guests="";
var that = this;
for(var i=0; i<array[n].friend.length; i++){
guests+="<span class='guest'>"+array[n].friend[i].name+"</span>";
}
$(guests).appendTo(box);
$(".guest").live("click",function(){
that.move(that,this);
})
this.postQuest();
},
postQuest:function(){
var guests = $(".guest");
var that = this;
guests.each(function(i){
guests.eq(i).css({
left:that.setQuestPose(guests.length,that.radius,i,that.guestW,that.guestH,that.angle).left,
top:that.setQuestPose(guests.length,that.radius,i,that.guestW,that.guestH,that.angle).top
}).attr("angle",i/guests.length)
})
},
setQuestPose:function(n,r,i,w,h,d){//n代表共幾個對象 r代表周長 i代表第幾個對象 w代表外面對象的寬頻 h代表外面對象的高度 d代表其實角度
var p = i/n*Math.PI*2+Math.PI*2*d;
var x = r * Math.cos(p);
var y = r * Math.sin(p);
return {
"left":parseInt(this.boxW/2+ x - w/2),
"top":parseInt(this.boxH/2 + y - h/2)
}
},
appendRelationShip:function(array,n){
var box = $("#"+this.id);
var relation="";
for(var i=0; i<array[n].friend.length; i++){
relation+="<span class='relationship'>"+array[n].friend[i].relationship+"</span>";
}
box.append(relation);
this.postRelationShip();
},
postRelationShip:function(){
var guests = $(".relationship");
var that = this;
guests.each(function(i){
guests.eq(i).css({
left:that.setQuestPose(guests.length,that.radius/2,i,that.relationW,that.relationH,that.angle).left,
top:that.setQuestPose(guests.length,that.radius/2,i,that.relationW,that.relationH,that.angle).top
})
})
},
move:function(t,i){
var n = $(".guest").index($(i));
this.angle = parseFloat($(i).attr("angle"))+0.5;
this.delect(n);
this.moveHost(i);
this.moveQuest(i);
this.moveRelationship(i);
this.changeClass();
setTimeout(function(){t.newAppend(i)},500);
},
newAppend:function(i){
this.newAppendGuest(i,"guest","name",this.guestW,this.guestH,this.radius);
this.newAppendGuest(i,"relationship","relationship",this.relationW,this.relationH,this.radius/2);

},
newAppendGuest:function(i,className,name,w,h,r){
var host = $(i).html();
var guest = $(".guest").html();
var box = $("#"+this.id);
var that = this;
var next=0;
for(var i=0; i<this.array.length; i++){
if(host == this.array[i].name){
for(var j=0;j<this.array[i].friend.length; j++){
if(guest !== this.array[i].friend[j].name){
next++;
var guests ="<span class='"+className+"'>"+this.array[i].friend[j][name]+"</span>";
$(guests).appendTo(box).css({
left:that.setQuestPose(this.array[i].friend.length,r,next,w,h,that.angle).left,
top:that.setQuestPose(this.array[i].friend.length,r,next,w,h,that.angle).top
}).attr("angle",that.angle+next/this.array[i].friend.length).hide().fadeIn(1000);
}
}
}
}
},
moveHost:function(i){
var hLeft = parseInt($(".host").css("left")) + this.hostW/2;
var hTop = parseInt($(".host").css("top")) + this.hostH/2;
var gLeft = parseInt($(i).css("left")) + this.guestW/2;
var gTop = parseInt($(i).css("top")) + this.guestH/2;
var l = gLeft - hLeft;
var t = gTop - hTop;
var left = (hLeft - l - this.guestW/2)+"px";
var top = (hTop - t - this.guestH/2)+"px";
this.animate(".host",left,top);
},
moveRelationship:function(i){
var hLeft = parseInt($(".host").css("left")) + this.hostW/2;;
var hTop = parseInt($(".host").css("top")) + this.hostH/2;
var gLeft = parseInt($(".relationship").css("left")) + this.relationW/2;
var gTop = parseInt($(".relationship").css("top")) + this.relationH/2;
var l = gLeft - hLeft;
var t = gTop - hTop;
var left = (hLeft - l - this.relationW/2)+"px";
var top = (hTop - t - this.relationH/2)+"px";
this.animate(".relationship",left,top);
},
moveQuest:function(i){
var left = $(".host").css("left");
var top = $(".host").css("top");
this.animate(i,left,top);
},
delect:function(n){
$(".guest").slice(0,n).remove();
$(".guest").slice(1).remove();
$(".relationship").slice(0,n).remove();
$(".relationship").slice(1).remove();
},
animate:function(i,left,top){
$(i).animate({
left:left,
top:top
},500);
},
changeClass:function(){
var that =this;
$(".guest").addClass("abcdef").removeClass("guest");
$(".host").addClass("guest").removeClass("host").attr("angle",that.angle);
$(".abcdef").addClass("host").removeClass("abcdef").attr("angle",null);
}
}
$(document).ready(function(){
relation.init(relationName,0)
})
</script>
</head>
<body>
看不到效果,刷新一下就可以了;<br>
<div id="box"></div>
</body>
</html>

4. C++代碼通過VS2010生成時序圖以及各種UML關系圖的問題

現在還沒有可以通過代碼生成時序圖的產品,生成類圖以及類之間的關系應該沒問題!Trufun plato UML2建模工具是集成vs2010產品的,但是也只能保障C++代碼和UML模型的類圖之間的正向工程和反向工程,做到實時同步的程度!一般的同步都只是單向的,要麼從代碼到模型同步,要麼從模型到代碼同步,如果兩邊都動得話,同步很難做到!

閱讀全文

與關系圖代碼相關的資料

熱點內容
文件夾密碼怎麼修改密碼 瀏覽:271
蘋果數據中心用什麼伺服器 瀏覽:769
省內圓通快遞寄文件夾需要多少錢 瀏覽:740
iphone程序加密 瀏覽:884
win10文件夾調整文件行高 瀏覽:681
創意手繪教程 瀏覽:754
微信刪除帳號信息 瀏覽:596
mysql操作類文件 瀏覽:649
繞過xp密碼 瀏覽:158
大眾速騰專用app有哪些 瀏覽:455
arpa首先將計算機網路劃分為 瀏覽:617
蘋果系統開機音樂 瀏覽:875
windows8顯示隱藏文件 瀏覽:603
ipad2可以升級到92嗎 瀏覽:857
如何打開ps保存的文件 瀏覽:744
幼兒編程教育有哪些 瀏覽:453
汽車發外地用什麼app 瀏覽:810
網路如何贊美女人漂亮 瀏覽:143
如何把桌面文件放到excel裡面 瀏覽:363
照片文件名是怎麼查的 瀏覽:876

友情鏈接