孤不冷cing 发表于 2022-4-19 23:39:11

斗地主洗牌 返回值、类型对应问题很懵逼


#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int *xipai(int a)
{
      int (*p)=&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)
                                                break;
                              }
                              if(n==-1)// 说明这一层里没有重复
                                        count++;// 说明处理完了一层数组
                        }
                        if(n==-1 && count==i)
                        // 这个地方的判断有问题,单纯这一个条件,检测一维数组是否全部不相同没问题,但检测多维数组不行,因为m>0时,每次循环完,n必然为-1
                        // 这里的count表示n==-1条件满足了count+1次
                        {
                              (*p)=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);
                }
      }

      return p;
}

char **fapai()
{
      char *p;
      intj;

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

      return p;
}

void present(int a, char **p)
{
      int i,j;

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

int main()
{
      int a={0};// 用于存放54个不重复的、内的整数,并把他们分成三组
      char *name;// 为什么 char *name=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 (*)’ from incompatible pointer type ‘int (**)’ [-Wincompatible-pointer-types]
         int (*p)=&a;// 用于修改数组a中的值
                         ^
4.c:54:16: 警告:returning ‘int (*)’ 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 (*)’,但实参的类型为‘int *’
void present(int a, char **p)
            ~~~~^~~~~~~~
4.c:118:12: 警告:传递‘present’的第 1 个参数时在不兼容的指针类型间转换 [-Wincompatible-pointer-types]
    present(xipai(a), name);
            ^~~~~~~~
4.c:71:18: 附注:需要类型‘int (*)’,但实参的类型为‘int *’
void present(int a, char **p)
            ~~~~^~~~~~~~
请输入1号玩家的名字:小甲鱼
段错误 (核心已转储)


有人能帮我看看吗,本来有9个错误、12个警告、6个附注,现在改得还剩5个警告、2个附注,不知道怎么改了。。。
写了三个小时,现在很懵逼,对这些返回值、形参很生疏的感觉

FK二十一 发表于 2022-4-19 23:39:12

https://www.cnblogs.com/weixiaoyu/p/4371806.html   <——这个讲了一些数组,或者二维数组怎么传参数的问题。       

jhq999 发表于 2022-4-20 09:43:42

本帖最后由 jhq999 于 2022-4-20 09:52 编辑

int *xipai(int (*a))//传入指针才能在子程序里修改实参,你那个形参是个二维数组实例,影响不了调用子程序的程序代入的实参,并且子程序结束数组就会被释放

孤不冷cing 发表于 2022-4-25 21:23:49

FK二十一 发表于 2022-4-21 09:36
https://www.cnblogs.com/weixiaoyu/p/4371806.html

这是你写的吗?很有帮助,谢谢!!!
最近有点忙,回复的有点晚,抱歉。

FK二十一 发表于 2022-4-26 08:31:33

孤不冷cing 发表于 2022-4-25 21:23
这是你写的吗?很有帮助,谢谢!!!
最近有点忙,回复的有点晚,抱歉。

不是我写的哦,不用谢的。
页: [1]
查看完整版本: 斗地主洗牌 返回值、类型对应问题很懵逼