2014-11-24 2 views
0

Как передать структуры функции? это то же самое, что и переменные (т. е. &var1, чтобы передать его, и *ptr_to_var из функции).Прохождение структур к функциям

Пусть в следующем коде я хотел отправить agencies[i].emps[j].SB и agencies[i].emps[j].ANC функции, которая делает некоторые вычисления на них, а затем возвращает значение и сохранить его в agencies[i].emps[j].SNET

как я могу идти об этом?

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

typedef struct { 
    char mat[20]; 
    double SB; 
    int ANC; 
    double RCNSS; 
    double SNET; 
} employee; 

typedef struct { 
    char name[20]; 
    employee* emps; 
    int emps_count; 
} agency; 

int main(void) 
{ 
    int num_ag, num_emps, i, j; 
    printf("enter number of agencies\n"); 
    scanf("%d", &num_ag); 
    agency* agencies = malloc(sizeof(agency) * num_ag); 

    for (i = 0; i < num_ag; i++) { 

     sprintf(agencies[i].name, "agency %d", i+1); 
     printf("enter num of employees for agency %d\n", i+1); 
     scanf("%d", &num_emps); 
     agencies[i].emps = malloc(sizeof(employee) * num_emps); 
     agencies[i].emps_count = num_emps; 
     for (j = 0; j < num_emps; ++j) { 

      scanf("%s", &agencies[i].emps[j].mat); 
     } 
    } 


    for (i = 0; i < num_ag; i++) { 
     printf("agency name: %s\n", agencies[i].name); 
     printf("num of employees: %d\n", agencies[i].emps_count); 
    } 


    for (i = 0; i < num_ag; ++i) { 
     free(agencies[i].emps); 
    } 
    free(agencies); 

    return 0; 
} 
+0

просто передать указатель на функцию. – HuStmpHrrr

+0

Я рекомендую передать указатель на структуру и изменить ее непосредственно в функции. – LeatherFace

+1

Возможный дубликат [Пропускающая структура как указатель] (http://stackoverflow.com/questions/7567841/passing-structure-as-pointer) – Coconop

ответ

0

Вы можете просто пройти структуру указатель на вашей функции:

// Void of a type void function, which saves result of the calculation 
void modify_employee(employee * emp) { 
    emp->SNET = emp->SB * emp->ANC; 
} 

// Example of type double function, which returns result 
// of of the calculation (withuot saving it) 
double modify_employee2(employee * emp) { 
    return emp->SB * emp->ANC;  
} 

Используйте это так:

employee* emp = malloc(sizeof(employee)); 
emp->SB = 20.5; 
emp->ANC = 15; 
printf("SNET: %f\n", emp->SNET); 
modify_employee(emp); 
printf("SNET: %f\n", emp->SNET); 
+0

При использовании указателя на структуру обычно используется оператор '->', вместо этого оператора '.', для доступа к членам. (например, 'emp-> SNET = emp-> SB * emp-> ANC') –

+0

@ DavidC.Rankin Спасибо, я изменил его. – syntagma

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