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

    [C] Multiple Definition

    Ciao a tutti,

    sono all inizio con lo sviluppo di un software con Dev-Cpp

    ho tre file, di cui un file header e due files sorgente.

    Vi posto il codice

    Codice PHP:
    DICHIARAZIONI.H

    char 
    vettore[8]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};


    // Dichiarazione delle funzioni

    long  Convertinumero (void);

    MAIN.C

    #include <stdio.h>
    #include <stdlib.h>
    #include "\programmi\Dev-Cpp\Progetti\Nokia\dichiarazioni.h"
    int main(int argcchar *argv[])
    {
      
    Convertinumero();
      
    system("PAUSE");    
      return 
    0;
    }


    FUNZ.C

    #include "\programmi\Dev-Cpp\Progetti\Nokia\dichiarazioni.h"

    long  Convertinumero (void)
    {
     
     
    char stringa[80]={"MATTEO"},carattere;
     
    int i,j,k,lunghezzaparola;
     
    unsigned long int Convertito=0;

      
    lunghezzaparola=strlen(stringa);
      
    lunghezzaparola--;
      for(
    k=0;stringa[k]!='\0';k++)  // scorri tutta la stringa
      
    {
       
    carattere=tolower(stringa[k]); //assegna a carattere stringa di k convertendo tutto in carattere minusc.
       
    for(i=0;i<=7;i++)              // scorri il vettore con le associazioni tra numeri e lettere
       
    {
          
    j=0;
          while(
    vettore[i][j]!='\0')   // scorri il singolo numero
           
    {
            
            if(
    carattere==vettore[i][j])
             {
                    
    Convertito=(unsigned long int)(Convertito+(i+2)*pow(10,lunghezzaparola));
                    
    lunghezzaparola--;
                    
    i=8;
                    break;
             }
           
    j++;
           }    
       }
      }
      
    printf("Numero %ld\n\n",Convertito);
         
     
      
     return 
    0;

    ora questi tre file fanno parte di un progetto, a lavoro il compilatore li linka tranquillamente, a casa non linka e dice "Multiple definition for vettore in file funz.c" Le cose assurde, a mio modesto parare, sono due:

    1) ho cambiato il nome di vettore e il compilatore non da piu uno straccio di errore, anzi il programma funziona correttamete

    2) Ma dove diavolo ha visto la definizione multilpa di vettore?

    Grazie a tutti dell eventuale aiuto!!!!

    Salutiz

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Nei file di include non si dovrebbero mai definire variabili o funzioni!!!
    Tu nel file di include hai definito una variabile 'vettore', ed essendo l'header incluso da 2 sorgenti, in ognuno dei 2 moduli oggetto generati dal compilatore ci sarà questa variabile. A quel punto il linker .... beh, hai già capito ...
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Bhe è possibile comunque dichiarare funzioni e variabili in un file header, a patto che ci sia un sistema ben definito di header che eviti degli autoinclude.
    La parola chiave extern e le dichiarazioni anticipate servono proprio a questo.
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da XWolverineX
    Bhe è possibile comunque dichiarare funzioni e variabili in un file header, a patto che ci sia un sistema ben definito di header che eviti degli autoinclude.
    Certo ... ma non ha molto senso e infatti non lo fa nessuno.

    Originariamente inviato da XWolverineX
    La parola chiave extern e le dichiarazioni anticipate servono proprio a questo.
    Un modo corretto di gestire la cosa è il seguente:

    mioheader.h
    codice:
    #ifndef MIOHEADER_H
    #define MIOHEADER_H
    
    extern int mioint;
    extern void prova (void);
    
    #endif
    sorgente1.c
    codice:
    #include <stdio.h>
    #include "mioheader.h"
    
    int main (void)
    {
        printf ("%d\n", mioint);
    
        prova ();
    
        return 0;
    }
    sorgente2.c
    codice:
    int mioint;
    
    void prova (void)
    {
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Nessuno proprio no...
    Se non erro, ripeto, se non erro , cout e cin sono 2 oggetti delle classi istream e ostream e sono dichiarati proprio in un include!
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Originariamente inviato da XWolverineX
    Nessuno proprio no...
    Se non erro, ripeto, se non erro , cout e cin sono 2 oggetti delle classi istream e ostream e sono dichiarati proprio in un include!
    :rollo: Ma cin e cout non sono definite negli include!!! Nell'include "iostream" infatti ci trovi:

    (sul VC++)
    ...
    extern _CRTIMP2 istream cin, *_Ptr_cin;
    extern _CRTIMP2 ostream cout, *_Ptr_cout;
    ...

    (su Linux)
    ...
    extern istream cin;
    extern ostream cout;
    ...

    Cioè non sono definizioni ma allusioni.

    Una "definizione" comporta una allocazione di memoria da parte del compilatore. Una "allusione" invece informa solo che la variabile o funzione è definita altrove.

    Scusa se te lo dico ma forse è meglio se leggi qualche manuale sul C.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Originariamente inviato da andbin
    Nei file di include non si dovrebbero mai definire variabili o funzioni!!!
    Tu nel file di include hai definito una variabile 'vettore', ed essendo l'header incluso da 2 sorgenti, in ognuno dei 2 moduli oggetto generati dal compilatore ci sarà questa variabile. A quel punto il linker .... beh, hai già capito ...
    ah ok grazie AndBin questo proprio non lo sapevo. Super suggerimento! Thanks!
    Pero mi chiedo, se non servono a definire almeno le funzioni a cosa servono?

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Originariamente inviato da andbin
    Scusa se te lo dico ma forse è meglio se leggi qualche manuale sul C.
    Uff ma qui un buon 2/3 del forum appena uno sbaglia una cosa scrivono
    Meglio che ti compri un buon manuale sul linguagigodaimparare
    Ad ogni modo attenzione:
    so benissimo cosa significa extern, ecco perchè ho scritto se non erro in quanto ricordavo una cosa del genere, ma non se era sul .h o sul .cpp
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  9. #9
    Originariamente inviato da UltraBeginner
    Pero mi chiedo, se non servono a definire almeno le funzioni a cosa servono?
    Servono a dichiararle; quando definisci una funzione indichi al compilatore il codice che verrà eseguito quando verrà chiamata, quando la dichiari (con il suo prototipo) indichi solo al compilatore che da qualche parte (magari in un altro modulo oggetto) esiste una funzione con quel nome, quei parametri e quel tipo di ritorno; toccherà poi eventualmente al linker mettere insieme i pezzi.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.