奇怪的指针定义指针?
int delete_file(dirname, size, ent, filecheck)
char *dirname;
int size, ent;
int (*filecheck) ();
{
............
if ((*filecheck) (abuf)) {
...............
(*filecheck)();在里面起到什么作用,IF那一行是什么意思?
请多指教。
谢谢
问题点数:100、回复次数:15Top
1 楼cwanter(亚玛逊河上的渔夫)回复于 2002-11-21 19:30:30 得分 0
int (*filecheck) ();
指向函数的指针:返回值为int类型,参数为空。
if ((*filecheck) (abuf)) {
能行吗,恐怕编译不过。Top
2 楼lebor(光速思维)回复于 2002-11-21 19:34:05 得分 0
忘记了,其中还有一行
char *abuf;
Top
3 楼cwanter(亚玛逊河上的渔夫)回复于 2002-11-21 19:56:39 得分 0
我觉得你的函数指针声明和使用不一致。Top
4 楼lebor(光速思维)回复于 2002-11-21 20:01:51 得分 0
int delete_file(dirname, size, ent, filecheck)
char *dirname;
int size, ent;
int (*filecheck) ();
{
char abuf[BUFSIZE];
int fd;
struct stat st;
long numents;
if (size > BUFSIZE) {
toobigmesg();
return -1;
}
if ((fd = open(dirname, O_RDWR)) == -1) return -1;
flock(fd, LOCK_EX);
fstat(fd, &st);
numents = ((long) st.st_size) / size;
if (((long) st.st_size) % size != 0) report("align err\n");
if (lseek(fd, (off_t) (size * (ent - 1)), SEEK_SET) != -1) {
if (read(fd, abuf, size) == size) {
if ((*filecheck) (abuf)) {
int i;
for (i = ent; i < numents; i++) {
if (lseek(fd, (off_t) (i * size), SEEK_SET) == -1) break;
if (read(fd, abuf, size) != size) break;
if (lseek(fd, (off_t) ((i - 1) * size), SEEK_SET) == -1) break;
if (safewrite(fd, abuf, size) != size) break;
}
ftruncate(fd, (off_t) size * (numents - 1));
flock(fd, LOCK_UN);
close(fd);
return 0;
}
}
}
lseek(fd, 0, SEEK_SET);
ent = 0;
while (read(fd, abuf, size) == size) {
if ((*filecheck) (abuf)) {
int i;
for (i = ent; i < numents; i++) {
if (lseek(fd, (off_t) ((i + 1) * size), SEEK_SET) == -1) break;
if (read(fd, abuf, size) != size) break;
if (lseek(fd, (off_t) (i * size), SEEK_SET) == -1) break;
if (safewrite(fd, abuf, size) != size) break;
}
ftruncate(fd, (off_t) size * (numents - 1));
flock(fd, LOCK_UN);
close(fd);
return 0;
}
ent++;
}
flock(fd, LOCK_UN);
close(fd);
return -1;
}
完整的,通过编译的Top
5 楼sjsj(虚怀若谷)回复于 2002-11-21 20:24:53 得分 5
int (*filecheck) ();定义了一个函数指针filecheck
调用这个函数的时候只要(*filecheck)()就可以了,但是看了你的代码,我觉得函数声明的时候应该包含一个参数Top
6 楼xspf()回复于 2002-11-21 20:29:52 得分 0
我觉得应该通不过编译的,不知道你用的是什么编译器Top
7 楼alphapaopao(炮炮)回复于 2002-11-21 20:38:10 得分 0
这种函数头部恐怕不能被现代的编译器接受,需要修改一下Top
8 楼lebor(光速思维)回复于 2002-11-22 08:23:59 得分 0
这是FB2000的原代码,gcc编译通过的。
Top
9 楼NetBird_China(沉默的刀客)回复于 2002-11-22 08:43:41 得分 0
不明白gcc如何编译Top
10 楼zhengguoshan(坚持-决不放弃)回复于 2002-11-22 08:44:57 得分 5
int (*filecheck) ();定义了一个函数指针filechec
你给它,赋值了吗??Top
11 楼quickball()回复于 2002-11-22 08:58:36 得分 10
int (*filecheck) ();
filecheck是指向函数的指针。if一行是在判断函数的返回值。Top
12 楼yimanet(网际飞蚁)回复于 2002-11-22 09:30:16 得分 5
int (*filecheck) ();
一个返回值是int,无参数的函数指针。
if ((*filecheck) (abuf)) 是判断该函数的返回值,
但是你的定义和调用不一样我在C++BUILDER5和VC++6中编译通不过。Top
13 楼dsangvei(十年一剑)回复于 2002-11-22 09:45:43 得分 5
int (*filecheck) (char*);
可以这样申明
Top
14 楼xspf()回复于 2002-11-25 19:44:59 得分 50
int (*filecheck) ();//定义了一个指向函数的指针filecheck
可以用if ((*filecheck) (abuf)) ,但前提是必须把参数为char*的函数的入口地址赋给filecheck,楼主的代码没有给全,filecheck没有被赋值
Top
15 楼Louis819()回复于 2002-11-25 20:08:19 得分 20
我感觉没有问题,filecheck是函数指针,作为参数使用。需要在主程序中对filecheck进行赋值。Top




