Проблема со структурами в c - PullRequest
1 голос
/ 28 апреля 2011

Привет, ребята, у меня здесь проблема со структурами, дело в том, что я создал структуру, а затем создал функцию, которая фиксирует сведения о сотрудниках, на которые ссылается эта структура. Теперь проблема возникает, когда я пытаюсь вызвать функцию в основном. пожалуйста, дайте мне несколько советов о том, как вызвать функцию. код выглядит следующим образом:

typedef struct employeeType
{
    char name;
    int employeeNumber;
    float salary;
    float taxPercentage;
}EMPLOYEE;

void enterDetails(EMPLOYEE details)
{  
    FILE *file;
    file = fopen("employees.txt","w");
    if(file == NULL)
    {
        printf("File error!!!");
        exit(0);
    }
    else
    {
        fprintf(file,"%s",details);
    }
    fclose(file);

}

void main()
{ 
  enterDetails();
}

Я не знаю, какие параметры передать функции в основной

Ответы [ 5 ]

1 голос
/ 28 апреля 2011

Я аннотировал ваш код с некоторыми другими проблемами для рассмотрения

typedef struct employeeType
{
     /* THIS IS ONLY ONE CHARACTER... SEEMS WRONG */
     /* should be 'char name[someMaxSize]', or 'char *name' */
    char name;  
    int employeeNumber;
    float salary;
    float taxPercentage;
}EMPLOYEE;

/* As pointed out by 'Cody Gray', this function is called 'enterDetails'
 * does it really need to have a parameter at all, or should it be responsible
 * for taking the details from the user?  Is it an appropriately 
 * named method for the task it's actually performing 
 * (would saveDetails be better for example)?
 */
void enterDetails(EMPLOYEE details)
{  
    FILE *file;
    file = fopen("employees.txt","w");
    if(file == NULL)
    {
        printf("File error!!!");
        exit(0);
    }
    else
    {
        /* THIS IS PASSING A STRUCTURE AS A STRING */
              /* You probably want to write out the individual fields instead */
              /* fprintf(file, "%s,%d", details.name, details.employeeNumber); etc */
        fprintf(file,"%s",details);  
    }
    fclose(file);

}

void main()
{ 
  EMPLOYEE details;   
  /* populate details somehow then pass it in to the function*/ 
  enterDetails(details);
}

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

Если вы используете указатель версии, то:

void enterDetails(EMPLOYEE details) 

станет

void enterDetails(EMPLOYEE *details) 

и основным станет:

void main()
{ 
  EMPLOYEE details;   
  /* populate details somehow then pass it in to the function as pointer */ 
  enterDetails(&details);
}

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

0 голосов
/ 28 апреля 2011

Первая проблема в том, что ваша структура неверна.Вы не можете сохранить имя сотрудника в поле имени, так как это только один байт.Вы должны сделать его массивом (в данном случае это проще) или указателем на выделенную память.

Если вы хотите сделать его массивом, то вы должны определить максимальный размер массива.В нашем примере мы просто сделаем его размером 100 байт, этого будет более чем достаточно для хранения любого имени.

#define MAX_NAME 100

typedef struct employeeType
{
    char name[MAX_NAME];
    int employeeNumber;
    float salary;
    float taxPercentage;
}EMPLOYEE;

Во-вторых, имя вашей функции сбивает с толку.enterDetails должен просто заполнить структуру, которую вы передали.В-третьих, вводимые вами данные должны принимать указатель на структуру EMPLOYEE.Если вы хотите передать какое-либо значение функции, которая будет изменять ее содержимое, то вы можете сделать это только с помощью указателей (или ссылок, если вы используете C ++, но это в основном указатель).Так что enterDetails должно быть,

void enterDetails(EMPLOYEE *details)
{
    printf("\nEnter the employee's name ");
    scanf("%s", details->name); // this isn't secure since it doesn't perform bound checking.

    printf("\nEnter employee number ");
    scanf("%d", &details->employeeNumber);

    printf("\nEnter employee salary ");
    scanf("%f", &details->salary);

    printf("\nEnter tax percentage ");
    scanf("%f", &details->taxPercentage);

}

И, наконец, если вы хотите сохранить содержимое структуры в файл, который вы хотите, чтобы люди читали, то вы должны отформатировать содержимое структуры и выгрузить его нафайл.

int writeToFile(EMPLOYEE *details) /* accepting the structure will work as well but it's faster and efficient to pass the structure's pointer */    
{
    FILE *file;

    file = fopen("employees.txt","w");
    if(file == NULL) {
       printf("File error!!!");
       return 0;
    }

    fprintf(file, "\nEmployee Name: %s", details->name);
    fprintf(file, "\nEmployee Number: %d", details->employeeNumber);
    fprintf(file, "\nSalary: %f", details->salary);
    fprintf(file, "\nTax Percentage: %f", details->taxPercentage);

    fclose(file)
    return 1;
}

И main

int main(void)
{
    EMPLOYEE details;

    enterDetails(&details); // passing the pointer here is a must
    if (!writeToFile(&details)) { // passing the pointer since it's faster
       printf("\nError writing to file");
       return 1;
    } else {
       printf("\nSuccess!");
       return 0;
    }
}

И в вашем случае вам не нужно передавать какие-либо параметры в main.Но если вы хотите знать, как передавать параметры, приведу краткий пример.

int main(int argc, char **argv)
{
    int i;

    for (i = 0; i < argc; i++)
        printf("\n%s", argv[i]);

    return 0;
}
0 голосов
/ 28 апреля 2011

Вам нужно передать ссылку, а не значение ... Если вы передадите значение EMPLOYEE, как в предыдущем посте, оно будет скопировано, копия будет изменена, а не оригинал

 void enterDetails(EMPLOYEE* emp) {
    // do stuffs
 }

 void main() {
   EMPLOYEE emp;
   enterDetails(&emp);
 }
0 голосов
/ 28 апреля 2011

Вы можете передать указатель структуры

void main()
{
    EMPLOYEE employee;
    .....
    enterDetails(&employee);
}

void enterDetails(EMPLOYEE *details)
{

}
0 голосов
/ 28 апреля 2011
void main()
{ 
  EMPLOYEE details;
   // get the value of element of struct from scanf or from other way
   printf("Enter Name : ");
   scanf("%s", details.name);  // same for others, change the format specifier according to their data type
  enterDetails(details);
}

И структура должна быть как

typedef struct employeeType
{
    char name[];  // should be an array or pointer, to store name
    int employeeNumber;
    float salary;
    float taxPercentage;
}EMPLOYEE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...