内部函数其它文件不能c语言中调用什么函数来关闭文件,请大神改为外部函数

打印时调用外部函数错误
打印时系统提示Error&calling&external&object&function&read&怎么办
10-10-29 &
建议重新安装打印机驱动
请登录后再发表评论!接纳自己,提升认知,拥抱不确定性。
C语言一个文件中的函数能直接调用另外一个文件中的静态函数吗? (某公司校园招聘面试试题)
我当时是这么答的: 不能直接调用。
面试官问: 为什么?那有别的办法调用吗?
我:......
下面,我们来简要探讨一下。 显然不能直接调用, 但为什么呢? 因为main.c文件没法获取test.c文件中print函数的地址, 找到不到地址, 当然无从调用起。那么如果获取到了print的地址呢? 我们来看看:
#include &stdio.h&
#include "test.h"
typedef void (*PFUN)();
int main()
int addr = getAddr();
((PFUN)addr)();
#include &stdio.h&
#include "test.h"
static void print()
printf("hello\n");
int getAddr()
return (int)
static void print();
int getAddr();
当然, 还有更简单的方法, 直接在test.c中定义另外一个非静态函数func, 然后这个函数调用静态的print, 而main.c中的main又来调用func.
要说明的是, 在实际的开发中, 函数前面的static本来就是要限制被文件外的函数调用, 所以上述面试中的需求并不常见, 但是, 作为面试题, 还是可以问问的。
一句话: static函数的函数名(地址)在其他文件中是不可见的, 无法直接调用。但是, 有歪门邪道的方法来调用:让文件中的其他函数来暴露(出卖)这个地址。
原来, 最坚强的堡垒总是从内部攻破的。
没有更多推荐了,雷速体育发帖软件开发QQ
欢迎加入我们,一同切磋技术 &
用户名: &&&
密 码: &
共有 4037 人关注过本帖
标题:C语言
可不可以在被调用的子函数中生成文本文件,然后在主函数中打开生成 ...
等 级:新手上路
&&已结贴√
&&问题点数:20&&回复次数:10&&&
可不可以在被调用的子函数中生成文本文件,然后在主函数中打开生成的文本文件读取数据
各位老师,大家好!我现在想请问一个问题!
C语言中&&&可不可以在被调用的子函数中生成一个文本文件,(子函数没有输入变量,也没有输出变量,仅仅写了一个文本文件)
然后在主函数中打开子函数中生成的文本文件读取数据!这样可不可以行得通呢?
搜索更多相关主题的帖子:
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
授人以渔,不授人以鱼。
等 级:职业侠客
帖 子:191
专家分:337
这个不是问题啊
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
有小小问题,但不是大问题,外部函数如何知道子函数使用的文件名及其位置,在不允许传入传出的情况下,只能使用全局变量或常量,这样有瑕疵,但属于“可以”。归根结底是那个不允许传入传出需求造成的,是应该考虑为什么要做这样的需求,这个问题就不小了。
授人以渔,不授人以鱼。
等 级:新手上路
显然可以啊.
等 级:新手上路
回复 4楼 TonyDeng
我举一个简单的例子,请您看一下这个程序错误在那里!
#include &stdio.h&
#include &stdlib.h&
#include &math.h&
#include &malloc.h&
#include &string.h&
void wdata()
&&& FILE *fp_create_well_
&&& float den[4][4];
&&& fp_create_well_info=fopen(&create_well_info.txt&,&w&);
&&& int i,j;
&&& for(i=0;i&4;i++)
&&&&&&&&for(j=0;j&4;j++)
&&&&&&&&&&&&den[i][j]=1;
&&& for(i=0;i&4;i++)
&&&&&&&&for(j=0;j&4;j++)
&&&&&&&&&&&&fprintf(fp_create_well_info,&%f &,den[i][j]);
&&& fclose(fp_create_well_info);
&&& printf(&\n*************The get_well_log() end**************\n&);
void main()
&&& float a[4][4];
&&& int i,j;
&&& wdata();
&&& FILE *fp_create_well_info=fopen(&create_well_info.txt&,&r&);
&&& for(i=0;i&4;i++)
&&&&&&&&for(j=0;j&4;j++)
&&&&&&&&&&&&fscanf(fp_create_well_info,&%f &,&a[i][j]);
&&& fclose(fp_create_well_info);
&&& for(i=0;i&4;i++)
&&&&&&&&for(j=0;j&4;j++)
&&&&&&&&&&&&printf(&%f\n&,a[i][j]);
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
你出什么现象了?
授人以渔,不授人以鱼。
等 级:新手上路
等 级:新手上路
回复 7楼 TonyDeng
#include &stdio.h&
#include &stdlib.h&
#include &math.h&
#include &malloc.h&
#include &string.h&
void wdata()
&&& FILE *fp_create_well_
&&& float den[4][4];
&&& fp_create_well_info=fopen(&create_well_info.txt&,&w&);
&&& int i,j;
&&& for(i=0;i&4;i++)
&&&&&&&&for(j=0;j&4;j++)
&&&&&&&&&&&&den[i][j]=1;
&&& for(i=0;i&4;i++)
&&&&&&&&for(j=0;j&4;j++)
&&&&&&&&&&&&fprintf(fp_create_well_info,&%f &,den[i][j]);
&&& fclose(fp_create_well_info);
&&& printf(&\n*************The get_well_log() end**************\n&);
void main()
&&& float a[4][4];
&&& int i,j;
&&& FILE *fp_create_well_
&&& wdata();
&&& fp_create_well_info=fopen(&create_well_info.txt&,&r&);
&&& for(i=0;i&4;i++)
&&&&&&&&for(j=0;j&4;j++)
&&&&&&&&&&&&fscanf(fp_create_well_info,&%f &,&a[i][j]);
&&& fclose(fp_create_well_info);
&&& for(i=0;i&4;i++)
&&&&&&&&for(j=0;j&4;j++)
&&&&&&&&&&&&printf(&%f\n&,a[i][j]);
我又修改了一下,请您过目!您可以试运行一下,我在VC++6.0下运行出现错误:
&wdata函数中的错误error C2143: syntax error : missing ';' before 'type'
&&&&&&&&&&&&&&&&&&error C2065: 'i' : undeclared identifier
&&&&&&&&&&&&&&&&&&error C2065: 'j' : undeclared identifier
但是在DEV-C++5环境下运行没有错误!
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
你用了.c做文件扩展名?int i,j定义在执行语句之后了,旧式C语法不允许。要么把它提到前面去,要么把文件扩展名改回.cpp,用.c干什么呢,读书不要那么死板啊。
授人以渔,不授人以鱼。
版权所有,并保留所有权利。
Powered by , Processed in 0.045548 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved 上传我的文档
 上传文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
