精华内容
下载资源
问答
  • c++函数调用数组

    千次阅读 2021-03-31 14:10:16
    int fun(int a[3][2]) { } int main() { fun(a); }
    int fun(int a[3][2])
    {
    }
    int main()
    {
    fun(a);
    }
    
    展开全文
  • C++自动生成函数调用关系图.rar
  • c++中执行文件指:main函数 函数文件:其他所有需要用到的函数c++中,函数文件名没有特殊讲究,将文件添加到工程目录便能使用 对函数的要求有三点 函数的完整文件 输入参数的定义 函数声明加入头文件 1.函数的...

    在matlab里.m文件分执行文件和函数文件
    在c++中执行文件指:main函数
    函数文件:其他所有需要用到的函数

    在c++中,函数文件名没有特殊讲究,将文件添加到工程目录便能使用
    在这里插入图片描述
    对函数的要求有三点

    函数的完整文件
    输入参数的定义
    函数声明加入头文件

    1.函数的完整文件

    #include <opencv2/opencv.hpp>
    using namespace cv;
    
    void cameracapture(Mat &frame, int mytime, int imageWidth,int imageHeight)
    {
    	char c = 0;
    	VideoCapture capture(0);
    	capture.set(CV_CAP_PROP_FRAME_WIDTH, imageWidth*2);//宽度2560
    	capture.set(CV_CAP_PROP_FRAME_HEIGHT, imageHeight);//高度720
    	
    	for (int i=0; i < mytime; i++)
    	{
    		capture >> frame;
    	}
    }
    

    函数的完整文件包括了函数需要的头文件

     #include <opencv2/opencv.hpp>
     using namespace cv;
    

    以及剩下的函数的程序段
    这里解释一下加&和不加&的区别
    Mat &frame 加&的变量传递的是变量地址,直白的理解为,加了后我在函数中对该变量修改后,会对我的主函数main中的对应变量进行修改。这里我的程序是打开相机,并把拍摄图像返回main函数,因此我需要随时根据拍摄修改我的main函数中frame的值。
    int mytime, int imageWidth,int imageHeight这些则是传入值,在函数内进行修改后不影响main里面的值,因为这些值只传入函数,而不需要函数再传回主函数。
    这里还有一点编程技巧
    我们通过函数调用的方式进行运算,有两种方式得到运算结果
    ①设置函数的返回值,return
    ②将传入值的地址(即传入值自身)交给函数,函数对其进行运算相当于直接对传入值进行运算。

    2.输入参数的定义

    我们在main中调用其他函数时,我们的输入参数需要提前定义

    main ()
    {
    Mat frame; 
    int mytime = 10;
    int imageWidth = 1280;
    int imageHeight = 720;
    cameracapture(frame, mytime, imageWidth, imageHeight);//注意这里和函数定义不同
    ………………
    }
    

    3.函数声明加入头文件

    我们调用其他函数前必须先声明

     void cameracapture(Mat &frame, int mytime, int imageWidth,int imageHeight)
    

    写入.h文件(头文件),写入头文件后也就告知了我们的项目,我们声明了,项目中是有该函数的定义的。为什么要用头文件?因为我们把我们用到的函数声明都写到一个.h文件里,下次再使用时我们直接#include XXX.h即可,没有必要再对用到的函数一个一个地声明。

    完成上面的三步,我们自己的函数就制作好了,使用起来比较方便。
    这里再扩展一下
    我们在数组传入函数,传出函数时可能会面临着数组无法修改的问题,这里二郎给大家提供一个解决办法,不是最优,但是可行
    main里面:

    float key_data[10][4] = { 0 };
    my_f(img_cir_L, img_cir_R, key_data);
    

    函数里面:

    void my_f(Mat rectifyImageL, Mat rectifyImageR, float(&key_data)[10][4])
    

    头文件里面:

     void my_f(Mat rectifyImageL, Mat rectifyImageR, float(&key_data)[10][4]);
    

    这样便能实现数组数据的传入和处理后结果的传递了

    展开全文
  • 3.C++函数调用过程

    万次阅读 2020-03-08 17:31:05
    函数调用堆栈的过程 1.函数中普通变量的内存分配问题 当一个函数进行调用时,函数的形参、以及函数的局部变量都会在栈中被分配内存,而栈又分两种; 栈低不变,栈顶不断动态变化; 栈顶不变,栈低在动态变化; #...

    1.函数中普通变量的内存分配问题

    • 当一个函数进行调用时,函数的形参、以及函数的局部变量都会在栈中被分配内存,而栈又分两种;
    1. 栈低不变,栈顶不断动态变化;
    2. 栈顶不变,栈低在动态变化;
    #include <iostream>
    using namespace  std;
    void print()
    {
    int a=0,b=1,c=2;
    cout<<"&a="<<reinterpret_cat<void*>(&a)<<endl;
    cout<<"&b="<<reinterpret_cat<void*>(&b)<<endl;
    cout<<"&c="<<reinterpret_cat<void*>(&c)<<endl;
    }//reinterpret_cast运算符是用来处理无关类型之间的转换,它会产生一个新的值,这个值会有和原始参数有完全相同的比特位;
    int main()
    {
    print();
    return 0;
    }
    

    输出:
    &a=0x7ffdded7a38c
    &b=0x7ffdded7a390
    &c=0x7ffdded7a394

    • 可以发现,abc地址依次升高,所以,在C++中函数调用过程中定义的局部变量是采用栈底不变,栈顶不断变换的内存栈 ,随着声明顺序,内存地址依次降低;

    2.函数中数组变量的内存分配问题

    • 数组在分配时一次性分配整个数组的内存?
    • 数组中各个元素的地址分配顺序时怎样的?
    #include <iostream>
    using namespace std;
    void print()
    {
    int a=0;int b=1;
    int c=2;int arr[2];
    cout<<"&a="<<reinterpret_cast<void*>(&a)<<endl;
    cout<<"&b="<<reinterpret_cast<void*>(&b)<<endl;
    cout<<"&c="<<reinterpret_cast<void*>(&c)<<endl;
    cout<<"&arr[0]="<<reinterpret_cast<void*>(&arr)<<endl;
    cout<<"&arr[1]"<<reinterpret_cast<void*>(&arr[1])<<endl;
    }
    int main()
    {
    print();
    return 0;
    }
    

    输出:
    &a=0x7fffb69b53e4
    &b=0x7fffb69b53e8
    &c=0x7fffb69b53ec
    &arr[0]=0x7fffb69b53f0
    &arr[1]0x7fffb69b53f4

    在这里插入图片描述

    3.函数调用堆栈的过程

    #include<stdio.h>
    int sum(int a,int b)
    {
    int tmp=0;
    tmp =a+b;
    return tmp;
    }
    int main()
    {
    int a=10;
    int b=20;
    int ret=0;
    ret=sum(a,b);
    printf("ret=%d\n",ret);
    return 0;
    }
    
    • 生成反汇编代码方式
      1.生成代码汇编后的二进制文件;<-- gcc -c -o sum.o
      2生成反汇编代码 : < ------ objdumo -d sum.o > sum.o.txt
    • 反汇编可执行二进制文件
    gcc sum.c -g -o sum    //编译
    objdump -S sum > sum.txt   //将在汇编代码中加入源文件代码
    

    参考:函数调用堆栈的过程

    时间紧张,日后补上,这里就看一下结论;

    • 整个函数的调用过程:
    1. 将调用方法的栈底地址入栈。——>push ebp;
    2. 让原本指向调用方栈低的ebp指向当前函数的栈底, ----> mov ebp,esp
    3. 给当前函数开辟栈帧;----> sub esp,44h
    4. 对开辟的栈帧进行初始化,初始化的大小不一定; ----->rep stos
    • 结论:
      1.函数的运行都是在栈上开辟内存的;
      2.栈是通过esp(栈顶指针)、ebp(栈底指针)两个指针来标识的;
      3.对于栈上的访问都是通过栈底指针的偏移来访问的;
      4.在call一个函数时,有两件事要做:先将调用的函数的下一行指令的地址压人栈中;再进行跳转;
      5.在函数调用时检查函数是否申明、函数名是否相同、函数的参数列表是否匹配、函数的返回值多大;
      (1)如果函数返回值<=4个字节,则返回值通过寄存器eax带回;
      (2)如果4<函数返回值<=8个字节,则返回值通过两个寄存器eax和edx带回,
      (3)如果函数返回值>8个字节,则返回值同产生的临时量带回;
      6.函数结束ret指令干了两件事:先出栈;再将出栈的值放到CPU的PC寄存器中,因为PC寄存器中永远存放的是下一次指令的地址;

    函数调用过程参考1—反汇编代码
    函数调用过程参考2
    函数调用参考

    展开全文
  • C/C++函数调用的几种方式总结

    千次阅读 2017-07-26 13:54:19
    本篇文章主要是对C/C++函数调用的几种方式进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 调用函数时,计算机常用栈来存储传递给函数的参数。 栈是一种先进后出的数据结构,栈有一个...
    


    本篇文章主要是对C/C++函数调用的几种方式进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    调用函数时,计算机常用栈来存储传递给函数的参数。

    栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以在栈顶上方向栈中加入数据,这个操作被称为压栈(Push),压栈以后,栈顶自动变成新加入数据项的位置,栈顶指针也随之修改。用户也可以从堆栈中取走栈顶,称为弹出栈(pop),弹出栈后,栈顶下的一个元素变成栈顶,栈顶指针随之修改。函数调用时,调用者依次把参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。

    在参数传递中,有两个重要的问题必须要明确说明:

    1. 当参数个数多于一个时,按照什么顺序把参数压入堆栈;

    2. 函数调用后,由谁来把堆栈恢复原状。


    在高级语言中,就是通过函数的调用方式来说明这两个问题的。常见的调用方式有:

    stdcall

    cdecl

    fastcall

    thiscall

    thiscall

    naked call


    下面就分别介绍这几种调用方式:
     

    1. stdcall

    stdcall调用方式又被称为Pascal调用方式。在Microsoft C++系列的C/C++编译器中,使用PASCAL宏,WINAPI宏和CALLBACK宏来指定函数的调用方式为stdcall。

    stdcall调用方式的函数声明为:

    int _stdcall function(int a, int b);

    stdcall的调用方式意味着:

    (1) 参数从右向左一次压入堆栈

    (2) 由被调用函数自己来恢复堆栈

    (3) 函数名自动加前导下划线,后面紧跟着一个@,其后紧跟着参数的尺寸

    上面那个函数翻译成汇编语言将变成:

    push b     先压入第二个参数

    push a     再压入第一个参数

    call function   调用函数


    在编译时,此函数的名字被翻译为_function@8


    2. cdecl

    cdecl调用方式又称为C调用方式,是C语言缺省的调用方式,它的语法为:

    int function(int a, int b)  // 不加修饰符就是C调用方式

    int _cdecl function(int a, int b)  // 明确指定用C调用方式

    cdecl的调用方式决定了:

    (1) 参数从右向左依次压入堆栈

    (2) 由调用者恢复堆栈

    (3) 函数名自动加前导下划线

    由于是由调用者来恢复堆栈,因此C调用方式允许函数的参数个数是不固定的,这是C语言的一大特色。

    此方式的函数被翻译为:

    push b   // 先压入第二个参数

    push a   // 在压入第一个参数

    call funtion  // 调用函数

    add  esp, 8   // 清理堆栈


    在编译时,此方式的函数被翻译成:_function
     

    3. fastcall

    fastcall 按照名字上理解就可以知道,它是一种快速调用方式。此方式的函数的第一个和第二个DWORD参数通过ecx和edx传递,

    后面的参数从右向左的顺序压入栈。

    被调用函数清理堆栈。

    函数名修个规则同stdcall

    其声明语法为:

    int fastcall function(int a, int b);


    4. thiscall

    thiscall 调用方式是唯一一种不能显示指定的修饰符。它是c++类成员函数缺省的调用方式。由于成员函数调用还有一个this指针,因此必须用这种特殊的调用方式。

    thiscall调用方式意味着:

    参数从右向左压入栈。

    如果参数个数确定,this指针通过ecx传递给被调用者;如果参数个数不确定,this指针在所有参数压入栈后被压入栈。

    参数个数不定的,由调用者清理堆栈,否则由函数自己清理堆栈。

    可以看到,对于参数个数固定的情况,它类似于stdcall,不定时则类似于cdecl。
     

    5. naked call

    是一种比较少见的调用方式,一般高级程序设计语言中不常见。


    函数的声明调用方式和实际调用方式必须一致,必然编译器会产生混乱。


    函数名字修改规则:

    1. C编译时函数名修饰约定规则:

    __stdcall调用约定在输出函数名前加上一个下划线前缀,后面加上一个“@”符号和其参数的字节数,格式为_function@8。

    __cdecl调用约定仅在输出函数名前加上一个下划线前缀,格式为_function。

    __fastcall调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,格式为@function@8。

    它们均不改变输出函数名中的字符大小写,这和PASCAL调用约定不同,PASCAL约定输出的函数名无任何修饰且全部大写。

    2. C++编译时函数名修饰约定规则:

    __stdcall调用约定:

    (1)以“?”标识函数名的开始,后跟函数名;

    (2)函数名后面以“@@YG”标识参数表的开始,后跟参数表;

    (3)参数表以代号表示:

    X--void ,

    D--char,

    E--unsigned char,

    F--short,

    H--int,

    I--unsigned int,

    J--long,

    K--unsigned long,

    M--float,

    N--double,

    _N--bool,

    ....

    PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代

    表一次重复;

    (4)参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前;

    (5)参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束。

    其格式为“?functionname@@YG*****@Z”或“?functionname@@YG*XZ”,例如

    int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z”

    void Test2() -----“?Test2@@YGXXZ”


    __cdecl调用约定:

    规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@YG”变为“@@YA”。
     

    __fastcall调用约定:

    规则同上面的_stdcall调用约定,只是参数表的开始标识由上面的“@@YG”变为“@@YI”。


    VC++对函数的省缺声明是"__cedcl",将只能被C/C++调用。

    展开全文
  • C/C++函数调用的压栈模型

    千次阅读 2018-05-18 19:18:29
    函数调用的压栈模型对于我们学习C语言非常重要,最直观的体现在我们后面要学的函数的递归,函数的递归就充分利用的函数的压栈模型 当函数从入口函数main函数开始执行时,编译器会将我们操作系统的运行状态,main...
  • C/C++ 函数调用关系图

    万次阅读 2017-03-13 14:39:19
    网上已经有不少相类似的工具,不过都是基于C代码,基于C++很少,或者支持不完善,本工具基于gcc编译器输出RTL文本功能,解析其输出的RTL文件,从而解析出函数调用关系图,RTL文件包含很多编译后的信息,
  • C++函数调用 段错误

    千次阅读 2018-03-15 15:40:50
    调用一个函数时发生段错误:Segmentation fault加入打印日志之后,发现运行时根本没有进入该函数就已经crash,将该函数全部注释掉在运行时又一切正常。经过调试发现原因:该函数中存在一个大数组#define BUFFER_SIZE...
  • C/C++函数调用的几种方式

    千次阅读 2015-12-02 09:36:43
    我们知道,调用函数时,计算机常用栈来存放函数执行需要的参数,由于栈的空间大小是有限的,在windows下栈是向低地址扩展的数据结构...在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执
  • C++函数调用 入栈以及出栈

    千次阅读 2017-10-04 17:40:57
    栈(Stack):存放局部变量,函数参数,当前状态,函数调用信息等,向地址减小的方向增长,可读可写可执行。 ESP:栈指针寄存器(extended stack pointer),其内存放着一个指针,该指针永远指向...
  • 使用“调用堆栈”窗口可以查看当前堆栈上的函数或过程调用。 “调用堆栈”窗口显示每个函数的名称以及编写它所用的编程语言。 函数或过程名称可能包含可选信息,如模块名称、行号、参数名称、类型和值。 可以打开或...
  • C++ 函数调用和系统调用的区别

    千次阅读 2018-02-06 10:59:27
     所谓系统调用就是用户在程序中调用操作系统所提供的一个子功能,也就是系统API,系统调用可以被看做特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如...
  • C++函数调用过程和内置函数详解

    千次阅读 2018-03-12 10:15:01
    上图表示函数调用过程:①程序先执行函数调用之前的语句;②流程的控制转移到被调用函数入口处,同时进行参数传递;③执行被调用函数中函数体的语句;④流程返回调用函数的下一条指令处,将函数返回值带回;⑤接着...
  • C++函数调用过程深入分析

    万次阅读 2011-08-11 20:43:42
    C++函数调用过程深入分析 刘兵 QQ: 44452114 E-mail: liubing2000@foxmail.com 0. 引言  函数调用的过程实际上也就是一个中断的过程,那么C++中到底是怎样实现一个函数的调用的呢?参数入栈、函数跳转、保护现场...
  • 出错代码: int desideK(int K) {K=3; return K; }  void main()  { int K=0;  desideK(K);  cout &lt;&lt; "K=" &lt;&lt; K &lt;&lt;... void m...
  • 在看程序员吴师兄的《https://blog.csdn.net/kexuanxiu1163/article/details/91461329》这篇博客的时候,动手写了一下博客中的插入排序,用的是C++语言,但是遇到了函数调用过程中形参发生了改变,实参的值却没有...
  • C++ 获取函数调用堆栈的 高效实现代码
  • C/C++函数调用过程--函数栈(一)

    千次阅读 2015-03-20 11:22:16
    函数调用大家都不陌生,调用者向被调用者传递一些参数,然后执行被调用者的代码,最后被调用者向调用者返回结果。   对于程序,编译器会对其分配一段内存,在逻辑上可以分为代码段,数据段,堆,栈 代码段:保存...
  • VC C/C++ 函数调用约定(最全)

    千次阅读 2016-12-24 13:33:09
    转: VC C/C++ 函数调用约定(最全)  函数调用约定   常见的函数调用约定[5]:cdecl,stdcall,fastcall,thiscall,naked call  MFC调用约定(VS6:Project Settings->C/C++ Calling convention:)    1,...
  • C++_函数调用

    千次阅读 2019-12-18 19:58:04
    int add(int num1, int num2) //函数定义的时候,num1和num2并没有真实数据,他只是一个形式上成参数, //简称形参 { int sum = num1 + num... //main函数调用add函数 int a = 10; //实参 int b = 20; //实...
  • C++函数堆栈调用

    千次阅读 2018-08-20 16:00:14
    函数堆栈调用 一、什么是栈以及特点? 在计算机系统中,栈被定义为一个特殊的容器,用户可以将...栈保存了一个函数调用所需要的维护信息,这常常被称为堆栈帧;堆栈帧的一般包括: 函数的返回地址和参数; 临...
  • C++函数调用之静态成员函数

    千次阅读 2014-09-06 11:27:13
    首先,定义如下类A: class A { private: static int val_s; public: static int getVal(){cout ;...我们可以看到,上述类的定义中包含静态成员变量val_s 和静态成员函数getVal() ,对于静态的成员变量,一般
  • C++部分函数调用形式耗时测试

    千次阅读 2019-03-07 00:33:53
    我当时觉得不太对,因为在我理解里模板是牺牲编译时间换取运行时间的典型,编译器会自动生成替换模板后的函数,再慢也是一般函数调用级别的;而函数指针则有一次寻址操作,照理应该是会慢一拍。晚上下班回家便进行了...
  • C++中用函数调用二维数组

    千次阅读 2019-11-09 10:55:45
    函数调用二维数组 #include #include using namespace std; void fun(int a[3][3]); int main() {  int b[3][3] = {1,1,1,2,2,2,3,3,3};  fun(b); } void fun(int a[3][3]) {  int i,j;  for ...
  • c++调用函数

    千次阅读 2018-12-12 20:02:29
    被其他函数调用的函数称为被调函数。一个函数很可能既调用别的函数又被其它函数调用函数调用的形式 类型说明符 函数名(含类型说明的形式参数表) { 语句序列 } 函数的调用形式 变量在使用之前需...
  • C++:函数指针调用方法

    千次阅读 2019-03-25 17:22:01
    函数指针调用普通函数 #include<iostream> using namespace std; void Show()//void(*)() { cout << "void _cdecl Show()" << endl; } typedef void(*PFUNC)();//类型重定义 函数指针 int ...
  • #include #include int *n() { ...在这个程序中,函数n返回的时候是不是就已经释放了局部变量a?那么我这时候的p是不是就是一个野指针。为什么我在输出语句中还是能输出5。这种做法是不是不安全的。
  • C/C++函数调用约定

    万次阅读 2010-03-10 09:46:00
    C/C++函数调用约定关于 C/C++ 函数调用约定,大多数时候并不会影响程序逻辑,但遇到跨语言编程时,了解一下还是有好处的。VC 中默认调用是 __cdecl 方式,Windows API 使用 __stdcall 调用方式,在 DLL 导出函数中,...
  • 讲叙在嵌入式系统中,在c文件中如何调用c++文件中的函数的方法,并且还着重讲叙了c++文件中编写可以被c文件中调用函数的规则及方法。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 857,017
精华内容 342,806
关键字:

c++函数调用

c++ 订阅
友情链接: gokdgractice.zip