Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C] Coda FIFO

  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    148

    [C] Coda FIFO

    Ciao, dovrei fare un programma per la gestione di code FIFO che funzioni sia per interi che per stringhe.

    L'interfaccia del file della coda fifo e il seguente:
    coda.h
    codice:
    #ifndef _CODA_H
    #define _CODA_H
    
    
    
    typedef struct queue *Q;
    
    Q QUEUEinit(int maxN);
    int QUEUEempty(Q q);
    void QUEUEput(Q q, Item item);
    Item QUEUEget(Q q);
    void QUEUEprint(Q q);
    
    #endif

    coda.c
    Sto facendo la prova di una coda fifo fi stringhe, quindi utilizzo il file stringhe.h e il relativo stringhe.c per la gestione dei dati.
    codice:
    #include<stdlib.h>
    
    #include "coda.h"
    #include "stringhe.h"
    
    
    
    typedef struct QUEUEnode* link;
    struct QUEUEnode
    {
        Item item;
        link next;
    };
    struct queue
    {
        link head;
        link tail;    /*ultimo nodo della lista*/
    };
    
    link NEW(Item item, link next)
    {
        link x = malloc(sizeof *x);
        x->item = item;
        x->next = next;
        return x;
    }
    
    
    
    
    Q QUEUEinit(int maxN)
    {
        Q q = malloc(sizeof *q);
        q->head = NULL;
        return q;
    }
    
    
    
    
    
    int QUEUEempty(Q q)
    {
        return q->head == NULL;
    }
    
    
    
    
    void QUEUEput(Q q, Item item)
    {
        link x;
    
        if(q->head == NULL)   /*lista vuota*/
        {
            x = NEW(item, q->head);
            q->tail = x;              
            q->head = q->tail;
            return;
        }
    
        x = NEW(item, q->tail->next);   /*lista non vuota*/
        q->tail->next = x;
        q->tail = q->tail->next;
    }
    
    
    
    
    Item QUEUEget(Q q)
    {
        Item item = q->head->item;
        link t = q->head->next;
        free(q->head);
        q->head = t;
        return item;
    }
    
    void QUEUEprint(Q q)
    {
      link x;
      for(x = q->head; x!=NULL; x = x->next)
          print_dato(x->item);
    
    
    }
    stringhe.c

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    
    #include "stringhe.h"
    
    Item* data_read(FILE *fp, int* ndati)
    {
    
        Item* vett;
        char str[100];
        int i;
    
        
        (*ndati)=0;
        while (fscanf(fp,"%s",str)!=EOF)
            (*ndati)++;
    
        rewind(fp);
    
        vett = (Item*)malloc((*ndati) * sizeof(Item));
        if (vett==NULL)
        {
            printf("Errore allocazione memoria\n");
            exit(-1);
        }
        for (i=0; i<(*ndati); i++)
        {
            fscanf(fp,"%s",str);
            vett[i] = strdup(str);
           // vett[i] = (Item)malloc((strlen(str)+1) * sizeof(char));
            if (vett[i]==NULL)
            {
                printf("Errore allocazione memoria\n");
                exit(-1);
            }
            strcpy(vett[i], str);
    
        }
        fclose(fp);
        return vett;
    }
    
    
    
    
    
    
    void print(Item* vett, int ndati)
    {
        int i;
    
        for (i=0; i<ndati; i++)
            printf("%s\n", vett[i]);
    
        return;
    }
    
    
    
    
    
    
    
    
    
    
    
    Item acq_dato()
    {
        char item[100],*str;
        scanf("%s", item);
        str = strdup(item);
        return str;
    
    }
    
    
    
    
    
    
    
    void print_dato(Item item)
    {
        printf("Dato: %s\n", item);
        return;
    }

    Il compilatore mi genera i seguenti errori:


    Syntax error before "Item" (relativo alla riga QUEUEput del coda.h)
    Syntax errore before QUEUEget, (relativo alla riga QUEUEget del coda.h)

    Mi sapreste dire dove caspita è l'errore??? Cosa sbaglio?
    Grazie

  2. #2
    Prova a spostare
    Codice PHP:
    typedef struct QUEUEnodelink;
    struct QUEUEnode
    {
        
    Item item;
        
    link next;
    };
    struct queue
    {
        
    link head;
        
    link tail;    /*ultimo nodo della lista*/
    }; 
    dal file coda.c all'inizio di coda.h.

    Dato che ci sei in coda.h rinomina l'etichetta "_CODA_H" in "CODA_H": gli identificatori con underscore prefissi sono riservati al compilatore.

    EDIT: Item che cos'è? non vedo la sua definizione di tipo.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    148
    Originariamente inviato da MacApp
    Prova a spostare
    Codice PHP:
    typedef struct QUEUEnodelink;
    struct QUEUEnode
    {
        
    Item item;
        
    link next;
    };
    struct queue
    {
        
    link head;
        
    link tail;    /*ultimo nodo della lista*/
    }; 
    dal file coda.c all'inizio di coda.h.

    Dato che ci sei in coda.h rinomina l'etichetta "_CODA_H" in "CODA_H": gli identificatori con underscore prefissi sono riservati al compilatore.

    EDIT: Item che cos'è? non vedo la sua definizione di tipo.

    Item è ad esempio una stringa.
    Comunque, ho provato a fare un programma che gestisca una semplice coda di interi, quindi ho usato solamente il file coda.h e coda.c; e funziona tutto!
    Il problema sta proprio nel fatto di usare sia coda. h sia stringa.h.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ma il tipo Item dove e' definito?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2006
    Messaggi
    148
    Nel file stringhe.h che però non ho postato:

    stringhe.h
    codice:
    /* TIPO STRINGA*/
    
    #include<string.h>
    
    #ifndef STRINGHE_H
    #define STRINGHE_H
    
    #define eq(A,B) (strcmp(A,B))   /* confronto */
    
    typedef char* Item;
    
    
    Item* data_read(FILE *fp, int* ndati);   /*lettura da file*/
    void print(Item* vett, int ndati);    /*stampa vettore*/
    Item acq_dato();             /*acquisisce dato da tastiera*/
    void print_dato(Item item)    /*stampa dato*/
    
    #endif

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,466
    Ma in coda.h non c'e' "notizia" di Item ... prova in coda.c a scrivere

    #include "stringhe.h"
    #include "coda.h"

    al contrario ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.