Struttura progetto e gestione liste

di il
3 risposte

Struttura progetto e gestione liste

Buongiorno,

sto utilizzando Dev-c++ e devo realizzare il seguente esercizio;
creare un programma che legga da file un elenco di dati e lo inserisca in una lista.
I vincoli sono:
1)-utilizzare un file di nome "variabili.h" nel quale dichiarare le variabili globali;
2)-utilizzare tanti file .c quante sono le funzioni

Il mio primo problema è che non capisco dove sto sbagliando ma non riesco a compilare con esito positivo la prima parte del progetto. Questo il codice del file "VARIABILI.H"

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

FILE *SalvaDati;                             
FILE *LeggiDati;

typedef struct struNodo
{
        int dato;
        struct struNodo *prossimo;
}nodo;

nodo *nuovo_nodo(void)
{
     return(nodo *)malloc(sizeof(nodo));
}
questo il main.c

int main(){
    nodo *lista_persone; 
    printf("Caricamento dati da file alla lista ....\n\n");
    lista_persone = leggiFile_popolaLista();

    system("PAUSE");	
    return 0;
}
questo il file leggidati.c

#include "variabili.h"

nodo *leggiFile_popolaLista()
{
     nodo *lst;
     int primodato;
     
     LeggiDati = fopen(FileArchivio, "r");
     if (LeggiDati != NULL)
     {
          fscanf(LeggiDati, "%d", &primoDato);
          if (primoDato == 0)
          {
             fclose(LeggiDati);
             lst = NULL;
          }
          else
          {
              lst = nuovo_nodo();
              [... qui gestisco la lista ...]
              return lst;
          }
     }
     else printf("File inesistente o errore nome file!\n");
     return lst;
}
compilando mi restituisce due errori:
il primo nel main alla riga
lista_persone = leggiFile_popolaLista();
dove mi dice:
C:\.....\main.c [Warning] assignment makes pointer from integer without a cast

il secondo nel file variabili.h quando definisco nodo *nuovo_nodo(void) ecc..
C:\.....\variabili.h multiple definition of `nuovo_nodo'

Qualcuno per cortesia riesce a darmi qualche dritta su dove sto sbagliando il ragionamento??
Grazie mille, saluti.

3 Risposte

  • Re: Struttura progetto e gestione liste

    1)Cambia ide e passa a Code::Blocks
    Nell'header:
    2) non ci vanno funzioni.
    3)Bisogna usare i costrutti del preprocessore #if per evitare di ricaricare tale file piu volte.
  • Re: Struttura progetto e gestione liste

    Grazie vbextreme per le info pero ...
    non ho capito. A parte cambiare il tool di sviluppo (Code Blocks lo conosco ho scaricato la v12.11 se non erro ... ma ora su due piedi non posso usarlo per questo sviluppo), potresti spiegarmi meglio cosa intendi per non ci vanno funzioni (quindi penso di untuire che la stessa funzione se usata in più moduli .c dovrò replicarla più volte) ma soprattutto cosa intendi per "Bisogna usare i costrutti del preprocessore #if per evitare di ricaricare tale file piu volte." Grazie 1000 buona giornata
  • Re: Struttura progetto e gestione liste

    Il file header è un file di intestazione,piu umanamente è un file che dichiara qualcosa e NON spiega il funzionamento di niente!
    Ogni qualvolta il compilatore trova la seguente riga:
    
    #include "mioheader.h"
    
    andrà a leggere e includere il contenuto,ma come fa a sapere se lo ha già incluso o meno?
    certamernte non lo fa da solo,ma lo devi istruire:
    Nel tuo .h
    
    #ifndef NOME_H_INCLUDED
    #define NOME_H_INCLUDED
    
    
    
    #endif // DD_H_INCLUDED
    
    Significa:
    Se non è definito NOME_H_INCLUDED
    Definisci NOME_H_INCLUDED
    ...
    eccc.....
    end
    Cosi il preprocessore nella clausola #ifndef capisce se hai già incluso o meno il file.
    Da qui scaturisce il concetto di scaricarti un buon ide che include automaticamente tale costrutti al momento in cui crei un nuovo file header.

    Come già detto il file header serve per dichiarare e quindi puoi avere un unico .h che dichiari prototipi anche compresi in molteplici file.
    Per fare in modo che un file veda l'altro allora bastera includere l'header.

    MIOH.h
    
    #ifndef MIOH_H_INCLUDED
    #define MIOH_H_INCLUDED
    
        void fncA(void);
        void fncB(void);
    
    #endif
    
    FILE1.c
    
    #include "mioh.h"
    
    void fncA(void)
    {
        printf("sono in fncA\n");
    }
    


    FILE2.c
    
    #include "mioh.h"
    
    void fncB(void)
    {
        printf("sono in fncB\n");
    }
    
    FILE0.c
    
    #include "mioh.h"
    
    int main(void)
    {
        fncA();
        fncB();
    }
    
    In questo caso potevo omettere di includere l'header dal file1 e 2 ma non nel file 0.
    Nell'header vanno quindi incluse quelle dichiarazioni comuni a piu file.
Devi accedere o registrarti per scrivere nel forum
3 risposte