Passaggio by reference di un array di tipo struct

di Anonimizzato31136 il
17 risposte
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

  • Che vuol dire "gira a vuoto"??
  • Finisce l'esecuzione senza stampare nulla.
  • Quindi controlla il ciclo while di stampa. Ti sembra corretto?
  • Ok credo di aver trovato l'errore, pensavo fosse colpa del passaggio della struct sul main
  • Quindi?
  • Non decrementavo nps sul main e avevo messo un j al posto di i sull'ultima funzione. Adesso funziona.
    Morale: ricontrollare 10 volte prima di scrivere sul forum.
  • Esatto
  • Ti chiedo una cosa, questo livello di C che ci chiede il nostro professore che livello è?
  • Non è classificabile un "livello" ma direi che il codice è ordinato e abbastanza completo. Potete usare di più i puntatori, compresi i puntatori a funzione, per migliorare ancora.
  • Ecco i puntatori a funzione non li abbiamo fatti effettivamente, per quello mi chiedevo se abbiamo visto la maggior parte delle cose del C oppure no. Più che altro sapere se sono cose ai fini del esame oppure queste cose mi saranno utili anche fuori dall'università
  • Sicuramente come formazione generale.

    Nello specifico, il C potrebbe servirti se userai il C# o Java. Soprattutto se lavorerai nell'ambito di sviluppo di sistemi
  • Ho capito, visto che mi stai rispondendo praticamente solo tu ti chiedo un'altra cosa
    Po chiamare un vettore dentro una struct? esempio:
    
    struct concorrente 
    {
        char nome[20];
        int punteggi[10];
    };
  • Si può fare. Ed è anche più comodo così fare copie tra vettori, basta copiare l'intera struct in un'altra.
    Comunque ad essere pignoli, quello è il passaggio by pointer, il reference è un costrutto del C++.
  • E per la lettura o l'assegnazione non cambia rispetto ad un array normale? esempio banale a cui assegno un valore ad un indice qualsiasi dell'array nella struct:
    
    int a=1;
    
    c.punteggio[1] = a;
Devi accedere o registrarti per scrivere nel forum
17 risposte