Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于IOS Objective-C,如何在.m文件中调用C文件的函数?_Ios_Objective C - Fatal编程技术网

对于IOS Objective-C,如何在.m文件中调用C文件的函数?

对于IOS Objective-C,如何在.m文件中调用C文件的函数?,ios,objective-c,Ios,Objective C,在新的Objective-C项目中,它创建文件ViewController.m 我将C文件和头文件的另一个源代码添加到此Objective-C项目 如果C文件中的函数如下所示: int dump(addr) { //function code } 我将按钮添加到ViewController.m中,如下代码所示 - (IBAction)showclient:(id)sender { //How to call the function in C file here ? } 如何

在新的
Objective-C项目中
,它创建文件
ViewController.m

我将
C文件
头文件
的另一个源代码添加到此
Objective-C项目

如果
C文件中的函数如下所示:

int dump(addr)
{
   //function code
}
我将
按钮添加到
ViewController.m
中,如下代码所示

- (IBAction)showclient:(id)sender {
    //How to call the function in C file here ? 
}
如何在按下
按钮后调用
ViewController.m
中的
转储功能

-----------------------------------编辑--------------------------------

我想在
.m文件中调用的函数
/*
*转储整个arp表
*/
int
转储(地址)
乌龙地址;
{
int-mib[6];
所需尺寸;
char*host、*lim、*buf、*next;
结构rt_msghdr*rtm;
结构sockaddr_inarp*sin;
结构sockaddr_dl*sdl;
外部内部h_errno;
结构主机*hp;
int found_entry=0

    mib[0] = CTL_NET;
    mib[1] = PF_ROUTE;
    mib[2] = 0;
    mib[3] = AF_INET;
    mib[4] = NET_RT_FLAGS;
    mib[5] = RTF_LLINFO;
    if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0)
        err(1, "route-sysctl-estimate");
    if ((buf = malloc(needed)) == NULL)
        err(1, "malloc");
    if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0)
        err(1, "actual retrieval of routing table");
    lim = buf + needed;
    for (next = buf; next < lim; next += rtm->rtm_msglen) {
        rtm = (struct rt_msghdr *)next;
        sin = (struct sockaddr_inarp *)(rtm + 1);
        sdl = (struct sockaddr_dl *)(sin + 1);
        if (addr) {
            if (addr != sin->sin_addr.s_addr)
                continue;
            found_entry = 1;
        }
        if (nflag == 0)
            hp = gethostbyaddr((caddr_t)&(sin->sin_addr),
                sizeof sin->sin_addr, AF_INET);
        else
            hp = 0;
        if (hp)
            host = hp->h_name;
        else {
            host = "?";
            if (h_errno == TRY_AGAIN)
                nflag = 1;
        }
        printf("%s (%s) at ", host, inet_ntoa(sin->sin_addr));
        if (sdl->sdl_alen)
            ether_print((u_char *)LLADDR(sdl));
        else
            printf("(incomplete)");
        if (rtm->rtm_rmx.rmx_expire == 0)
            printf(" permanent");
        if (sin->sin_other & SIN_PROXY)
            printf(" published (proxy only)");
        if (rtm->rtm_addrs & RTA_NETMASK) {
            sin = (struct sockaddr_inarp *)
                (sdl->sdl_len + (char *)sdl);
            if (sin->sin_addr.s_addr == 0xffffffff)
                printf(" published");
            if (sin->sin_len != 8)
                printf("(weird)");
        }
        printf("\n");
    }
    return (found_entry);
}
mib[0]=CTL\u NET;
mib[1]=PF_路由;
mib[2]=0;
mib[3]=AF_INET;
mib[4]=净放射性标志;
mib[5]=RTF_linfo;
if(sysctl(mib,6,NULL,&needed,NULL,0)<0)
err(1,“路由系统控制权估计”);
if((buf=malloc(需要))==NULL)
错误(1,“malloc”);
if(sysctl(mib,6,buf,&needed,NULL,0)<0)
err(1,“路由表的实际检索”);
lim=需要的buf+;
对于(next=buf;nextrtm\m格伦){
rtm=(struct rt_msghdr*)next;
sin=(结构sockaddr_inarp*)(rtm+1);
sdl=(结构sockaddr_dl*)(sin+1);
如果(地址){
if(addr!=sin->sin\u addr.s\u addr)
继续;
找到的_条目=1;
}
如果(nflag==0)
hp=gethostbyaddr((caddr__t)和(sin->sin_addr),
sizeof sin->sin地址,AF INET);
其他的
hp=0;
如果(hp)
主机=hp->h_名称;
否则{
host=“?”;
如果(h_errno==重试)
nflag=1;
}
printf(“%s(%s)at”,主机,inet_ntoa(sin->sin_addr));
如果(sdl->sdl\u alen)
以太打印((u_char*)LLADDR(sdl));
其他的
printf(“(不完整)”);
如果(rtm->rtm\u rmx.rmx\u expire==0)
printf(“永久”);
if(sin->sin\u其他&sin\u代理)
printf(“已发布(仅限代理)”;
if(rtm->rtm地址和RTA网络掩码){
sin=(结构sockaddr\u inarp*)
(sdl->sdl_len+(字符*)sdl);
如果(sin->sin\u addr.s\u addr==0xFFFFFF)
printf(“已出版”);
如果(sin->sin_len!=8)
printf(“(怪异)”);
}
printf(“\n”);
}
返回(找到输入项);
}
  • #在您的
    ViewController.m
  • 像普通的C--
    函数(参数)一样调用它

  • (3.友好的建议:买一本关于C的书)

    你可以像在普通C中一样简单地使用它。你只需要在obj-C类中导入头文件。你的意思是我需要导入
    C文件的头文件
    ,然后我就可以使用
    .m文件
    中的功能了?我觉得你的C文件坏了。。。语法错误与在
    ansic
    中调用标准
    C
    函数的方式完全相同。参数声明的Kernighan-Ritchie风格让人困惑,尽管它仍然是有效的C语法。然而,这让我怀疑dump是否仍然有用。也许你应该扔掉这些废话?语法很古老但合法。搜索Kernighan-Ritchie风格。@Martin,语言Objective-C是在编辑完成后在ANSI C上的一薄层。在此之前,它甚至没有编译为me@Daij-Djan原来的
    dump
    函数是正确的C语言,编译得很好。编辑后,参数类型丢失。@NikolaiRuhe我试过了,但似乎我试过了。。注意:D代码确实很好-谢谢