Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Problema compilazione due moduli

    Scusate ho un problema con la compilazione di due moduli, praticamnete nel progetto ho due file:

    main.c:
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    
    #define COST_NUM_CHAR 30           //Costante utilizzata per indicare il numero massimo dei caratteri nella stringa
    #define COST_ELEM_MAX 20           //Costante utilizzata per indicare il numero massimo degli elementi nel vettore
    
    
    
    typedef char string[COST_NUM_CHAR];  //definizione di un nuovo tipo di dato chiamato "string"    
    
    typedef enum{FALSE, TRUE} BOOLEAN;   /*definizione di un nuovo tipo di dato chiamato "BOOLEAN" avente due soli 
                                           valori accettati: "FALSE" (valore 0) e "TRUE" (valore 1)*/
    
    void stampa(BOOLEAN RITORNO_ADD);   //funzione per avvisare l'utente se l'inserimento dei dati è avvenuto con successo  
    struct StringPool acquisizione(); //funzione per far inserire all'utente i dati
    
    struct StringPool
    	{                                 //Struttura contenente due tipi di dati:         
    		int identifier;               //"identifier":dato di tipo int     
    		string str;                   //"str":dato di tipo string
    	};
    struct StringPool sp[COST_ELEM_MAX];  //definizione del vettore globale "sp" di grandezza "COST_ELEM_MAX"      
                                          //di tipo "StringPool"
    #include "stringpool.c"    
    int main()
    {
        BOOLEAN NEW_INPUT=TRUE;
        BOOLEAN RITORNO_ADD;                //definizione variabili
        struct StringPool TEMP_DATA;
        int I=0;
        
        for(I=0;I<COST_ELEM_MAX;I++)
        {
           *sp[I].str='\0';               //ciclo utilizzato per inizializzare il vettore "sp" con i seguenti valori:
           sp[I].identifier=-1;           //il campo "identifier" viene inizializzato con il valore "-1"
        }                                 //il campo "str" viene inizializzato con la stringa vuota
         
        
        for(I=0;I<COST_ELEM_MAX && NEW_INPUT==TRUE;I++)
        {
           do{                     
               /*questo ciclo do-while viene eseguito per far inserire all'utente i dati.
               ciclerà fino a quando i dati immessi dall'utente non saranno inseriti nel vettore (cioè se si verifica
               la seguente condizione: RITORNO_ADD==FALSE) e se l'utente vorrà inserire nuovi dati 
               (ciè se si verifica la seguente condizione:NEW_INPUT==TRUE)*/
                                   
               TEMP_DATA=acquisizione();   //viene chiamata la funzione "acquisizione" che ritorerà un dato di tipo 
                                           //StringPool che verrà salvato nella variabile "TEMP_DATA" 
             
               //QUI SI CHIAMA LA FUNZIONE ADD CHE RITORNA UN VALORE BOOLEAN ALLA VARIABILE RITORNO_ADD E SI INVIA
               //COME PARAMETRO LA VARIABILE TEMP_DATA
               add(TEMP_DATA.identifier,TEMP_DATA.str);//Richiamo la funzione add della libreria stringpool.c
             
               stampa(RITORNO_ADD);        //viene chiamata la funzione "stampa" che manderà a schermo un diverso
                                           //messaggio in base all'esito dell'inserimento  
             
               printf("\n Si vuole inserire un nuovo dato? (0=NO, 1=SI)");
               do{ 
                  scanf("%d",&NEW_INPUT);                                 //ciclo che chiede all'utente se si vuole
                 }while(NEW_INPUT<0 || NEW_INPUT>1);                      //inserire un nuovo dato.Il ciclo verrà 
                                                                          //eseguito fino a quando non si inserirà
                                                                          // o 1 o 0
                                                                          
             }while((NEW_INPUT==TRUE) && (RITORNO_ADD==FALSE));
        }                        
        
        system("pause");
        
    }
        
    struct StringPool acquisizione()
    {
           struct StringPool TEMP_DATA;
           
           do{
                printf("\nInserire l'ID");                     //ciclo per l'inserimento dell'ID.Ciclerà
                scanf("%d",&TEMP_DATA.identifier);             //fino a quando non verrà immesso un numero positivo
             }while(TEMP_DATA.identifier<0);
           
           do{          
                printf("\nInserire la stringa");               //ciclo per l'inserimento della stringa.Ciclerà
                scanf("%s",TEMP_DATA.str);                     //fino a quando non verrà immessa una stringa 
             }while(*TEMP_DATA.str=='\0');                     //diversa dalla stringa vuota
             
          return(TEMP_DATA);   
    }       
    
    void stampa(BOOLEAN RITORNO_ADD)
    {
       if(RITORNO_ADD==1)                
          printf("\nL'inserimento dei dati è avvenuto con successo");
       
       else
          printf("\nErrore: inserimento non avvenuto"); 
          
          /*in base all'avvenuto inserimento dei dati nel vettore, verrà stampato a video un messaggio diverso*/
                            
       system("pause");
    }
    ed una libreria chiamata stringpool.c:

    codice:
    BOOLEAN add (int identifier, string str);
    
    BOOLEAN add (int identifier, string str)
    {
        int spazio_vettore = -1; //Indice di controllo presenza spazio libero
        int i; //Indice per il ciclo for di scansione
        /*Se identifier hanno dati non corretti ritorna false*/
        if((identifier < 1) || (strcmp(str,"") != 0))
        {
           return 0;     
        }
        /*Controlla da 0 a minore del numero massimo di elementi
        che l'identifier non è dupplicato e che ci sia almeno uno spazio vuoto
        per l'inserimento*/
        for(i=0;i<COST_ELEM_MAX;i++)
        {
         //se l'indice è dupplicato ritorna false
            if(identifier == sp[i].identifier)    
            {
               return 0;              
            }             
         //in caso di presenza di spazio vuoto, segna la prima posizione libera
            if(sp[i].identifier == -1)
            {
               spazio_vettore = i;                    
            }       
        }
        
        //se tutto è andato a buon fine alloca i dati nella struttura
        if(spazio_vettore > -1)
        {
            sp[spazio_vettore].identifier = identifier;
            return 1;                
        }
        else
        {
            return 0;    
        }
        
        
        
    }
    E nel main sono dichiarate delle variabili globali che poi utilizzerà anche la libreria. Alla compilazione però il compilatore dice nella libreria che le variabili non sono state dichiarate e da errore. Come posso risolvere?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Ciao, il tuo programma è molto disordinato quindi coordinare tutto, in quella maniera, è difficile e controproduttivo. Io ti consiglio di evitare la definizione di variabili globali (mi riferisco ad sp).
    Inoltre il tipo booleano esiste, in stdbool.h.

    Ho semplicemente spostato le parti del tuo programma nei diversi file. Un modo può essere questo:

    File global.h - ci metti tutto quello che deve essere visibile globalmente
    Codice PHP:
    #ifndef GLOBAL_H
    #define GLOBAL_H

    #define COST_NUM_CHAR 30
    #define COST_ELEM_MAX 20

    #define COST_NUM_CHAR 30
    #define COST_ELEM_MAX 20

    typedef char string[COST_NUM_CHAR];  //definizione di un nuovo tipo di dato chiamato "string"
    struct StringPool sp[COST_ELEM_MAX];  //definizione del vettore globale "sp" di grandezza "COST_ELEM_MAX" di tipo "StringPool" 

    #endif 

    File stringpool.h
    Codice PHP:
    #ifndef STRINGPOOL_H
    #define STRINGPOOL_H

    #include <stdbool.h>
    #include "global.h"

    struct StringPool
    {
        
    int identifier;
        
    string str;
    };

    bool add (int identifierstring str);

    #endif 
    File stringpool.c
    Codice PHP:
    #include "stringpool.h"

    bool add (int identifierstring str)
    {
        
    int spazio_vettore = -1//Indice di controllo presenza spazio libero
        
    int i//Indice per il ciclo for di scansione
        /*Se identifier hanno dati non corretti ritorna false*/
        
    if((identifier 1) || (strcmp(str,"") != 0))
        {
           return 
    0;     
        }
        
    /*Controlla da 0 a minore del numero massimo di elementi
        che l'identifier non è dupplicato e che ci sia almeno uno spazio vuoto
        per l'inserimento*/
        
    for(i=0;i<COST_ELEM_MAX;i++)
        {
         
    //se l'indice è dupplicato ritorna false
            
    if(identifier == sp[i].identifier)    
            {
               return 
    0;              
            }             
         
    //in caso di presenza di spazio vuoto, segna la prima posizione libera
            
    if(sp[i].identifier == -1)
            {
               
    spazio_vettore i;                    
            }       
        }
        
        
    //se tutto è andato a buon fine alloca i dati nella struttura
        
    if(spazio_vettore > -1)
        {
            
    sp[spazio_vettore].identifier identifier;
            return 
    1;                
        }
        else
        {
            return 
    0;    
        } 

    File main.c
    Codice PHP:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    #include <stdbool.h>

    #include "global.h"
    #include "stringpool.h"

    void stampa(bool RITORNO_ADD);   //funzione per avvisare l'utente se l'inserimento dei dati è avvenuto con successo  
    struct StringPool acquisizione(); //funzione per far inserire all'utente i dati

    int main()
    {
        
    bool NEW_INPUT=true;
        
    bool RITORNO_ADD;                //definizione variabili
        
    struct StringPool TEMP_DATA;
        
    int I=0;
        
        for(
    I=0;I<COST_ELEM_MAX;I++)
        {
           *
    sp[I].str='\0';               //ciclo utilizzato per inizializzare il vettore "sp" con i seguenti valori:
           
    sp[I].identifier=-1;           //il campo "identifier" viene inizializzato con il valore "-1"
        
    }                                 //il campo "str" viene inizializzato con la stringa vuota
         
        
        
    for(I=0;I<COST_ELEM_MAX && NEW_INPUT==true;I++)
        {
           do{                     
               
    /*questo ciclo do-while viene eseguito per far inserire all'utente i dati.
               ciclerà fino a quando i dati immessi dall'utente non saranno inseriti nel vettore (cioè se si verifica
               la seguente condizione: RITORNO_ADD==false) e se l'utente vorrà inserire nuovi dati 
               (ciè se si verifica la seguente condizione:NEW_INPUT==true)*/
                                   
               
    TEMP_DATA=acquisizione();   //viene chiamata la funzione "acquisizione" che ritorerà un dato di tipo 
                                           //StringPool che verrà salvato nella variabile "TEMP_DATA" 
             
               //QUI SI CHIAMA LA FUNZIONE ADD CHE RITORNA UN VALORE bool ALLA VARIABILE RITORNO_ADD E SI INVIA
               //COME PARAMETRO LA VARIABILE TEMP_DATA
               
    add(TEMP_DATA.identifier,TEMP_DATA.str);//Richiamo la funzione add della libreria stringpool.c
             
               
    stampa(RITORNO_ADD);        //viene chiamata la funzione "stampa" che manderà a schermo un diverso
                                           //messaggio in base all'esito dell'inserimento  
             
               
    printf("\n Si vuole inserire un nuovo dato? (0=NO, 1=SI)");
               do{ 
                  
    scanf("%d",&NEW_INPUT);                                 //ciclo che chiede all'utente se si vuole
                 
    }while(NEW_INPUT<|| NEW_INPUT>1);                      //inserire un nuovo dato.Il ciclo verrà 
                                                                          //eseguito fino a quando non si inserirà
                                                                          // o 1 o 0
                                                                          
             
    }while((NEW_INPUT==true) && (RITORNO_ADD==false));
        }                        
        
        
    system("pause");
        
    }
        
    struct StringPool acquisizione()
    {
           
    struct StringPool TEMP_DATA;
           
           do{
                
    printf("\nInserire l'ID");                     //ciclo per l'inserimento dell'ID.Ciclerà
                
    scanf("%d",&TEMP_DATA.identifier);             //fino a quando non verrà immesso un numero positivo
             
    }while(TEMP_DATA.identifier<0);
           
           do{          
                
    printf("\nInserire la stringa");               //ciclo per l'inserimento della stringa.Ciclerà
                
    scanf("%s",TEMP_DATA.str);                     //fino a quando non verrà immessa una stringa 
             
    }while(*TEMP_DATA.str=='\0');                     //diversa dalla stringa vuota
             
          
    return(TEMP_DATA);   
    }       

    void stampa(bool RITORNO_ADD)
    {
       if(
    RITORNO_ADD==1)                
          
    printf("\nL'inserimento dei dati è avvenuto con successo");
       
       else
          
    printf("\nErrore: inserimento non avvenuto"); 
          
          
    /*in base all'avvenuto inserimento dei dati nel vettore, verrà stampato a video un messaggio diverso*/
                            
       
    system("pause");


    Compila il tutto con:
    codice:
    >> gcc stringpool.c -c
    >> gcc main.c -c
    >> gcc main.o stringpool.o -o main

  3. #3
    Non è che è proprio il codice:

    [CODE
    #ifndef GLOBAL_H
    #define GLOBAL_H
    [/CODE]

    Che mi permette di non avere delle "doppie dichiarazioni"? perchè io appunto ho provato a fare il file .h con tutte le variabili da includere ma poi includendole in entrambi i moduli mi dava errore dicendo che "c'erano dichiarazioni doppie". Basta che aggiungo quelle quindi?

    Comunque il problema è che un progetto con delle "ben distinte" specifiche da seguire, per questo "è ben disordinato".

    Il punto dell'esercitazione (università) è proprio fare un codice con delle specifiche di merda, ma il meglio possibile, in modo da poter nel corso delle esercitazioni vedere se "si riesce a modificarlo o meno".

    Si è intricata la cosa da spiegare
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  4. #4
    Ho provato ad editare così:

    definition.h
    codice:
    #ifndef DEFINITION_H
    #define DEFINITION_H 
    
    #define COST_NUM_CHAR 30           //Costante utilizzata per indicare il numero massimo dei caratteri nella stringa
    #define COST_ELEM_MAX 20           //Costante utilizzata per indicare il numero massimo degli elementi nel vettore
    
    
    
    typedef char string[COST_NUM_CHAR];  //definizione di un nuovo tipo di dato chiamato "string"    
    
    typedef enum{FALSE, TRUE} BOOLEAN;   /*definizione di un nuovo tipo di dato chiamato "BOOLEAN" avente due soli 
                                           valori accettati: "FALSE" (valore 0) e "TRUE" (valore 1)*/
    
    void stampa(BOOLEAN RITORNO_ADD);   //funzione per avvisare l'utente se l'inserimento dei dati è avvenuto con successo  
    struct StringPool acquisizione(); //funzione per far inserire all'utente i dati
    
    struct StringPool
    	{                                 //Struttura contenente due tipi di dati:         
    		int identifier;               //"identifier":dato di tipo int     
    		string str;                   //"str":dato di tipo string
    	};
    struct StringPool sp[COST_ELEM_MAX];  //definizione del vettore globale "sp" di grandezza "COST_ELEM_MAX"      
                                          //di tipo "StringPool"
    #endif
    main.c
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>
    #include <string.h>
    #include "definition.h"    
    #include "stringpool.c" 
    int main()
    {
        BOOLEAN NEW_INPUT=TRUE;
        BOOLEAN RITORNO_ADD;                //definizione variabili
        struct StringPool TEMP_DATA;
        int I=0;
        
        for(I=0;I<COST_ELEM_MAX;I++)
        {
           *sp[I].str='\0';               //ciclo utilizzato per inizializzare il vettore "sp" con i seguenti valori:
           sp[I].identifier=-1;           //il campo "identifier" viene inizializzato con il valore "-1"
        }                                 //il campo "str" viene inizializzato con la stringa vuota
         
        
        for(I=0;I<COST_ELEM_MAX && NEW_INPUT==TRUE;I++)
        {
           do{                     
               /*questo ciclo do-while viene eseguito per far inserire all'utente i dati.
               ciclerà fino a quando i dati immessi dall'utente non saranno inseriti nel vettore (cioè se si verifica
               la seguente condizione: RITORNO_ADD==FALSE) e se l'utente vorrà inserire nuovi dati 
               (ciè se si verifica la seguente condizione:NEW_INPUT==TRUE)*/
                                   
               TEMP_DATA=acquisizione();   //viene chiamata la funzione "acquisizione" che ritorerà un dato di tipo 
                                           //StringPool che verrà salvato nella variabile "TEMP_DATA" 
             
               //QUI SI CHIAMA LA FUNZIONE ADD CHE RITORNA UN VALORE BOOLEAN ALLA VARIABILE RITORNO_ADD E SI INVIA
               //COME PARAMETRO LA VARIABILE TEMP_DATA
               RITORNO_ADD = add(TEMP_DATA.identifier,TEMP_DATA.str);//Richiamo la funzione add della libreria stringpool.c
             
               stampa(RITORNO_ADD);        //viene chiamata la funzione "stampa" che manderà a schermo un diverso
                                           //messaggio in base all'esito dell'inserimento  
               
               printf("\n Si vuole inserire un nuovo dato? (0=NO, 1=SI)");
               do{ 
                  scanf("%d",&NEW_INPUT);                                 //ciclo che chiede all'utente se si vuole
                 }while(NEW_INPUT<0 || NEW_INPUT>1);                      //inserire un nuovo dato.Il ciclo verrà 
                                                                          //eseguito fino a quando non si inserirà
                                                                          // o 1 o 0
                                                                          
             }while((NEW_INPUT==TRUE) && (RITORNO_ADD==FALSE));
        }                        
        
        system("pause");
        
    }
        
    struct StringPool acquisizione()
    {
           struct StringPool TEMP_DATA;
           int errore_lettura; //flag di controllo per la lettura dell'id
           int leggi;
           do{
                printf("\nInserire l'ID");                     //ciclo per l'inserimento dell'ID.Ciclerà
                scanf("%d",&TEMP_DATA.identifier);
                
                            //fino a quando non verrà immesso un numero positivo
             }
             while(TEMP_DATA.identifier < 0);
           
           do{          
                printf("\nInserire la stringa");               //ciclo per l'inserimento della stringa.Ciclerà
                scanf("%s",TEMP_DATA.str);                     //fino a quando non verrà immessa una stringa 
             }while(*TEMP_DATA.str=='\0');                     //diversa dalla stringa vuota
             
          return(TEMP_DATA);   
    }       
    
    void stampa(BOOLEAN RITORNO_ADD)
    {
       if(RITORNO_ADD==1)                
       {
          printf("\nL'inserimento dei dati e' avvenuto con successo");
       }
       
       else
       {
          printf("\nErrore: inserimento non avvenuto"); 
       }
          
          /*in base all'avvenuto inserimento dei dati nel vettore, verrà stampato a video un messaggio diverso*/
    }
    e stringpool.c
    codice:
    #include "definition.h"
    BOOLEAN add (int identifier, string str);
    
    BOOLEAN add (int identifier, string str)
    {
        int spazio_vettore = -1; //Indice di controllo presenza spazio libero
        int i; //Indice per il ciclo for di scansione
        /*Se identifier hanno dati non corretti ritorna false*/
        if((identifier < 1) || (strcmp(str,"") == 0))
        {
           return FALSE;     
        }
        /*Controlla da 0 a minore del numero massimo di elementi
        che l'identifier non è dupplicato e che ci sia almeno uno spazio vuoto
        per l'inserimento*/
        for(i=0;i<COST_ELEM_MAX;i++)
        {
         //se l'indice è dupplicato ritorna false
            if(identifier == sp[i].identifier)    
            {
               return FALSE;              
            }             
         //in caso di presenza di spazio vuoto, segna la prima posizione libera
            if((sp[i].identifier == -1) && (spazio_vettore == -1))
            {
               spazio_vettore = i;                    
            }       
        }
        
        //se tutto è andato a buon fine alloca i dati nella struttura
        if(spazio_vettore > -1)
        {
            sp[spazio_vettore].identifier = identifier;
            strcpy(sp[spazio_vettore].str,str);
            //debug
            //for(i=0;i<COST_ELEM_MAX;i++)
            //{
            //printf("Debug[%d] %d - %s qqq \n",i,sp[i].identifier,sp[i].str);
            //}
            //debug
            return TRUE;                
        }
        else
        {
            return FALSE;    
        }
        
        
        
    }

    Ma mi da errore, mi dice "multiple definition of add".
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Non devi includere i sorgenti .c

    Elimina questa

    #include "stringpool.c"
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    Originariamente inviato da oregon
    Non devi includere i sorgenti .c

    Elimina questa

    #include "stringpool.c"
    Ahhh, praticamente in definition.h ho messo il prototipo della funzione inserita in "stringpool.c" e poi l'ho incluso in entrambi i sorgenti ed ora tutto va
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da Neptune
    ... ora tutto va
    Ora tutto va perchè ora tutto è impostato come dovrebbe ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Originariamente inviato da oregon
    Ora tutto va perchè ora tutto è impostato come dovrebbe ...
    E vi ringrazio, purtroppo non mi ero mai ritrovato a dover fare due moduli distinti. Una libreria .h da includere si.. ma dei moduli a parte mai.
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Originariamente inviato da Neptune
    E vi ringrazio, purtroppo non mi ero mai ritrovato a dover fare due moduli distinti. Una libreria .h da includere si.. ma dei moduli a parte mai.
    I file .h non sono librerie ... Rivedi il concetto di libreria e di file header ...
    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.