【问题标题】:Returning an array in a two dimensional array function?在二维数组函数中返回一个数组?
【发布时间】:2015-04-13 04:26:30
【问题描述】:

我想使用函数返回具有不同数组的二维数组的平均值,程序运行良好,但它返回一个很大的负数,我如何返回数组或将指针应用到我的函数?我在哪里添加指针以使其工作?

我遇到了这个:
警告:传递 'returnAvg' 的参数 1 使指针从没有强制转换的整数 [默认启用]|

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

void returnAvg(int allTest[2][2],int students,int test);                       



int main ()                                                                    
{                                                                              

    int students = 2, test = 2, i,j;                                           
    int allTest[students][test];                                               


    for(i=0;i<students;i++){                                                   
        for(j=0;j<test;j++){                                                   
            printf("Student [%d] test [%d] score was> ",i+1,j+1);              
            scanf("%d",&allTest[i][j]);                                        
        }                                                                      
    }                                                                          
    returnAvg(allTest[2][2],students,test);                                    


    return 0;                                                                  
}                                                                              
void returnAvg(int allTest[2][2],int students,int test){                       
    int i,j;                                                                   
    int avg[students];                                                         

    for(i=0;i<students;i++){                                                   
        int sum = 0;                                                           
        for(j=0;j<test;j++){                                                   
            sum += (allTest[i][j]);                                            
        }                                                                      
        avg[i] = sum/test;                                                     
    }                                                                          
    printf("the average is %d, %d", avg[0],avg[1]);                            
    return;                                                                    
} 

【问题讨论】:

  • avg 应该是returnAvg的参数
  • 好的,我明白了,但是为什么它需要在函数参数中?而不是在大括号内。
  • returnAvg(allTest[2][2],students,test) 中不应包含 [2][2]。 returnAvg(allTest,students,test) 是正确的方法,你没有在这里定义 allTest 的大小。

标签: c compiler-errors


【解决方案1】:

你的代码很好,除了:

returnAvg(allTest[2][2],students,test);

应该是

returnAvg(allTest,students,test);

你不必在这里给出attTest 的大小,因为你没有在这里定义它,只是一个提供给函数的参数。 您可能会看到您的工作代码here。

【讨论】:

    【解决方案2】:

    你以前将数组传递给函数 returnAvg 的方式是错误的!我看到的最简单的方法是将数组作为指针传递。这是因为这种数组是一块块或连续的内存区域!

    我认为可以使用不同的方式分配数组和向量!也许使用 C++ new 或 C malloc;但这将成为您的下一步!

    下面会讨论获取包含avg的向量的方法!

    我已经在 64 位系统下编译了您的代码,将此代码添加到您的主代码中:

    for(i=0;i<students;i++)
        for(j=0;j<test;j++)                                                   
            printf("%p\n",&(allTest[i][j]));
    

    输出应该是这样的:

    0x7fff0cd89e60
    0x7fff0cd89e64
    0x7fff0cd89e68
    0x7fff0cd89e6c
    

    这表明我说的是什么!所有元素都是连续的!

    我们知道有一个指向第一个元素的“基”指针。在输出中是 0x7fff0cd89e60(即指向 allStudent[0][0] 的指针)。

    这个指针和数组元素的所有指针的关系是:

    0x7fff0cd89e60 + sizeof(int) * (i*test+j)
    

    说明指针算法,我们可以将您的函数修改为:

    void returnAvg(int * allTest,int students,int test){                       
        int i,j;                                                                   
        int avg[students];                                                         
    
        for(i=0;i<students;i++){                                                   
            int sum = 0;                                                           
            for(j=0;j<test;j++){                                                   
                sum += (allTest[i*students+j]);                                            
            }                                                                      
            avg[i] = sum/test;                                                     
        }                                                                          
        printf("the average is %d, %d", avg[0],avg[1]);                            
        return;                                                                    
    } 
    

    你可以在你的 main 中调用这个函数:

    returnAvg(&(allTest[0][0]),students,test);  
    

    现在我们可以看看如何将 avg 数组传递给 main!

    这里的代码你还可以修改学生人数和测试结果!

    void returnAvg(int *avg, int * allTest,int students,int test);
    
    int main ()                                                                    
    {                                                                              
    
        int students = 2, test = 2, i,j;                                           
        int allTest[students][test];                                               
    
        int avg[students];
    
        /*
        for(i=0;i<students;i++)
        for(j=0;j<test;j++)                                                   
               printf("%p\n",&(allTest[i][j]));
        */
    
        for(i=0;i<students;i++){                                                   
            for(j=0;j<test;j++){                                                   
                printf("Student [%d] test [%d] score was> ",i+1,j+1);              
                scanf("%d",&allTest[i][j]);                                        
            }                                                                      
        }                       
    
    
        returnAvg(avg,&(allTest[0][0]),students,test);                                    
        for(i=0;i<students;i++){                                                   
            printf("Student %d average: %d\n", i+1, avg[i]);
        }
    
        return 0;                                                                  
    }
    
    void returnAvg(int * avg, int * allTest,int students,int test){                       
        int i,j;                                                                   
    
        for(i=0;i<students;i++){                                                   
            int sum = 0;                                                           
            for(j=0;j<test;j++){                                                   
                sum += (allTest[i*test+j]);                                            
            }                                                                      
            avg[i] = sum/test;                                                     
        }                                                                          
    
        return;                                                                    
    } 
    

    【讨论】:

    • 非常好,但是当我将学生或测试整数更改为更高的数字时,例如 3、5、10 等。它没有正确完成功能?
    • 如果更改 test 和/或 students 的值,程序应该运行良好!你有什么疑问?
    • 我更改了 test = 3,avg[2] 始终等于 0,avg[1] 为 avg[0]+avg[1]。我不知道我是如何得到那个输出的。
    • 我设置 students=3,test=2 输入 100,150,25,50,10,20。输出为: 125, 30, 0 。我不明白,你知道它是什么吗?
    • 我已将其更正为上面的代码。问题是在函数 returnAvg 中,变量 i 应该乘以 test 而不是学生!!! ;)
    【解决方案3】:
     returnAvg(allTest[2][2], students, test);
    

    是错误的,因为 allTest[2][2] 的计算结果为 int,而函数需要一个数组 int [2][2]。

    你需要使用:

     returnAvg(allTest, students, test);
    

    【讨论】:

      【解决方案4】:

      这里是你的代码的快速更新,allTest arg 也应该重做

      #include <stdio.h>                                                             
      #include <stdlib.h>                                                            
      #include <math.h>                                                              
      
      static void returnAvg(int allTest[2][2],int students,int test, int *avg){      
          int i,j;                                                                   
      
          for(i=0;i<students;i++){                                                   
              int sum = 0;                                                           
              for(j=0;j<test;j++){                                                   
                  sum += (allTest[i][j]);                                            
              }                                                                      
              avg[i] = sum/test;                                                     
          }                                                                          
          printf("the average is %d, %d", avg[0],avg[1]);                            
      }                                                                              
      
      int main ()                                                                    
      {                                                                              
          int students = 2, test = 2, i,j;                                           
          int allTest[students][test];                                               
          int avg[students];                                                         
      
          for(i = 0; i < students; i++){                                             
              for(j = 0; j < test; j++){                                             
                  printf("Student [%d] test [%d] score was> ", i + 1, j + 1);        
                  scanf("%d", &allTest[i][j]);                                       
              }                                                                      
          }                                                                          
          returnAvg(allTest, students, test, avg);                                   
      
      
          return 0;                                                                  
      } 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-16
        • 1970-01-01
        • 2012-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-29
        相关资源
        最近更新 更多