2016-11-03 4 views
-1

Я узнаю о векторе указателей в C как часть задания. Однако одна часть моего кода не запускается, и я не понимаю, почему. Я включил полный код ниже, хотя моя проблема заключается именно в функции selectApproved.Вектор указателей с динамическим распределением памяти в C

У меня есть только проблемы с функцией selectApproved. Он получает вектор-указатель типа Студент, который является структурой, которую я определил и среди ее элементов имеет оценки двух разных тестов. Предполагается, что функция рекурсивно идентифицирует студентов, которые достигли результата прохождения (определяется как test1 + test2> = 10) и возвращает вектор указателей, в котором каждый элемент вектора указателя содержит указатель на Студент struct ,

Ошибка после утверждения printf ("Позиция% d \ n", позиция); находится, после всех рекурсивных вызовов. В частности, я знаю, что ошибка возникает при этом утверждении: approved_students [position] = vector [position];.

Я не понимаю, почему эта ошибка происходит. После того, как все рекурсивные вызовы произошли, я динамически выделяю свой вектор указателя, чтобы точно удерживать число прошедших студентов: approved_students = (Student **) malloc ((* прошло) * sizeof (Student *)). Насколько я понимаю, approved_student должен иметь точно количество «слотов» как * переданных (в данном случае 4 слота). Я даже отношусь к случаю, когда ни один студент не был одобрен в выражении if if (num_students == 0).

Я знаю, что моя рекурсивная функция работает хорошо, поскольку printf («Позиция% d \ n», позиция); распечатывает 3, что означает, что 4 ученика были одобрены как ожидалось (учащиеся 0,1,2,3 были одобрены). Используемая среда IDE (Visual Studio 2012) позволяет мне делать approved_students [position] = vector [position];. Это утверждение, на мой взгляд, говорит о том, что, например, approved_students [position] будет содержать указатель на структуру, расположенную в vector [position]. В конце концов, approved_student - это вектор указателей.

Я действительно потерял, почему функция не работает. Может ли кто-нибудь помочь? Я думаю

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

struct Studentgrade{  

    float test1; 
    float test2; 

}; 

typedef struct Studentgrade Grade; 

struct student 

{ 

    int ID_number; 
    char name[51]; 
    Grade *scores; 

}; 

typedef struct student Student; 

Student *createStudent(int ID_num, char name_student[], float test1_grade, float test2_grade){ 

    int i = 0; 
    Student *newStudent = (Student *) malloc(sizeof(Student)); 

    if (newStudent == NULL){ 

     printf("Error in memory allocation\n"); 
     exit(1); 

    } 

    newStudent->scores = (Grade *) malloc(sizeof(Grade)); 

    if (newStudent->scores == NULL){ 

     printf("Error in memory allocation\n"); 
     exit(1); 

    } 

    newStudent->scores->test1 = test1_grade; 
    newStudent->scores->test2 = test2_grade; 

    newStudent->ID_number = ID_num; 

    while(i < 51 && name_student[i] != '\0') 

     newStudent->name[i] = name_student[i++]; 

    newStudent->name[i] = '\0'; 

    return newStudent; 
} 

Student **selectApproved(Student *vector[], int num_students, int *passed){ 

    int position; 
    int i; 
    float comparison; 
    Student **approved_students = NULL; 

    if(num_students == 0){ 

     if(*passed == 0){ 

      printf("No student passed\n"); 
      return NULL; 


     } 

     else{ 

      approved_students = (Student **) malloc((*passed) * sizeof(Student *)); 

      /*for (i = 0; i < (*passed); i++) 

      approved_students[i] = (Student *) malloc(sizeof(Student *));*/ 

      if (approved_students == NULL){ 

       printf("Error in memory allocation\n"); 
       exit(1); 
      } 

      return approved_students; 
     } 
    } 

    comparison = (vector[0]->scores->test1) + (vector[0]->scores->test2); 

    if(comparison >= 10){ 

     position = *passed; 
     (*passed)++; 

     approved_students = selectApproved(&vector[1], num_students - 1, passed); 

     printf("Position %d\n", position); 

     approved_students[position] = vector[position]; 


    } 

    else 

     selectApproved(&vector[1], num_students - 1, passed); 

    return approved_students; 

} 

int main(void){ 

    Student *vpstudent[12]; 
    Student **vpstudent2; 
    int i = 0; 
    vpstudent[0] = createStudent(444,"Rita",6.4, 7.8); 
    vpstudent[1] = createStudent(111,"Rita",5.6, 8.8); 
    vpstudent[2] = createStudent(999,"Rita",8.2, 7.1); 
    vpstudent[3] = createStudent(555,"Dina",2.7, 6.4); 
    vpstudent[4] = createStudent(777,"Lana",9.5, 5.3); 
    vpstudent[5] = createStudent(666,"Tais",2.2, 2.8); 
    vpstudent[6] = createStudent(222,"Cris",3.1, 4.2); 
    vpstudent[7] = createStudent(333,"Vera",4.4, 5.4); 
    vpstudent[8] = createStudent(888,"Cris",4.4, 5.4); 
    vpstudent[9] = createStudent(303,"Vera",4.4, 5.4); 
    vpstudent[10] = createStudent(101,"Cris",5.4, 3.4); 
    vpstudent[11] = createStudent(202,"Vera",1.4, 8.4); 

    vpstudent2 = selectApproved(vpstudent, 12, &i); 
    return 0; 

} 
+0

Поскольку ничего в коде, который вы выложили, фактически называет 'selectApproved', сложно сказать, как вы можете получить эту ошибку. – Tibrogargan

+0

C не имеет векторного типа. Вы имеете в виду _arrays_? И не бросайте результат 'malloc' & friends или' void * 'вообще. – Olaf

+0

Тиброгарган, я только что исправил это (не был вызван вызов selectApproved). И Олаф, по вектору, я имел в виду массивы. – Rafolks

ответ

0

Похоже, вы полагаетесь на окончательных рекурсиях в selectApproved выделить память для вектора.

Однако вы не гарантируете, что выделенный указатель фактически будет возвращен обратно в стек вызовов.

Условие «если (сравнение> = 10)» не загружает утвержденных_студентов.

if(comparison >= 10){ 
    ... 
    approved_students = selectApproved(&vector[1], num_students - 1, passed); 
    ... 
} else { 
    approved_students = selectApproved(&vector[1], num_students - 1, passed); 
} 

return approved_students; 

Основываясь на этом, я бы сказал, что ученик на самом глубоком уровне рекурсии не прошел.

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