2013-11-29 4 views
0

Я трачу много времени, чтобы передать указатель структуры в функции. все в коде работает только, я не мог понять, как передать структуру в функции, тогда я могу выполнить некоторую операцию внутри функции. можете ли вы объяснить, где именно я терпит неудачу и как ее исправить? Благодарю.Передача struct in function

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

int i=0; 
int* i_ptr=&i; 
int count(int q); 
int line_count(); 

struct student { 
    int st_id; 
    char st_name[20]; 
    int st_age; 
    char st_dep[7]; 
    float st_grade; 
}; 

int sort_student(struct student line[i],int i) 
{ 
    printf("%f",line[1].st_grade); 
    printf(" %s",line[1].st_name); 

    return 0; 
} 

int main() 
{ 
    /* struct loading from the file operation goes here */ 
    int x=0; 
    int i=line_count(); 
    struct student line[i]; 
    char file_line[100]; 
    char* line_parts; 

    FILE * fp; 
    if ((fp = fopen (file.txt", "r")) != NULL) 
    { 
     while (x<i) { 
      if(fgets(file_line,100,fp) != NULL);  // gets line from the file. 
      { 
       line_parts = strtok(file_line,","); // breaks the line 
       line[x].st_id = atoi(line_parts); // conversition string to int 

       line_parts = strtok(NULL, ","); 
       strcpy(line[x].st_name,line_parts); 

       line_parts = strtok(NULL, ","); 
       line[x].st_age = atoi(line_parts); 

       line_parts = strtok(NULL, ","); 
       strcpy(line[x].st_dep,line_parts); 

       line_parts = strtok(NULL, ","); 
       line[x].st_grade = atoi(line_parts); 
       x++; 
      } 
     } 
    } 
    fclose(fp); 

    sort_student(&line[i],i); 
    return 0; 
} 

int line_count() //counts the number of line in the file, while loading the program. 
{ 
    FILE * fp;   // file open from here. 
    int i=0; 
    int c; 
    if ((fp = fopen ("/Users/rishav/Desktop/try/try/file.txt", "r")) != NULL) 
    { 
     while ((c=fgetc(fp)) != EOF) { 
      if (c=='\n') { 
       i++; 
      } 
     } 
     fclose(fp); 
    } 
    else printf("file reading Error.\n"); 
    return i; 
} 

int count(q)  // keeps track of i 
{ 
    if(q==1) 
    { 
     (*i_ptr)++; 
    } 
    return *i_ptr; 
} 
+0

У вас есть глобальная переменная 'i' но' shadow' эту декларацию, имеющие другие переменные с именем 'i' - например, ваш итератор цикла в 'line_count'. Именно поэтому у вас есть 'i_ptr'? Лучшим решением было бы изменить имя глобального, назовите его 'g_i' (g_ для global) или' s_i', если он статичен. – kfsone

+0

заключается в том, что проблема не передается struct в функции или это еще одна проблема? – Rishav

+0

Другая проблема, следовательно комментарий не ответ. – kfsone

ответ

0

Вы должны изменить свое определение sort_student функции для

int sort_student(struct student* line,int i) { 
    printf("%f",line->st_grade); 
    printf(" %s",line->st_name); 

    return 0; 
} 
+0

Я меняю это, и он отображает ошибку, которая «должна использовать тег struct для обозначения типа« student ». на int sort_student (student * line, int i)? – Rishav

+0

Почему вы хотите передать адрес массива первому элементу, а затем узнать, какой элемент? Кроме того, я вижу, что вы выделяете элементы 'i' для своего массива и передаете элемент' i', который дает вам ошибку seg. – Farzad

+0

@Rishav В C вам нужно перед символом указать 'struct' или использовать' typedef'. просто замените 'student *' на 'struct student *'. – ApproachingDarknessFish