2015-04-13 3 views
0

Я хочу вернуть среднее значение двухмерного массива с помощью другого массива с помощью функции, программа работает нормально, но возвращает большое отрицательное число, как я могу вернуть массив или применить указатели к моей функции? где я могу добавить указатель, чтобы он работал?Возвращение массива в двухмерной функции массива?

Я столкнулся с этим:
предупреждение: передающий аргумент 1 из 'returnAvg' делает указатель из целого без актера [включен по умолчанию] |

#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;                  
} 
+0

avg должен быть параметром 'returnAvg' –

+0

ОК, я вижу, но почему он должен находиться внутри параметра функций? вместо того, чтобы находиться внутри брекетов. –

+0

'returnAvg (allTest [2] [2], students, test)' не должен иметь '[2] [2]' в нем. 'returnAvg (allTest, students, test)' правильный, вы не определяете размер allTest здесь. –

ответ

1

То, как вы использовали для передачи массива функции 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;                  
} 

Вы можете вызвать эту функцию в вашем доме как:

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

Теперь мы можем увидеть, как пройти avg arra y к главному!

Здесь код, в котором вы также можете изменить количество студентов и результаты тестов!

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;                  
} 
+0

Очень приятно, но как это происходит, когда я меняю учеников или проверяю целые числа на большее число, например 3,5,10 ect. он не выполняет функцию правильно? –

+0

Если вы измените значение теста и/или студентов, программа должна работать хорошо! Каковы ваши дублеты? –

+0

i changed test = 3, avg [2] всегда равно 0, а avg [1] - avg [0] + avg [1]. Я не знаю, как я получаю этот вывод. –

0

Вот быстрое обновление вашего кода, allTest аргумент должен быть переработан слишком

#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;                 
} 
1
returnAvg(allTest[2][2], students, test); 

является ошибочным, так как allTest[2][2] вычисляется в int и функция ожидает массив int [2][2].

Вы должны использовать:

returnAvg(allTest, students, test); 
+0

@AnilBhaskar, хороший момент. –

+0

Он написал код в 'c' не' C++ '. –

2

Ваш код хорошо, кроме:

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

должен быть

returnAvg(allTest,students,test);

Здесь не обязательно указывать размер attTest, потому что вы не определяете его здесь, просто параметр, предоставляющий функцию. Вы можете увидеть действующий код here.

Смежные вопросы