Passaggio by reference di un array di tipo struct

di il
17 risposte

Passaggio by reference di un array di tipo struct

Salve
Premessa che la distinzione del passaggio by value e by reference l'ho capita, ma sto avendo un problema con il passaggio di una struct by reference. Devo leggere da file dei prodotti di un supermercato e decidere se sono scaduti o meno, limite di scadenza anno 2010.
Es: tonno,48,2007

Io ho provato a fare cosi ma il programma mi gira a vuoto

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

#define NMAX 10

struct prodotto
{
    char tipo[20];
    int quantita;
    int scadenza;
};

void prodotti_scaduti(char fileprodotti[], struct prodotto p_s[], int *nps, int a_l);
struct prodotto estrai_dati(char s[]);

int main(int argc, char *argv[])
{
    struct prodotto p_s[NMAX];
    int nps = 0;                        //numero dei prodotti scaduti
    int anno_limite = 2010;

    if(argc != 2)
    {
        printf("Inserisci: <fileprodotti>");
        exit(EXIT_FAILURE);
    }
    
    prodotti_scaduti(argv[1], p_s, &nps, anno_limite);
    
    printf("I prodotti scaduti e da buttare sono:\n");

    while(nps >= 0)
    {
        printf("%d di %s\n", p_s[nps].quantita, p_s[nps].tipo);
    }

    return EXIT_SUCCESS;
}
void prodotti_scaduti(char fileprodotti[], struct prodotto p_s[], int *nps, int a_l)
{
    FILE *fp;
    struct prodotto p;
    char s[128];

    if((fp = fopen(fileprodotti, "r")) == NULL)
    {
        printf("Errore apertura del file!!");
        exit(EXIT_FAILURE);
    }

    while(fgets(s, 128, fp) != NULL)
    {
        p = estrai_dati(s);

        if(p.scadenza < a_l)
        {
            p_s[*nps] = p;
            (*nps)++;
        }
    }
    return;
}
struct prodotto estrai_dati(char s[])
{
    struct prodotto p;
    int i, j;
    char t[10];

    i=0;
    j=0;

    while(s[i] != ',' && s[i] != '\0')
    {
        p.tipo[j++] = s[j++];
    }
    p.tipo[j] = '\0';

    j=0;
    i++;
    while(s[i] != ',' && s[i] != '\0')
    {
        t[j++] = s[i++];
    }
    t[j] = '\0';
    p.quantita = atoi(t);

    j=0;
    i++;
    while(s[i] != ',' && s[i] != '\0')
    {
        t[j++] = s[i++];
    }
    t[j] = '\0';
    p.scadenza = atoi(t);

    return p;
}

17 Risposte

Devi accedere o registrarti per scrivere nel forum
17 risposte