鱼C论坛

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

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

[复制链接]
发表于 2022-4-19 23:39:11 | 显示全部楼层 |阅读模式
40鱼币

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>


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

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

  33.                         else
  34.                         {
  35.                                 srand(s++);
  36.                                 j--;
  37.                                 count=-1;// 重置count,这一步很容易忘!!!
  38.                         }
  39.                 }
  40.         }

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

  48.         return p;
  49. }

  50. char **fapai()
  51. {
  52.         char *p[3];
  53.         int  j;

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

  59.         return p;
  60. }

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

  64.         printf("方=方块,梅=梅花,红=红桃,黑=黑桃\n");
  65.         for(i=0; i<3; i++)// i对应玩家
  66.         {
  67.                 printf("%s手上的牌是:", *p[i]);
  68.                 for(j=0; j<18; j++)// j对应每个玩家对应数组的位数
  69.                 {
  70.                         if(a[i][j]<11)
  71.                         {
  72.                                 printf("方");
  73.                         }
  74.                         else if(a[i][j]<21)
  75.                         {
  76.                                 printf("梅");
  77.                         }
  78.                         else if(a[i][j]<31)
  79.                         {
  80.                                 printf("红");
  81.                         }
  82.                         else if(a[i][j]<41)
  83.                         {
  84.                                 printf("黑");
  85.                         }
  86.                         printf("%d ", a[i][j]);
  87.                 }
  88.                 putchar('\n');
  89.         }
  90. }

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

  97.         present(xipai(a), name);

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

  102.                 if(c=='A')
  103.                         present(xipai(a), name);
  104.                 else if(c=='C')
  105.                         *name = *fapai();
  106.                 else if(c=='O')
  107.                 {
  108.                         printf("再见!\n");
  109.                         break;
  110.                 }
  111.         }while(c!='N');

  112.         return 0;
  113. }
复制代码


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


有人能帮我看看吗,本来有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 编辑
  1. 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-5-26 11:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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