How to allocate space for each structure of a vector as the user wishes?

0

Well, how do I allocate a structure whenever the user wants to allocate another one? How would I make this increase? I'm putting a code here just so you can understand my problem.

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

/* 
SÍNTESE
OBJETIVO: Calcular bônus de funcionário com mais de 10 anos de serviço
ENTRADA: Nome do funcionário, nome do departamento salário, salário e tempo de serviço
SAÍDA: Nome do funcionário, nome do departamento, salário com bônus ou nao, e tempo de serviço, se deseja continuar
*/


#define MAX_FUNCIONARIOS 5
#define MAX_NOME 100


typedef struct{
    char nome[MAX_NOME];
    char nomeDepartamento[MAX_NOME];
    float salario;
    int tempoServico;

}Funcionarios;

int main(int argc, char *argv[]) {



    int numEstruturas=0, opcao=0;


    do{

        //aloca dados para um vetor de estruturas
        func = (Funcionarios*) malloc(1*sizeof(Funcionarios));

        //verifica se a alocacao ocorreu corretamente

        if(!func){
            printf("\nNao foi possivel alocar espaco para esta estrutura!\n");
            exit(0);
        }

        printf("Deseja adicionar outra estrutura: (1) ou (2)-sair");
        scanf("%d", &opcao);

        if(opcao == 1){
            func = (Funcionarios*) realloc(numEstruturas*sizeof(Funcionarios));
        }else{
            break;
        }

    }while(opcao==1&&n<MAX_FUNCIONARIOS);




    return 0;
}
    
asked by anonymous 04.10.2018 / 23:35

1 answer

1

In order to change the size of the vector according to what the user wants, you need to use realloc as you are already using it, but you have to increase the size with each reallocation, which you are not doing.

The most natural, and so documentation shows is to start the vector with NULL avoiding having to use malloc in the first case and even test if it is the first case. This does not cause any problems since the realloc behaves as a malloc if the old vector is NULL .

Citing the documentation:

  

In case that ptr is a null pointer, the function behaves like malloc , assigning a new block of size bytes and returning pointer to its beginning.

Free Translation

  

In the case of ptr being a null pointer the function behaves as a malloc , assigning a new block of size bytes and returning a pointer to its start.

In your code applying these ideas would have:

int main(int argc, char *argv[]) {
    int numEstruturas = 0, opcao = 0;
    Funcionarios *func = NULL; //vetor agora iniciado com NULL e fora do loop

    do {
        printf("Deseja adicionar outra estrutura: (1) ou (2)-sair");
        scanf("%d", &opcao);

        if(opcao == 1) {
            //realoca, passando o vetor antigo e o novo tamanho
            func = realloc(func, ++numEstruturas * sizeof(Funcionarios));

            //teste se falhou a realocação agora movido para aqui
            if(!func) { 
                printf("\nNao foi possivel alocar espaco para esta estrutura!\n");
                exit(0);
            }
        }
    } while(opcao == 1 && numEstruturas < MAX_FUNCIONARIOS);

    return 0;
}

The most important instruction from code is even realloc and see how it is different from what it had, that even lacked a parameter:

func = realloc(func, ++numEstruturas * sizeof(Funcionarios));
//              ^        ^-- numero de estruturas já aumentado para ser mais 1
//              |-- vetor antigo

I also removed the else { break; } because if the user chooses another value than 1 the very condition of while will already finish it.

    
05.10.2018 / 01:49