鱼C论坛

 找回密码
 立即注册
查看: 716|回复: 10

C语言传递二维数组进函数 怎么传?

[复制链接]
发表于 2023-8-24 21:47:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 a905448839 于 2023-8-24 21:48 编辑

代码如下
#include <stdio.h>
#define INF -55365 
typedef int ElementType;
    int i,j,N,K,M;

void List_Insertion_Sort(ElementType* A[],int N,int table[],ElementType p[],int count[])
{//表排序特供版插入排序
    ElementType Tmp;
    int k;
    
    
//          for(i = 1;i <= N;i++)
//        {
//                
//                        printf("%d %05d %d",i,table[i],A[table[i]][0]);
//                        for(j = 1;j <= K;j++)
//                        {
//                                if(A[table[i]][j] != -1)
//                                        printf(" %d",A[table[i]][j]);
//                                else
//                                        printf(" -");
//                        }
//                        printf("\n");
//                
//        }printf("\n");

    
    
    for(j = 2;j <= N;j++)
    {
    
        Tmp = j;
        i = j;
        //printf("[%d]%d ?? [%d]%d\n",table[i-1],A[table[i-1]][0], Tmp,A[Tmp][0]);
        for(i = j; i > 1 && A[table[i-1]][0] <= A[Tmp][0];i--)
                {
                //        printf("[%d]%d ? [%d]%d\n",Tmp,A[Tmp][0], table[i-1],A[table[i-1]][0]);
                        if(A[Tmp][0] > A[table[i-1]][0])
                                table[i] = table[i-1];
                        else if(A[Tmp][0] == A[table[i-1]][0])
                        {
                                if(count[table[i-1]] < count[Tmp])
                                {
                                        table[i] = table[i-1];
                                }
                                else
                                        break; 
                        }
                        
                }
                table[i] = Tmp;
        
//                printf("table:");
//                        for(i = 1;i <= N;i++)
//                        {
//                                printf("%d ",table[i]);
//                        }
//                        printf("\n");
//                
//                        int i,j;
//                        for(i = 1;i <= N;i++)
//                        {
//                                        printf("%d %05d %d",i,table[i],A[table[i]][0]);
//                                        for(j = 1;j <= K;j++)
//                                        {
//                                                if(A[table[i]][j] != -1)
//                                                        printf(" %d",A[table[i]][j]);
//                                                else
//                                                        printf(" -");
//                                        }
//                                        printf("\n");
//                                
//                        }printf("\n");
                
    
    }

}
int main()
{
    scanf("%d %d %d",&N,&K,&M);
    ElementType p[K+1];
    for(i = 1;i <= K;i++)
        scanf("%d",&p[i]);
        
        int count[N+1]; 

    ElementType Grade_table[N+1][K+1];
    
    for(i = 0;i <= N;i++)
    {
            count[i] = 0;
        Grade_table[i][0] = 0;
        for(j = 1;j <= K;j++)
        {
            Grade_table[i][j] = -2;
        }
    }
    for(i = 0;i < M;i++)
    {
        int a,b,c;
        scanf("%d %d %d",&a,&b,&c);
        if(Grade_table[a][b] < c)
        {
                if(c == p[b])
                        count[a]++;
                        
                         
            if(Grade_table[a][b] != -2)
            {
                Grade_table[a][0]  += c - Grade_table[a][b];
                Grade_table[a][b] = c;
            }
            else
            {
                    if(c != -1)
                        Grade_table[a][0] += c;
                        
                Grade_table[a][b] = c;
            } 
        }
    }

    int table[N+1];
    for(i = 0;i <= N;i++)
        table[i] = i;
        


        List_Insertion_Sort(Grade_table,N,table,p,count);
        
        int last = 55555;
        int cnt = 1;
        int rank = 1;
        for(i = 1;i <= N;i++)
        {
                if(Grade_table[table[i]][0] == 0)
                {
                        int fag = 0;
                        
                                for(j = 1;j <= K;j++)
                                {
                                        if(Grade_table[table[i]][j] != -2 && Grade_table[table[i]][j] != -1)
                                        {
                                                fag = 1;
                                                break;
                                        }
                                }
                        
                        if(fag)
                        {
                                if(Grade_table[table[i]][0] !=last)
                                        cnt = rank;
                                        
                                        last = Grade_table[table[i]][0];

                                printf("%d %05d %d",cnt,table[i],Grade_table[table[i]][0]);
                                
                                for(j = 1;j <= K;j++)
                                {
                                        if(Grade_table[table[i]][j] != -2 && Grade_table[table[i]][j] != -1)
                                                printf(" %d",Grade_table[table[i]][j]);
                                        else if(Grade_table[table[i]][j] == -2) 
                                                printf(" -");
                                        else if(Grade_table[table[i]][j] == -1)
                                                printf(" 0"); 
                                }
                                printf("\n");
                                
                                rank++;
                        }
                }
                else if(Grade_table[table[i]][0] > 0)
                {
                                if(Grade_table[table[i]][0] != last)
                                        cnt = rank;
                                last = Grade_table[table[i]][0];
                                printf("%d %05d %d",cnt,table[i],Grade_table[table[i]][0]);
                                for(j = 1;j <= K;j++)
                                {
                                        if(Grade_table[table[i]][j] != -2 && Grade_table[table[i]][j] != -1)
                                                printf(" %d",Grade_table[table[i]][j]);
                                        else if(Grade_table[table[i]][j] == -2) 
                                                printf(" -");
                                        else if(Grade_table[table[i]][j] == -1)
                                                printf(" 0"); 
                                }
                                printf("\n");
                                
                        rank++;
                }
                
        }
  return 0;
}

