对于对文件联合输出的参考
在函数这一节MJ老师建了一个文件夹在里面向我们展示了多文件联合开发,
注意点:
1.函数的定义放.c文件,函数的声明放.h文件
2.如果要使用某个.c文件中定义的函数,只需要#include这个.c文件对应的.h文件(<stdio.h>是系统自带的用尖括号,自己建立的就要用引号)
3..h文件的作用:被别人拷贝。编译链接的时候不需要管.h文件
4.cc xx.o xxx.o将多个目标文件链接在一起
ccxx.c xxx.c 将多个源文件编译、链接
仔细试了老师的做法后 我尝试了用三个文件联合开发
主要思想:用one.c编写主函数 two.c编写计算的算法 three.c编写输入输出函数。这样写与MJ老师的不同是 他是直接给程序赋值两个分数,我的是让用户输入两个分数的。而且把输入输出都写在了three.c 这样主函数就不用管输入输出的算法,也就可以让主函数不包含#include<stdio.h>了。二号和三号的声明文件放在two.h和three.h。主函数只需要包含这两个。
下面是各文件代码
one.c
/*
用三个人的文件联合成一个程序,为的是彻底思路清晰,以后多文件联合不会懵
这样写只有三号文件需要#include<stdio.h>,一号文件(主函数)只需要引用two.h three.h
*/
#include "two.h"
#include "three.h"
int score1 =0,score2 = 0,c =0,d = 0; // c存放总分d存放平均分
int main()
{
into(&score1,&score2); // 用三号文件里的录入函数给用户提示并录入数据
c = sum(score1,score2); // 然后用二号文件里的计算函数计算
d = average(score1,score2);
outto(c,d); // 然后用三号文件里的输出函数把最后答案输出
return 0;
}
two.c
int sum(int x ,int y) // 求和函数
{
return x + y;
}
int average(int a,int b) // 求平均函数
{
return (a + b) / 2;
}
three.c
#include <stdio.h> // 只有三号文件才有输入输出只有这个才包含
void into(int *a,int *b ) // 设置两个指针
{
printf("请输入两门课的分数:\n");
scanf("%d %d",a ,b ); // 因为前面传的就是地址,所以这里就是a和b
}
void outto(int x,int y)
{
printf("两门课的总分是%d平均分是%d\n",x,y); // 输出
}
two.h
#ifndef TWO_H
#define TWO_H
int sum(int x,int y);
int average(int a,int b);
#endif
因为写这篇日志的时候已经学到预处理命令这了,所以顺便把防止重复导入的宏定义加上了。
three.h
#ifndef THREE_H
#define THREE_H
void into(int *a ,int *b);
void outto(int x,int y );
#endif
运行结果
期间遇到的问题:
虽然最终还是运行成功但是其中还是遇到了一些问题。
1. 一开始是把score1和score2定义在main函数里面的因为这个不是在一个主函数里完事的所以后面出现了错误提示无法调用函数,所以就把score1和score2直接拉到了外面成为全局变量,这样就可以访问了。
2. 因为把分数录入放到了第二个文件,所以单纯的实参形参值传递改不了原本score1和score2的值。在全局变量定义的时候是把两个值都初始化了为0.运行之后平均分总分都是0. 然后就想到了用指针使用地址传递&score1那边的形参定义指针类型,然后下面直接接收地址,之后程序就调试成功无警告无错误顺利运行了。
3. 中间还犯了比较低级的错误就是在调试的时候把函数定义的形参改了类型但是声明里面的忘了改,然后就出现了警告直接运行就是程序崩溃
Segmentation fault: 11
正好当时还没网不能查错误,仔细看提示哪个文件第几行才找到了病根。以后这些粗心错误也真是需要坚决制止,为了这种低级错误浪费时间太不值得了。