How to pass a dynamically allocated struct to a C function?

Asked

Viewed 238 times

2

The program must dynamically allocate the struct and pass it as parameter.

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

typedef struct cadastro_de_mercadoria{
    int codigo;
    int estoque;
} CADASTRO;

void printar(CADASTRO cadastruu, int N){

    printf("\n\n---------RESULTADO DOS PEDIDOS DOS CLIENTES-------\n\n");

    for(int l=0; l<N; l++){
        printf("Código da mercadoria %d: %d \n",l+1,cadastruu[l].codigo);
        printf("Quantidade da mercadoria no estoque: %d ", cadastruu[l].estoque);
        printf("\n\n");
    }
}
int main(){

    CADASTRO *cadastro;
    int N, k, codcli, estoquecli, escolha, encontrado=0;
    k=0;

    printf("Entre com o número de mercadorias: ");
    scanf("%d", &N);

    cadastro = (CADASTRO *)malloc(N * sizeof(CADASTRO));

    if(cadastro == NULL){
        printf("Muita memoria!\n");
        return 1;
    }
    else{
        //cadastro das mercadorias
        for(int i=0; i<N; i++){
            printf ("Entre com o código da mercadoria %d: ",i+1);
            scanf ("%d%*c", &cadastro[i].codigo);

            printf ("Entre com o estoque da mercadoria %d: ", i+1);
            scanf ("%d%*c", &cadastro[i].estoque);
            printf ("\n");
        }
    }

    //consulta da mercadoria
    printf ("----------PEDIDOS DOS CLIENTES----------\n\n");
    while(1){
        printf ("Entre com o código da mercadoria: ");
        scanf ("%d%*c", &codcli);
        encontrado=0;
        for(int j=0; j<N; j++){
            if(cadastro[j].codigo==codcli){
                printf ("Entre com o estoque da mercadoria: ");
                scanf ("%d", &estoquecli);
                if(cadastro[j].estoque>=estoquecli){
                    cadastro[j].estoque = cadastro[j].estoque - estoquecli;
                    printf ("ESTOQUE ATUALIZADO\n");
                }  
                else{
                    printf ("ESTOQUE INSUFICIENTE!\n");
                }
                k=1;
            }

        }

        if(k==0){
            printf ("MERCADORIA NÃO ENCONTRADA!\n");
        }

        k=0;

        printf("Deseja enviar outra solicitacao? (Sim: 1/Não: 0):: ");
        encontrado=0;
        scanf("%d", &escolha);

        if(escolha==0)
            break;
    }  
    printar(cadastro, N);
    free(cadastro);
    return 0;
}

1 answer

4


The basic error is that the parameter is not declared as a pointer. If the local variable was declared with pointer the argument will be a pointer, then the parameter will also be, which makes sense. Improving everything would be like this (you can improve much more):

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

typedef struct {
    int codigo;
    int estoque;
} Cadastro;

void imprimir(Cadastro *cadastro, int n) {
    printf ("\n\n---------RESULTADO DOS PEDIDOS DOS CLIENTES-------\n\n");
    for (int i = 0; i < n; i++) {
        printf("Código da mercadoria %d: %d \n", i + 1, cadastro[i].codigo);
        printf("Quantidade da mercadoria no estoque: %d\n\n", cadastro[i].estoque);
    }
}
int main() {
    int n;
    printf ("Entre com o número de mercadorias: ");
    scanf ("%d", &n);
    Cadastro *cadastro = malloc(n * sizeof(Cadastro));
    if (cadastro == NULL) {
        printf("Proberlmas de alocação de memoria!\n");
        return 1;
    } else {
        for (int i = 0; i < n; i++) {
            printf ("Entre com o código da mercadoria %d: ",i+1);
            scanf ("%d%*c", &cadastro[i].codigo);
            printf ("Entre com o estoque da mercadoria %d: ", i+1);
            scanf ("%d%*c\n", &cadastro[i].estoque);
        }
    }
    printf ("----------PEDIDOS DOS CLIENTES----------\n\n");
    while (1) {
        printf ("Entre com o código da mercadoria: ");
        int codcli;
        scanf ("%d%*c", &codcli);
        int achou = 0;
        for (int i = 0; i < n; i++) {
            if (cadastro[i].codigo == codcli) {
                printf ("Entre com o estoque da mercadoria: ");
                int estoquecli;
                scanf ("%d", &estoquecli);
                if (cadastro[i].estoque >= estoquecli){
                    cadastro[i].estoque -= estoquecli;
                    printf ("ESTOQUE ATUALIZADO\n");
                } else printf ("ESTOQUE INSUFICIENTE!\n");
                achou = 1;
            }
        }
        if (achou == 0) printf ("MERCADORIA NÃO ENCONTRADA!\n");
        printf ("Deseja enviar outra solicitacao? (Sim: 1/Não: 0):: ");
        int escolha;
        scanf ("%d", &escolha);
        if (escolha == 0) break;
    }  
    imprimir(cadastro, n);
    free(cadastro);
}

Behold working in the ideone. And in the repl it.. Also put on the Github for future reference.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.