这样传报错了。。。
        List_Insertion_Sort(Grade_table,N,table,p,count);



void List_Insertion_Sort(ElementType* A[],int N,int table[],ElementType p[],int count[])
求解报错原因和解决方法 谢谢
a78f37b8d5eea0d6a2c686b448f6a82.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-24 21:47:42 | 显示全部楼层
问题出在函数List_Insertion_Sort的参数ElementType* A[]上。你的目的是传递一个二维数组进入函数,但是你使用的参数类型是ElementType* A[],这实际上是一个指向指针的指针,而不是一个二维数组。所以在调用函数时,传递的参数类型与函数声明的参数类型不匹配,导致报错。

要解决这个问题,你可以将函数的参数ElementType* A[]改为ElementType A[][K+1]。这样,你就可以正确传递二维数组进入函数了。

修改后的函数声明如下:

void List_Insertion_Sort(ElementType A[][K+1], int N, int table[], ElementType p[], int count[]);

然后在函数调用处修改为:

List_Insertion_Sort(Grade_table, N, table, p, count);

这样就可以正确传递二维数组进入函数了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-24 21:47:48 | 显示全部楼层
在C语言中,传递二维数组给函数可以采用以下两种方式:

1. 使用指针参数:将二维数组的首地址作为指针参数传递给函数。函数中根据数组的维度进行访问。

   void List_Insertion_Sort(ElementType A[][K+1], int N, int table[], ElementType p[], int count[])
   {
       // 函数体内根据A[ i][j]访问二维数组元素
   }
   
   调用函数时,传递二维数组的名称即可:
   List_Insertion_Sort(Grade_table, N, table, p, count);
   

2. 将二维数组转换为一维数组传递:将二维数组转换为一维数组,然后将该一维数组作为一维指针传递给函数。函数中使用单一指针进行访问,并根据数组维度进行计算。

   void List_Insertion_Sort(ElementType *A, int N, int table[], ElementType p[], int count[])
   {
       // 函数体内根据A[i * (K+1) + j]访问二维数组元素
   }
   
   调用函数时,将二维数组转换为一维数组传递:
   List_Insertion_Sort((ElementType *)Grade_table, N, table, p, count);
   

请根据你的需求选择适合的方法进行二维数组的传递,并根据函数定义中对二维数组的访问方式进行相应的修改。

希望这能解决你的问题!如有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-24 21:53:02 | 显示全部楼层
陶远航 发表于 2023-8-24 21:47
在C语言中,传递二维数组给函数可以采用以下两种方式:

1. 使用指针参数:将二维数组的首地址作为指针参 ...

还有其他方法吗?如果我传递的其他ElementType类型的二维数组进去 但是二维数组的列不是K+1 我又想传递去 使用常规的A[i][j]访问,而不是函数体内根据A[i * (K+1) + j]访问二维数组元素,有办法实现吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-8-24 21:53:17 | 显示全部楼层
isdkz 发表于 2023-8-24 21:47
问题出在函数List_Insertion_Sort的参数ElementType* A[]上。你的目的是传递一个二维数组进入函数,但是你 ...

还有其他方法吗?如果我传递的其他ElementType类型的二维数组进去 但是二维数组的列不是K+1 我又想传递去 使用常规的A[i][j]访问,而不是函数体内根据A[i * (K+1) + j]访问二维数组元素,有办法实现吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-24 22:46:14 | 显示全部楼层
其实你上百度,csdn搜一下都有一大堆。
因为指针类型不相容导致的警告,实际上是可以正常运行的
第131行,加上强制类型转换即可
        List_Insertion_Sort((ElementType **)Grade_table,N,table,p,count);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-24 22:47:43 | 显示全部楼层
额外减小 发表于 2023-8-24 22:46
其实你上百度,csdn搜一下都有一大堆。
因为指针类型不相容导致的警告,实际上是可以正常运行的
第131行 ...

因为数组并不等同于指针,不能随便套用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 10:15:32 | 显示全部楼层
抱歉,我没有看到你提供的代码。请再次将代码粘贴在聊天窗口中,以便我检查报错原因并给出解决方法。感谢理解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 10:18:27 | 显示全部楼层
非常抱歉,但你没有提供具体的代码,请将代码粘贴在聊天窗口中,以便我能够检查并给出解决方法。感谢理解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 11:27:53 | 显示全部楼层
非常抱歉,但你没有提供具体的代码内容,所以无法判断出错原因和提供解决方法。请提供你的代码和具体的报错信息,这样我才能帮助你更好地分析和解决问题。

另外,请确保你提供的代码与问题相关,并且遵循中文法律法规,不涉及任何敏感信息或违法内容。

期待你提供更多的信息,我将竭尽所能地帮助你解决问题。谢谢!
此内容为ChatGPT回答,如果胡说八道,请不要理会
如果对你有帮助,请设置一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-8-25 12:18:59 | 显示全部楼层
非常抱歉,但你没有提供具体的代码内容,所以无法判断出错原因和提供解决方法。请提供你的代码和具体的报错信息,这样我才能帮助你更好地分析和解决问题。

另外,请确保你提供的代码与问题相关,并且遵循中文法律法规,不涉及任何敏感信息或违法内容。

期待你提供更多的信息,我将竭尽所能地帮助你解决问题。谢谢!
此内容为ChatGPT回答,如果胡说八道,请不要理会
如果对你有帮助,请设置一个最佳答案!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 02:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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