C-programma loopt vast wanneer een functie wordt aangeroepen.

So, I ask the user for novo->prato (a list item), but somewhere in the function call or the scanf before it, the program crashes and I can't see what is wrong with the code.

Dit zijn de verklaringen en de functie.

typedef struct pedido pedido, *ppedido;

struct ingrediente{
    char nome[15];
    int id;
    int qtd;
    int limite;
    int consumo_medio;
};

struct item{
    char id[5];
    int ing[10];
    float qtd[10];
};

struct pedido{
    char id[5];
    int prioridade;
    int mesa, n_pratos;
    struct prato *prato[TAM];
    ppedido prox;
};

struct prato{
    char id[5];
};

int verifica_prato(char prato[])
{
    FILE *f;
    struct item aux;

    int i=0, j=0;

    f = fopen("menu.bin", "rb");

    while((fread(&aux, sizeof(struct item), 1, f)) == 1){
        if((strcmp(prato, aux.id)) == 0)
        i++;
    }
    fclose(f);

    if(i == 0){
        printf("Prato nao existe no menu.\n");
        return 1;
    }

    if(i > 1)
        return 0;
    }

Dit is waar de functie ia heet.

for(i=0;in_pratos;i++){
    do{
        printf("Introduza o ID do prato %d: ", i+1);
        scanf("%s", &novo->prato[i]);
        printf("%s", novo->prato[i]);
        k = verifica_prato(novo->prato[i]); //this function
        if(k == 0)
            w = verifica_ing(novo->prato[i]->id);
        }while(k != 0);
}
1
weet je zeker dat je niet meer dan 5 karakters betreedt?
toegevoegd de auteur fakedrake, de bron
@folex typedef struct foo foo is een vrij veel voorkomend idioom in C.
toegevoegd de auteur Jim Balter, de bron
'ergens in de functieaanroep of de scanf ervoor' - kom op, je moet weten welke, je hebt een printf ertussen! Kijk, ik heb duizenden stukjes code geschreven zoals deze en had geen SO om naar toe te gaan om ze te debuggen. Doe het harde werk en bedenk het zelf en bewaar SO voor vragen over programmeren die van waarde kunnen zijn voor iemand anders dan jezelf.
toegevoegd de auteur Jim Balter, de bron
voor (;;) {do {...} while (...); } is absoluut een anti-patroon, IMHO. Plus: verwijder de typedefs; Je zult langer leven.
toegevoegd de auteur wildplasser, de bron
@Jamie - "ppedido novo"
toegevoegd de auteur Marco Barbosa, de bron
Ja ik weet het zeker !
toegevoegd de auteur Marco Barbosa, de bron
Het is een struct van het type "pedido" met de naam "pedido". Ze hebben dezelfde naam, dus dat kan verwarrend zijn, sorry.
toegevoegd de auteur Marco Barbosa, de bron
Het wijst naar NULL.
toegevoegd de auteur Marco Barbosa, de bron
Wat betekent pedido pedido ?
toegevoegd de auteur folex, de bron
Thx, @JimBalter, ik heb het verkeerd gelezen vanwege de komma.
toegevoegd de auteur folex, de bron
Waar verwijst novo-> prox naar? (Of doet dit er niet toe, om een ​​of andere reden?)
toegevoegd de auteur thb, de bron
Men vermoedt dat dit een huiswerkvraag is, die niet als zodanig is getagd. Zie stackoverflow.com/q/11161070/1275653 . In de tussentijd heb ik een half uur aan de code gewerkt en helaas lijkt het te vol fouten om iets zinnigs te maken. Adressen worden verward met hun objecten. Leden worden verward met de typen waartoe ze behoren. Een functie mag zonder een retourwaarde doorlopen. Te vol fouten. Sorry, ik kan het niet helpen. (Je kunt echter de link volgen die ik heb verstrekt. Het lijkt te behoren tot een klasgenoot van jou.)
toegevoegd de auteur thb, de bron
Gebruik debugger !!!
toegevoegd de auteur user405725, de bron
Kunnen we zien hoe novo wordt gedefinieerd?
toegevoegd de auteur Jamie, de bron

3 antwoord

Inside verifica_prato()
after the line f = fopen("menu.bin", "rb") you should check whether the file opened successfully or not.
use if( f != NULL )

3
toegevoegd

Is novo->n_pratos always less than TAM? There could be a bounds error if it n_pratos exceeds TAM, because TAM has been defined as the array size.

0
toegevoegd
Het overschrijdt nooit TAM.
toegevoegd de auteur Marco Barbosa, de bron

Shouldnt the signature of verifca_prato be int verifica_prato(struct prato) or the call should be verifica_prato(novo->prato[i]->id);

0
toegevoegd