㈠ java函数调用关系图用什么工具画
visio2003 有各种模板,但画出来比较简单,而且也粗糙,如果画给自己用的,用visio也可以满足要求,如果是画给别人看的可以用rational rose 比较漂亮,看着也专业
㈡ 请问查看源代码调用结构图的软件叫什么
source insight 代码阅读和编辑软件建议试一下,可以实时生成该图
doxygen可以根据项目代码静态生成源代码调用结构图
㈢ 函数调用关系图可以提供哪些与测试有关的信息
绘制函数调用关系图对理解大型程序大有帮助。我想大家都有过一边读源码(并在头脑中维护一个调用栈),一边在纸上画函数调用关系,然后整理成图的经历。如果运气好一点,借助调试器的单步跟踪功能和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++的调用图,还是借助编译器比较实在。
㈣ source insight能不能查看不同包,不同源文件之间的调用或者引用状况以形成关系图
菜单View -> Relation Window 打开后可以看到当前函数所调用的函数关系,具体显示多少层可以进行设置。是树状结构,应该会有帮助。
㈤ 想画一个图整理一下程序里面的函数调用关系用什么软件比较方便
你是不是要找这个: http://ke..com/view/782970.htm 刚用过,太好了 说明书 软件直接在新浪爱问中搜rar格式的understand即可 ps(csdn收积分呃),还是爱问好呵呵
㈥ 如何使用go调用dll函数
1、创建dll: 在.cpp头部加上如下语句:#define DLLEXPORT __declspec(dllexport) 2、实现函数:DLLEXPORT int Add(int first,int second) { return (first+second); } 3、 使用Dll:在要使用该dll中函数的头文件中加入: #define DLLIMPORT __declspec(dllimport) #pragma comment(lib,"cal.lib") DLLIMPORT int Add(int first,int second); 4、 如果使用了新建头文件,则包含该头文件再引用dll中的函数。 二、导出class的DLL 1、 在要导出的dll中,右键点击ClassView的根目录->New Class->Generic,添加一新类CRectArea 2、 在新添加类头文件中加入:#define DLLEXPORT __declspec(dllexport) 3、 在类前加入DLLEXPORT:class DLLEXPORT CRectArea{…}; ...
㈦ 嵌入式 linux 启动U-Boot与内核的关系中的go指令调用的下面的函数是完成什么功能求注释,一定采纳
/* common/cmd_boot.c */
int do_go (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
ulong addr, rc;
int rcode = 0;
if (argc < 2) {
printf ("Usage:\n%s\n", cmdtp->usage);
return 1;
}
addr = simple_strtoul(argv[1], NULL, 16); /* go的用法是:go addr, addr通过simple_strtoul 转换成ulong型的地址 */
printf ("## Starting application at 0x%08lX ...\n", addr);
/*
* pass address parameter as argv[0] (aka command name),
* and all remaining args
*/
rc = ((ulong (*)(int, char *[]))addr) (--argc, &argv[1]); /* 转成直接指向该地址的函数指针调用该函数 */
if (rc != 0) rcode = 1;
printf ("## Application terminated, rc = 0x%lX\n", rc);
return rcode;
}
建议你看一下函数指针,基本上应该就了解了。
㈧ go语言如何调用c函数
直接嵌入c源代码到go代码里面
package main
/*
#include <stdio.h>
void myhello(int i) {
printf("Hello C: %d\n", i);
}
*/
import "C"
import "fmt"
func main() {
C.myhello(C.int(12))
fmt.Println("Hello Go");
}
需要注意的是C代码必须放在注释里面
import "C"语句和前面的C代码之间不能有空行
运行结果
$ go build main.go && ./main
Hello C: 12
Hello Go
分开c代码到单独文件
嵌在一起代码结构不是很好看,很多人包括我,还是喜欢把两个分开,放在不同的文件里面,显得干净,go源文件里面是go的源代码,c源文件里面是c的源代码。
$ ls
hello.c hello.h main.go
$ cat hello.h
void hello(int);
$ cat hello.c
#include <stdio.h>
void hello(int i) {
printf("Hello C: %d\n", i);
}
$ cat main.go
package main
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
编译运行
$ go build && ./main
Hello C: 12
Hello Go
编译成库文件
如果c文件比较多,最好还是能够编译成一个独立的库文件,然后go来调用库。
$ find mylib main
mylib
mylib/hello.h
mylib/hello.c
main
main/main.go
编译库文件
$ cd mylib
# gcc -fPIC -shared -o libhello.so hello.c
编译go程序
$ cd main
$ cat main.go
package main
// #cgo CFLAGS: -I../mylib
// #cgo LDFLAGS: -L../mylib -lhello
// #include "hello.h"
import "C"
import "fmt"
func main() {
C.hello(C.int(12))
fmt.Println("Hello Go");
}
$ go build main.go
运行
$ export LD_LIBRARY_PATH=../mylib
$ ./main
Hello C: 12
Hello Go
在我们的例子中,库文件是编译成动态库的,main程序链接的时候也是采用的动态库
$ ldd main
linux-vdso.so.1 => (0x00007fffc7968000)
libhello.so => ../mylib/libhello.so (0x00007f513684c000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f5136614000)
libc.so.6 => /lib64/libc.so.6 (0x00007f5136253000)
/lib64/ld-linux-x86-64.so.2 (0x000055d819227000)
理论上讲也是可以编译成整个一静态链接的可执行程序,由于我的机器上缺少静态链接的系统库,比如libc.a,所以只能编译成动态链接。
㈨ go中:func(r rune) bool { return r == rune(0)} r从哪里来有点不太看得懂这个
函数的调用者把一个rune类型值传给形参r,简而言之,r从调用者那里来
㈩ Golang 中函数和方法的区别
在接触到go之前,我认为函数和方法只是同一个东西的两个名字而已(在我熟悉的c/c++,python,java中没有明显的区别),但是在golang中者完全是两个不同的东西。官方的解释是,方法是包含了接收者的函数。到底什么意思呢。
首先函数的格式是固定的,func+函数名+ 参数 + 返回值(可选) + 函数体。例
func main()
{
fmt.Println("Hello go")
}
在golang中有两个特殊的函数,main函数和init函数,main函数不用介绍在所有语言中都一样,它作为一个程序的入口,只能有一个。init函数在每个package是可选的,可有可无,甚至可以有多个(但是强烈建议一个package中一个init函数),init函数在你导入该package时程序会自动调用init函数,所以init函数不用我们手动调用,l另外它只会被调用一次,因为当一个package被多次引用时,它只会被导入一次。
packagemain
import(
"demo/mypackage"
"fmt"
)
funcmain(){
fmt.Println("Hellogo....I=",mypackage.I)
}
运行结果:
我们可以看到方法和函数的区别,方法在func关键字后是接收者而不是函数名,接收者可以是自己定义的一个类型,这个类型可以是struct,interface,甚至我们可以重定义基本数据类型。我们可以给他一些我们想要的方法来满足我们的实际工程中的需求,就像上面一样我重定义了int并给了它一个乘2和平法的方法,这里我们要注意一个细节,接收者是指针和非指针的区别,我们可以看到当接收者为指针式,我们可以通过方法改变该接收者的属性,但是非指针类型缺做不到。
这里的接收者和c++中的this指针有一些相似,我们可以把接受者当作一个class,而这些方法就是类的成员函数,当接收者为指针类型是就是c++中的非const成员函数,为非指针时就是const成员函数,不能通过此方法改变累的成员变量。