TransWikia.com

Como passar uma struct alocada dinamicamente para uma função em C?

Stack Overflow em Português Asked by Larissa Benevides Vieira on January 12, 2021

O programa deve alocar dinamicamente a struct e passar ela como parâmetro.

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

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

void printar(CADASTRO cadastruu, int N){

    printf("nn---------RESULTADO DOS PEDIDOS DOS CLIENTES-------nn");

    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("nn");
    }
}
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----------nn");
    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 ATUALIZADOn");
                }  
                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;
}

One Answer

O erro básico é que o parâmetro não está declarado como ponteiro. Se a variável local foi declarada com ponteiro o argumento será um ponteiro, então o parâmetro também será, o que faz sentido. Melhorando tudo ficaria assim (dá pra melhorar bem mais):

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

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

void imprimir(Cadastro *cadastro, int n) {
    printf ("nn---------RESULTADO DOS PEDIDOS DOS CLIENTES-------nn");
    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: %dnn", 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%*cn", &cadastro[i].estoque);
        }
    }
    printf ("----------PEDIDOS DOS CLIENTES----------nn");
    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 ATUALIZADOn");
                } 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);
}

Veja funcionando no ideone. E no repl.it. Também coloquei no GitHub para referência futura.

Correct answer by Maniero on January 12, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP