+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 4 su 4

Problema assegnazione intero

  1. #1
    L'avatar di RedSkull
    RedSkull non è in linea Novello
    Salve a tutti, ho bisogno di una mano.
    Sto realizzando per scuola un programma di gestione prodotti e fatture.
    Ho fatto la funzione dei prodotti (riesco a caricarli, cercarli e stamparli)
    Dopo ho fatto la funzione per le fatture, nelle fatture devo mettere numero fattura, data e i prodotti da acquistare.
    Quì nasce un problema, non riesco ad assegnare all'array di prodotti un valore intero, ecco la funzione:
    Strutture:
    typedef struct
    {
       int codice_p;
       char nome[20];
       float prezzo;
    }prodotto;
    
    typedef struct 
    {
       int giorno,mese,anno;
    }date;
    
    typedef struct
    {
       int num_f;
       date data;
       int *prodotti;
    }fattura;
    
    Funzione carica fatture
    fattura *carica_fattura(fattura *archivio_f,int *num,prodotto *archivio_p,int num_p)
    {
       int n_p=0,codice,posi;
       char again;
       
       if((archivio_f = (fattura*)realloc(archivio_f,((*num)+1)*sizeof(fattura))) == NULL)
          exit(1);
       
       printf("Fattura numero %d\n",(*num));
       (archivio_f+(*num))->num_f=(*num);
       printf("Inserisci giorno: ");
       scanf("%d",&(archivio_f+(*num))->data.giorno);
       printf("Inserisci mese: ");
       scanf("%d",&(archivio_f+(*num))->data.mese);
       printf("Inserisci anno: ");
       scanf("%d",&(archivio_f+(*num))->data.anno);
       
       do
       {
          ((archivio_f+(*num))->prodotti) = (int*)realloc(((archivio_f+(*num))->prodotti),(n_p+1)*sizeof(int));
          if (((archivio_f+(*num))->prodotti) == NULL)
             exit(1);
             
          do
          {
             printf("Inserisci il codice del prodotto da inserire nella fattura: ");
             scanf("%d",&codice);
             if((posi = cerca(codice,archivio_p,num_p)) == -2)
                printf("Codice corrispondente a nessun prodotto.\n");
             else
                printf("Codice corrispondente a %s\n",(archivio_p+posi)->nome);
          }while(posi == -2);
           //QUì CAPITA L'ERRORE, A ME SEMBRA CORRETTO.
          (((archivio_f+(*num))->prodotti)+n_p) = codice;
          printf("Prodotto inserito!\nVuoi inserire altri prodotti all'interno della fattura ? (S/N)\n");
          scanf("%c",&again);
          if(again == 'S' || again == 's')
             n_p++;
       }while(again != 'N' || again != 'n'); 
       printf("Fattura completata!\n");
       return archivio_f;
    }
    
    Spero mi sappiate dare una mano, grazie!

  2. #2
    Non scoraggiarti, ma codesto codice mette veramente i brividi... nel leggerlo mi si sono drizzate due dita di pelo sullo stomaco: il che fa davvero impressione se si pensa che programmo in C a livello di sistema per DOS, Unix, VMS e RTOS vari da prima che tu nascessi.

    Tralasciamo pure ogni considerazione inerente lo scrivere un gestionale-balocco in C, ché ormai criticare i programmi scolastici è uno sport nazionale tra i professionisti; tuttavia, non posso fare a meno di rimarcare che ti sei confuso inutilmente con la notazione, rendendo il codice poco mantenibile, e che le strutture dati andrebbero francamente riprogettate da zero.

    In particolare, l'elenco degli articoli (per quanto strani come righe fattura, poiché privi di quantità e altri campi, ma lasciamo correre) è un banale array di interi, che può essere allocato e popolato, e solo in seguito assegnato al puntatore nella struct che memorizza la fattura, con evidenti vantaggi (anche notazionali). La procedura più razionale, sebbene un tantino rigida, consiste quindi in:

    1) Chiedere preliminarmente all'utente quanti articoli intende inserire;

    2) Allocare un array d'interi di corrispondente dimensione;

    3) Popolare l'array con i codici articolo;

    4) Memorizzare l'indirizzo dell'array nel puntatore "prodotti" entro il record (struct) relativo alla fattura corrente.

    Questo a prescindere dalla gestione complessiva della memoria così allocata.

    Al di là di questo, l'intero "archivio" in realtà dovrebbe essere uno heap, emulato presumibilmente tramite un array di puntatori a strutture e un pool di memoria; il ricorso alla realloc dovrebbe essere eliminato o ridotto a casi limite (i.e. ridimensionamento dell'array base dello heap).
    ℹ️ Leggi di più su M.A.W. 1968 ...

  3. #3
    L'avatar di RedSkull
    RedSkull non è in linea Novello
    Il mio professore mi ha detto che tramite un ciclo l'utente deve dirlo sul momento se vuole aggiungere un'altro prodotto o meno, anch'io volevo fare come mi hai detto tu, ma forze maggiori mi impongono di fare il contrario, come risolvo il problema dell'assegnazione ? Perché penso sia dovuto ad un problema di parentesi...

  4. #4
    Il problema riscontrato con l'assegnazione è decisamente un problema di sintassi. Si risolve comunque con un puntatore ad un array allocato dinamicamente sul momento. E' possibile salvare contemporaneamente la capra e i cavoli usando una preallocazione, come nel seguente esempio indicativo:
       aux_p = (int *)malloc(MAX_VOCI * sizeof(int));
       if (NULL == aux_p) {// Error Handling}
       n_p = 0;
       do
       {
          do
          {
             printf("Inserisci il codice del prodotto da inserire nella fattura: ");
             scanf("%d",&codice);
             if((posi = cerca(codice,archivio_p,num_p)) == -2)
                printf("Codice corrispondente a nessun prodotto.\n");
             else
                printf("Codice corrispondente a %s\n",(archivio_p+posi)->nome);
          } while (posi == -2);
          aux_p[n_p] = codice;
          printf("Prodotto inserito!\nVuoi inserire altri prodotti all'interno della fattura ? (S/N)\n");
          scanf("%c", &again);
          if ('s' == tolower(again))
          {
             n_p++;
          } 
       } while('n' != tolower(again)); 
       /* Qui è possibile effettuare una realloc di aux_p usando n_p come nuova dimensione, 
           e infine si effettua l'assegnazione fondamentale */
       (archivio_f + (*num))->prodotti = aux_p;
    
    ℹ️ Leggi di più su M.A.W. 1968 ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Problema assegnazione recordset
    Da camp nel forum Visual Basic 6
    Risposte: 18
    Ultimo Post: 27-10-2019, 06:52
  2. Problema con assegnazione del fuoco a controllo
    Da brambilladiego878 nel forum Microsoft Access
    Risposte: 2
    Ultimo Post: 18-01-2015, 21:51
  3. Risposte: 2
    Ultimo Post: 03-11-2013, 08:28
  4. Problema con assegnazione valore
    Da krossk2 nel forum Visual Basic .Net
    Risposte: 10
    Ultimo Post: 01-09-2010, 10:20
  5. Problema assegnazione schema provider db2oledb/ibmdadb2.1
    Da Lavez84 nel forum Visual Basic .Net
    Risposte: 0
    Ultimo Post: 20-11-2007, 11:55