免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4347 | 回复: 8
打印 上一主题 下一主题

[C] 实参类型不完全是什么错?求各位大哥帮忙看下,小弟不胜感激 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-09-17 23:17 |只看该作者 |倒序浏览


源代码部分如下,求各位大哥帮帮忙:
int safeshmctl(int shmid,int cmd,struct shmid_ds *buf);

typedef union semun
{
        int val;
        struct semid_ds *buf;
        ushort array;
};

int main(int argc,char *argv[])
{
        if (argc < 2)
        sever();
        else
        client(atoi(argv[1]));

        return 0;
}

void server (void)
{
        union semun sunion;
        int semid,shmid;
        void *shmdata;
        char *buffer;

        semid = safesemget(IPC_PRIVATE,2,SHM_R|SHM_W);
        deleteSemid = semid;

        atexit(&delete);
        signal(SIGINT,&sigdelete);
       
        sunion.val = 1;
        safesemctl(semid,SN_EMPTY,SETVAL,sunion);
        sunion.val = 0;
        safesemctl(semid,SN_FULL,SETVAL,sunion);
一直报sunion类型不完全,是什么错误

论坛徽章:
0
2 [报告]
发表于 2013-09-17 23:18 |只看该作者
完整的代码如下
#include <sys/types.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <signal.h>

#define SHMDATASIZE 1000
#define BUFFERSIZE (SHMDATASIZE-sizeof(int))
#define SN_EMPTY 0
#define SN_FULL 1

int deleteSemid = 0;

void server(void);
void client(int shmid);
void delete(void);
void sigdelete(int signum);
void locksem(int semid,int semnum);
void unlocksem(int semid,int semnum);
void waitzero(int semid,int semnum);
void clientwrite(int shmid,int semid,char*buffer);

int safesemget(key_t key,int nsems,int semflg);
int safesemctl(int semid,int semnum,int cmd,union semun arg);
int safesemop(int semid,struct sembuf *sops,unsigned nsops);
int safeshmget(key_t key,int size,int shmflg);
int safeshmat(int shmid,const void *shmaddr,int shmflg);
int safeshmctl(int shmid,int cmd,struct shmid_ds *buf);

typedef union semun
{
        int val;
        struct semid_ds *buf;
        ushort array;
};

int main(int argc,char *argv[])
{
        if (argc < 2)
        sever();
        else
        client(atoi(argv[1]));

        return 0;
}

void server (void)
{
        union semun sunion;
        int semid,shmid;
        void *shmdata;
        char *buffer;

        semid = safesemget(IPC_PRIVATE,2,SHM_R|SHM_W);
        deleteSemid = semid;

        atexit(&delete);
        signal(SIGINT,&sigdelete);
       
        sunion.val = 1;
        safesemctl(semid,SN_EMPTY,SETVAL,sunion);
        sunion.val = 0;
        safesemctl(semid,SN_FULL,SETVAL,sunion);

        shmid = safeshmget(IPC_PRIVATE,SHMDATASIZE,IPC_CREAT|SHM_R|SHM_W);
        shmdata = safeshmat(shmid,0,0);
        safeshmctl(shmid,IPC_RMID,NULL);

        *(int*)shmdata = semid;
        buffer = shmdata+sizeof(int);

        printf("Server is running with SHM id **%d**\n",shmid);

        while(1)
        {
                printf("Waiting until full...");
                fflush(stdout);
                locksem(semid,SN_FULL);
                printf("done.\n");
               
                printf("Message received:%s.\n",buffer);
                unlocksem(semid,SN_EMPTY);
        }
}

void client(int shmid)
{
        int semid;
        void *shmdata;
        char *buffer;
        shmdata = safeshmat(shmid,0,0);

        semid = *(int*)shmdata;
        buffer = shmdata-sizeof(int);

        printf("Client operational;shm id is %d,sem id is %d\n",shmid ,semid);
        while(1)
        {
                char input[3];
                printf("\n\nMenu\n1.Send a message|n");
                printf("2.Exit\n");
       
                fgets(input,sizeof(input),stdin);
                switch(input[0])
                {
                        case'1':
                        clientwrite(shmid,semid,buffer);
                        break;
                        case'2':
                        exit(0);
                        break;       
                }
        }
}

void delete(void)
{
        printf("\nMaster exiting;deleting semaphore %d. \n",deleteSemid);
        if (semctl(deleteSemid,0,IPC_RMID,0) == -1)
                printf("Error releasing semaphore.\n");
}

void sigdelete(int signum)
{
        exit(0);
}
void locksem(int semid,int semnum)
{
        struct sembuf sd;
        sd.sem_num = semnum;
        sd.sem_op = -1;
        sd.sem_flg = SEM_UNDO;

        safesemop(semid,&sd,1);
}

void unlocksem(int semid,int semnum)
{
        struct sembuf sd;
        sd.sem_num = semnum;
        sd.sem_op = 1;
        sd.sem_flg = SEM_UNDO;

        safesemop(semid,&sd,1);
}

void waitzero(int semid,int semnum)
{
        struct sembuf sd;

        sd.sem_num = semnum;
        sd.sem_op = 0;
        sd.sem_flg = 0;

        safesemop(semid,&sd,1);
}


void clientwrite(int shmid,int semid,char *buffer)
{
        printf("Waiting until empty...");
        fflush(stdout);
        locksem(semid,SN_EMPTY);
        printf("done.\n");

        printf("Enter Message:");
        fgets(buffer,BUFFERSIZE,stdin);
        unlocksem(semid,SN_FULL);
}

int safesemget(key_t key,int nsem,int semflg)
{
        int retval;
        if (retval = semget(key,nsem,semflg) == -1)
        {
                printf("semget error:%s.\n",sys_errlist[errno]);
                exit(254);
        }
        return retval;
}

int safesemop(int semid,struct sembuf *sops,unsigned nsops)
{
        int retval;
        if (retval = semop(semid,sops,nsops) == -1)
        {
                printf("semop error:%s.\n",sys_errlist[errno]);
                exit(254);
        }
        return retval;
}

int safeshmget(key_t key,int size,int shmflg)
{
        int retval;
        if (retval = shmget(key,size,shmflg) == -1)
        {
                printf("shmget error:%s.\n",sys_errlist[errno]);
                exit(254);
        }
        return retval;
}

int safeshmat(int shmid,const void *shmaddr,int shmflg)
{
        int retval;
        if ((retval = shmat(shmid,shmaddr,shmflg))== -1)
        {
                printf("shmat error:%s.\n",sys_errlist[errno]);
                exit(254);
        }
        return retval;
}

int safeshmctl(int shmid,int cmd,struct shmid_ds *buf)
{
        int retval;
        if (retval = shmctl(shmid,cmd,buf) == -1)
        {
                printf("shmctl error:%s.\n",sys_errlist[errno]);
                exit(254);
        }
return retval;
}

论坛徽章:
0
3 [报告]
发表于 2013-09-17 23:21 |只看该作者
小弟第一次发求助帖 不完整 请见谅 第64和66行是
server函数中的
         safesemctl(semid,SN_EMPTY,SETVAL,sunion);
   
         safesemctl(semid,SN_FULL,SETVAL,sunion);
有点乱

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
4 [报告]
发表于 2013-09-18 00:36 |只看该作者
回复 2# sfwang915
  1. int safesemctl(int semid,int semnum,int cmd,union semun arg);
复制代码
之前union semun未声明

   

论坛徽章:
0
5 [报告]
发表于 2013-09-18 09:06 |只看该作者
sfwang915 发表于 2013-09-17 23:17
源代码部分如下,求各位大哥帮帮忙:
int safeshmctl(int shmid,int cmd,struct shmid_ds *buf);


typedef union semun
{
        int val;
        struct semid_ds *buf;
        ushort array;
};

建议看看typedef的用法。

论坛徽章:
0
6 [报告]
发表于 2013-09-18 20:27 |只看该作者
回复 5# wnd1024


  非常感谢

论坛徽章:
0
7 [报告]
发表于 2013-09-18 20:28 |只看该作者
回复 4# 井蛙夏虫

非常感谢
   

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
8 [报告]
发表于 2013-09-18 23:16 |只看该作者
typedef union semun
{
        int val;
        struct semid_ds *buf;
        ushort array;
};

论坛徽章:
0
9 [报告]
发表于 2013-09-19 00:20 |只看该作者
非常感谢大家,这个错误是我自己打代码的时候,出现了错误,已经发现了,谢谢大家的解答。以后会避免这样低级的错误发出来,浪费大家的时间,非常不好意思。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP