鱼C论坛

 找回密码
 立即注册
查看: 4178|回复: 4

[已解决]斗地主洗牌 返回值、类型对应问题很懵逼

[复制链接]
发表于 2022-4-19 23:39:11 | 显示全部楼层 |阅读模式
40鱼币
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int *xipai(int a[3][18])
{
        int (*p)[3][18]=&a;// 用于修改数组a中的值
        int i,j,m,n;
        int t;
        int s=100;
        int count=-1;// 后面用来与i比较,作为判断条件。因为是与i比较,所以初始化为-1。

        for(i=0; i<3; i++)// 为每一个a中的元素赋值
        {
                srand(s++);
                for(j=0; j<18; j++)
                {
                        t = rand()%54+1;// 用中间变量t存储获得的随机数
                        for(m=i; m>=0; m--)// 靠n的值来判断随机数是否与之前获得的所有>    随机数都不相同
                        {
                                for(n=17; n>=0; n--)
                                {
                                        if(t==a[m][n])
                                                break;
                                }
                                if(n==-1)// 说明这一层里没有重复
                                        count++;// 说明处理完了一层数组
                        }
                        if(n==-1 && count==i)
                        // 这个地方的判断有问题,单纯这一个条件,检测一维数组是否全部不相同没问题,但检测多维数组不行,因为m>0时,每次循环完,n必然为-1
                        // 这里的count表示n==-1条件满足了count+1次
                        {
                                (*p)[i][j]=t;
                        }

                        else
                        {
                                srand(s++);
                                j--;
                                count=-1;// 重置count,这一步很容易忘!!!
                        }
                }
        }

        for(i=0; i<3; i++)// 打印a中所有元素
        {
                for(j=0; j<18; j++)
                {
                        printf("%d\n", a[i][j]);
                }
        }

        return p;
}

char **fapai()
{
        char *p[3];
        int  j;

        for(j=0; j<3; j++)
        {
                printf("请输入%d号玩家的名字:", j+1);
                scanf("%s", *p[j]);
        }

        return p;
}

void present(int a[3][18], char **p)
{
        int i,j;

        printf("方=方块,梅=梅花,红=红桃,黑=黑桃\n");
        for(i=0; i<3; i++)// i对应玩家
        {
                printf("%s手上的牌是:", *p[i]);
                for(j=0; j<18; j++)// j对应每个玩家对应数组的位数
                {
                        if(a[i][j]<11)
                        {
                                printf("方");
                        }
                        else if(a[i][j]<21)
                        {
                                printf("梅");
                        }
                        else if(a[i][j]<31)
                        {
                                printf("红");
                        }
                        else if(a[i][j]<41)
                        {
                                printf("黑");
                        }
                        printf("%d ", a[i][j]);
                }
                putchar('\n');
        }
}

int main()
{
        int a[3][18]={0};// 用于存放54个不重复的、[1,54]内的整数,并把他们分成三组
        char *name[3];// 为什么 char *name[3]=fapai() 说我初始值无效
        *name=*fapai();
        char c='N';

        present(xipai(a), name);

        do
        {
                printf("重新洗牌(A) or 更换玩家(C) or 结束游戏(O)?");
                scanf("%c", &c);

                if(c=='A')
                        present(xipai(a), name);
                else if(c=='C')
                        *name = *fapai();
                else if(c=='O')
                {
                        printf("再见!\n");
                        break;
                }
        }while(c!='N');

        return 0;
}
4.c: 在函数‘xipai’中:
4.c:8:25: 警告:initialization of ‘int (*)[3][18]’ from incompatible pointer type ‘int (**)[18]’ [-Wincompatible-pointer-types]
         int (*p)[3][18]=&a;// 用于修改数组a中的值
                         ^
4.c:54:16: 警告:returning ‘int (*)[3][18]’ from a function with incompatible return type ‘int *’ [-Wincompatible-pointer-types]
         return p;
                ^
4.c: 在函数‘fapai’中:
4.c:68:9: 警告:函数返回局部变量的地址 [-Wreturn-local-addr]
  return p;
         ^
4.c: 在函数‘main’中:
4.c:110:10: 警告:传递‘present’的第 1 个参数时在不兼容的指针类型间转换 [-Wincompatible-pointer-types]
  present(xipai(a), name);
          ^~~~~~~~
4.c:71:18: 附注:需要类型‘int (*)[18]’,但实参的类型为‘int *’
 void present(int a[3][18], char **p)
              ~~~~^~~~~~~~
4.c:118:12: 警告:传递‘present’的第 1 个参数时在不兼容的指针类型间转换 [-Wincompatible-pointer-types]
    present(xipai(a), name);
            ^~~~~~~~
4.c:71:18: 附注:需要类型‘int (*)[18]’,但实参的类型为‘int *’
 void present(int a[3][18], char **p)
              ~~~~^~~~~~~~
请输入1号玩家的名字:小甲鱼
段错误 (核心已转储)

有人能帮我看看吗,本来有9个错误、12个警告、6个附注,现在改得还剩5个警告、2个附注,不知道怎么改了。。。
写了三个小时,现在很懵逼,对这些返回值、形参很生疏的感觉
最佳答案
2022-4-19 23:39:12
https://www.cnblogs.com/weixiaoyu/p/4371806.html     <——这个讲了一些数组,或者二维数组怎么传参数的问题。       

最佳答案

查看完整内容

https://www.cnblogs.com/weixiaoyu/p/4371806.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-19 23:39:12 | 显示全部楼层    本楼为最佳答案   
https://www.cnblogs.com/weixiaoyu/p/4371806.html     <——这个讲了一些数组,或者二维数组怎么传参数的问题。       

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-20 09:43:42 | 显示全部楼层
本帖最后由 jhq999 于 2022-4-20 09:52 编辑
int *xipai(int (*a)[18])//传入指针才能在子程序里修改实参,你那个形参是个二维数组实例,影响不了调用子程序的程序代入的实参,并且子程序结束数组就会被释放
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-4-25 21:23:49 | 显示全部楼层
FK二十一 发表于 2022-4-21 09:36
https://www.cnblogs.com/weixiaoyu/p/4371806.html

这是你写的吗?很有帮助,谢谢!!!
最近有点忙,回复的有点晚,抱歉。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-26 08:31:33 | 显示全部楼层
孤不冷cing 发表于 2022-4-25 21:23
这是你写的吗?很有帮助,谢谢!!!
最近有点忙,回复的有点晚,抱歉。

不是我写的哦,不用谢的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 18:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表