C语言实现函数调用的三种方法

C语言实现函数调用的三种方法

  • 1 第一种方法
  • 2 第二种方法
    • 2.1 main函数
    • 2.2 子函数
  • 3 第三种方法
    • 3.1 主函数
    • 3.2 子函数源文件
    • 3.3 子函数头文件
  • 4 结果
  • 5 返回多个参数(结构体)
    • 5.1 main函数
    • 5.1 子函数源文件
    • 5.3 子函数头文件

1 第一种方法

在一个.c文件里面进行子函数调用
step1:函数声明
step2:mian函数
step3:子函数

/********************************
          数组元素之和

   法一:  子函数调用
**********************************/
#include


#define M 10   // 数组元素个数
int num[M]={1,2,3,4,5,6,7,8,9,10};


/********************************
            函数声明
**********************************/
int sum(int * start, int * end);



/********************************
            main函数
**********************************/
int main(void)
{
	long answer;
	answer=sum(num,num+M);
	printf("The total number is %ld.\n",answer);
	return 0;
}




/********************************
            子函数
**********************************/
int sum(int * i, int * end)
{
	int total=0;
	while(i<end)
	{
	total+=*i;// 把数组元素的值加起来
	i++;  // 让指针指向下一个元素
	}
	return total;
}

2 第二种方法

调用外部的C文件

2.1 main函数

/********************************
          数组元素之和

 不需要.h文件,直接调用外部函数的方法
**********************************/


#include
#include "D:\mwq\LAB\z7\ARM\VC\extern_get_c_file_v2\sum.c"//调用外部函数   路径+外部函数名


#define M 10   // 数组元素个数
int num[M]={1,2,3,4,5,6,7,8,9,10};


/********************************
            main函数
**********************************/
int main(void)
{
	long answer;
	answer=sum(num,num+M);//调用求和函数
	printf("The total number is %d.\n",answer);
	return 0;
}



2.2 子函数


#include


/********************************
 函数功能:求和
 输入参数:素组的首尾地址
 输出参数:素组所有元素之和
**********************************/
int sum(int * i, int * end)
{
	int total=0;
	while(i<end)
	{
	total+=*i;// 把数组元素的值加起来
	i++;  // 让指针指向下一个元素
	}
	return total;
}

3 第三种方法

注:这种方法的实现平台为SDK,但思想一样。
一个main.c 。
子函数源文件用sum.c 表示;子函数头文件用 sum.h表示。
有几个子函数就有几个sum.c 和 sum.h

3.1 主函数

#include 
#include "platform.h"
#include "xil_printf.h"
#include "sleep.h"
#include "sum.h"


#define M 10
int answer;


int main()
{

    init_platform();

    print("Hello World\n\r");
    print("you are my book\n\r");


	answer=sum(M);//调用求和函数
	printf("The total number is %d.\n",answer);

    cleanup_platform();
    return 0;

}

3.2 子函数源文件

#include
#include"sum.h"

/********************************
 函数功能:求和
 输入参数:素组的首尾地址
 输出参数:素组所有元素之和
**********************************/
int sum(int N)
{
	int i;
	int total=0;
	for(i=0;i<=N;i++)
	{
		total=total+i;// 把数组元素的值加起来
	}
	return total;
}

3.3 子函数头文件

#ifndef SUM_H
#define SUM_H

int sum(int N);// 子函数

#endif

4 结果

在这里插入图片描述

5 返回多个参数(结构体)

5.1 main函数

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include



#include "Multiple_Beam_send_func.h" // 多波束发射的头文件



/*
工作模式说明
% mode = 0:相控阵接收模式

% mode = 1:空域抗干扰模式(LMS)
% mode = 2:空时抗干扰模式(LMS)

% mode = 3:空域抗干扰模式(DMI)
% mode = 4:空时抗干扰模式(DMI)

% mode = 5:相控阵发射模式
*/


//      输入参数
#define mode        5         // 工作模式

#define T			1         // 信源数(波束个数)
#define S			4         // 阵元数
#define B			320       // 信号总带宽,单位是MHz
#define fs			250       // 采样率,单位是MHz
#define f_clk		250		  // 系统钟,单位是MHz
#define flag		0		  // 乘法器是否复用   如果乘法器复用,则flag = 1;如果乘法器不复用,则flag = 0。
#define N			89        // 多相滤波器(低通滤波器)的阶数
#define W			16        // 信号位宽   16bit / 32bit,需为16的倍数。
#define IQ_slect	0		  // IQ_slect = 1:全部用复信号处理; IQ_slect = 0:尽量用实信号处理。
#define s_p			1         // 阵元权值串行计算,则s_p = 1;如果阵元权值并行计算,则s_p = 0。
#define H			50        // 希尔伯特滤波器的阶数
#define J			1         // 空时滤波阶数





int main()
{
	double DSP_est=0, DDS_est=0;
	source_struct ZiYuan;



	ZiYuan = Multiple_Beam_send_func(S, s_p, flag);
	DSP_est = ZiYuan.sum_DSP;// 得到第1个返回值
	DDS_est = ZiYuan.sum_DDS; // 得到第2个返回值

	printf("DSP_est is %.0f \n\r", DSP_est);
	printf("DDS_est is %.0f \n\r", DDS_est);



	system("pause");
	return 0;

}






5.1 子函数源文件

#include
#include"Multiple_Beam_send_func.h"

/********************************
函数功能:多波束发射的资源估计
**********************************/



source_struct Multiple_Beam_send_func(int S, int s_p, int flag)
{


	//变量声明
	source_struct ZiYuan;


	double Comp_mul_1 = 0;
	double Real_mul_1 = 0;
	double DDS_1 = 0;

	double Comp_mul_2 = 0;
	double Real_mul_2 = 0;
	double DDS_2 = 0;

	double Comp_mul_3 = 0;
	double Real_mul_3 = 0;
	double DDS_3 = 0;

	double Comp_mul_4 = 0;
	double Real_mul_4 = 0;
	double DDS_4 = 0;

	double sum_Comp_mul = 0;
	double sum_Real_mul = 0;

	double sum_DSP_Esti = 0;
	double sum_DDS_Esti = 0;


	// step 1:参考阵元信号生成模块
	Comp_mul_1 = 0;     // 复数乘法器个数
	Real_mul_1 = 0;     // 实数乘法器个数
	DDS_1 = 1;          // DDS个数


	//  step 2:权值计算模块
	if (s_p == 0) // 阵元权值串行计算,则s_p = 1;如果阵元权值并行计算,则s_p = 0。
	{
		Comp_mul_2 = 0;         // 复数乘法器个数
		Real_mul_2 = 3 * S;     // 实数乘法器个数
		DDS_2 = 3 * S;          // DDS个数
	}
	else
	{ 
		Comp_mul_2 = 0;       // 复数乘法器个数
		Real_mul_2 = 3;       // 实数乘法器个数
		DDS_2 = 3;            // DDS个数
	}


	//  step 3:加权求和模块
	if (flag == 0) // 如果乘法器复用,则flag = 1;如果乘法器不复用,则flag = 0。
	{ 
		Comp_mul_3 = 0;
		Real_mul_3 = 2 * S;
		DDS_3 = 0;
	}
	else
	{
		Comp_mul_3 = 0;
		Real_mul_3 = S;
		DDS_3 = 0;
	}


	// step 4:总资源计算
	sum_Comp_mul = Comp_mul_1 + Comp_mul_2 + Comp_mul_3; // 复数乘法器个数
	sum_Real_mul = Real_mul_1 + Real_mul_2 + Real_mul_3; // 实数乘法器个数


	sum_DSP_Esti = sum_Comp_mul * 3 + sum_Real_mul * 1;        // DSP资源消耗
	sum_DDS_Esti = DDS_1 + DDS_2 + DDS_3;                      // DDS个数



	// test-- - 具体实例的计算公式(2.5)
	//R_Mul_DSP_M = 3 + 2 * S;  % 多波束接收的乘法器资源
	//fprintf('example_DSP=%g\n', R_Mul_DSP_M);
	//fprintf('\n');

	ZiYuan.sum_DSP = sum_DSP_Esti;
	ZiYuan.sum_DDS = sum_DDS_Esti;

	return ZiYuan;

}


5.3 子函数头文件

#pragma once
#ifndef _MUlTIPLE_BEAM_SEND_FUNC_H
#define _MUlTIPLE_BEAM_SEND_FUNC_H


// 定义一个结构体,用来返回子函数的多个参数
typedef   struct//结构体
{
	double   sum_DSP;
	double   sum_DDS;
}source_struct;// 声明了一个结构体 angle_struct





// 函数调用
source_struct Multiple_Beam_send_func(int S, int s_p, int flag);



#endif


你可能感兴趣的:(C,c++)