【精品】第09章
变量的存储类型和动态分配内存
下载积分:700
内容提示:【精品】第09章
变量的存储类型和动态分配内存
文档格式:PPT|
浏览次数:1|
上传日期: 08:00:34|
文档星级:
全文阅读已结束,如果下载本文需要使用
 700 积分
下载此文档
该用户还上传了这些文档
【精品】第09章
变量的存储类型和动态分配内存
关注微信公众号c语言环境下如何创建一个外部函数
我自己在学习c语言中的一些小总结,对c语言刚入门的人有些帮助
c语言环境下如何创建一个外部函数
1.首先确定要创建一个满足什么条件的函数;
2.按照格式写出主函数(作用:测试外部函数)
int main()
int i = 0;
int arr[] = { 1,22,12,4,5,6,7,8,9};
int sz = sizeof(arr) / sizeof(arr[0]);
exchange(arr,sz);////完成要求的函数,功能“将奇数转换到前面偶数放到后面”
for (i = 0; i & i++)
printf("%d ", arr[i]);
3.编写满足要求的函数
exchange(arr,sz);
(1)分析函数所需的功能,捋清编程思路:
我们可以从两边开始找,从左边第一个数开始向右找偶数,从右边第一个数开始找奇数;
然后将左边的偶数与右边的奇数互换;到此就完成了一次互换,交换了一组奇偶数;
我们在此可以加一个while循环就可以完成所有奇偶数的互换了。
参数设置:
先求出元素个数 :int sz=sizeof(arr)/sizeof(arr[0]);
左端第一个数的地址:int *left=arr;
右端第一个数的地址:int *right=arr+sz-1;
循环的限制条件:while(left&right);
(2)函数代码:
void exchange(int *arr, int sz)
int *left =
int *right = arr + sz - 1;
while (left & right)
while ((*left) % 2 == 1)
while ((*right) % 2 == 0)
if (left & right)
int ret = *
}4.函数与主函数组合的完整代码:
#include&stdio.h&
void exchange(int *arr, int sz)
int *left =
int *right = arr + sz - 1;
while (left & right)
while ((*left) % 2 == 1)
while ((*right) % 2 == 0)
if (left & right)
int ret = *
int main()
int i = 0;
int arr[] = { 1,22,12,4,5,6,7,8,9};
int sz = sizeof(arr) / sizeof(arr[0]);
exchange(arr,sz);
for (i = 0; i & i++)
printf("%d ", arr[i]);
}注:如果主函数
int main()放在前面,需要对函数声明
#include&stdio.h&
int main()
void exchange(int *arr,int sz);
int i = 0;
int arr[] = { 1,22,12,4,5,6,7,8,9};
int sz = sizeof(arr) / sizeof(arr[0]);
exchange(arr,sz);
for (i = 0; i & i++)
printf("%d ", arr[i]);
void exchange(int *arr, int sz)
int *left =
int *right = arr + sz - 1;
while (left & right)
while ((*left) % 2 == 1)
while ((*right) % 2 == 0)
if (left & right)
int ret = *
没有更多推荐了,

我要回帖

更多关于 如何调用m文件的函数 的文章

 

随机推荐