Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294

    c++] redefinition error

    Ciao a tutti.

    Ho un programma strutturato in questo modo.

    ho i seguenti file:

    relaxGenLatency.h
    relaxGenLatency.C
    main.C

    main.C e relaxGenLatency.C includono relaxGenLatency.h

    Uso poi una piccolissima utility scritta da me che serve per gestire gli indici degli archi
    di un grafo completo. I file sono indexes.h e indexes.C. Sono, stati compilati insieme ad altre utilities e poi archiviati in un file libGMLPutils

    relaxGenLatency include indexes.h

    Tutto funzionava.

    Ho deciso poi di arricchire la libreria con una nuova funzione che dato l'indice dell'arco calcola i nodi sorgente e destinazione. Per fare questo ho definito uno struct arco. Ecco il codice di indexes.h

    #ifndef MAT_INTEX
    ___#define MAT_INDEX

    #include <cmath>
    // ricorda, in c++ questa è definizione di tipo
    // QUESTA È LA DEFINIZIONE CHE MI CAUSA PROBLEMI
    struct arco{
    ___int s;
    ___int d;
    };

    int offset(int h, int k, int nnodes);
    int matIndex (int i, int j, int nnodes);
    void matNodes(int index, int nnodes, arco * a);
    #endif

    Se compilo, ottengo il seguente errore:
    g++4 -O3 -DIL_STD -Wall -msse2 -mfpmath=sse -I. -I/home/cplex/10.1.1/include -I/home/cplex/10.1.1/include -Iinclude -I/home/errico/gmlputils/include -c source/relaxGenLatency.C
    /home/errico/gmlputils/include/indexes.h:6: error: redefinition of 'struct arco'
    /home/errico/gmlputils/include/indexes.h:6: error: previous definition of 'struct arco'
    make: *** [relaxGenLatency.o] Error 1

    Eppure, usando un main.C che ho usato per debuggare la ibreria, funzionava tutto perfettamente!
    Dove sbaglio?

    Grazie,
    f
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  2. #2
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Il compilatore ti dice che sta incontrando per 2 volte la definizione di una stessa struct.
    Questo problema è dovuto al fatto che, includendo 2 volte un file .h (una volta nella classe, una volta nel file main), il compilatore trova 2 volte la struct.
    Risolvi quindi cosi:

    1) Semplicemente non includere il file .h nel tuo main.cpp. Poi aggiungi prima di tutto il programma una riga del tipo
    codice:
    struct nometuastruct;
    ed il linker farà il resto

    2) Aggingi nel file .h delle direttive preprocessore che impediscano il doppio include.
    codice:
    #ifndef TUOFILE_H
    #define TUOFILE_H
    //codice
    #endif
    e se hai visual c++, metti pure subito dopo il define un bel
    codice:
    #pragma once
    "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

  3. #3
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    Grazie per la risposta.

    Il compilatore ti dice che sta incontrando per 2 volte la definizione di una stessa struct.
    Questo problema è dovuto al fatto che, includendo 2 volte un file .h (una volta nella classe, una volta nel file main), il compilatore trova 2 volte la struct.
    Risolvi quindi cosi:

    1) Semplicemente non includere il file .h nel tuo main.cpp
    Non è vero: come dicevo nel primo post, nel main non includo indexes.h

    Le direttive #ifndef #define #endif sono già inserite in tutti i punto h.

    2) Aggingi nel file .h delle direttive preprocessore che impediscano il doppio include.
    Anche questo lo facevo già.

    Poi aggiungi prima di tutto il programma una riga del tipo
    codice:

    struct nometuastruct;
    Che scopo ha? Comunque ho provato a metterlo nel main (era li' che intendevi, no?)
    ed ottengo comunque l'errore di compilazione.

    Infine, non uso visual c++
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    A questo punto potrebbe anche esistere, da qualche altra parte, una struttura che si chiama arco ...

    Fai la prova a chiamare la struttura

    arco2

    e ricompilare ...

  5. #5
    Utente di HTML.it L'avatar di fausto
    Registrato dal
    Jun 2002
    Messaggi
    294
    gia' fatto:
    infatti prima lo chiamavo "arc"...
    laptop asus L5800C
    slackware 11.0 kernel 2.6.17

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    A questo punto non sarebbe da escludere un bug del compilatore ...

    Potresti provare a compilare con un altro compilatore (ma non mi dire che l'hai gia' fatto e non ce lo hai detto ... )

  7. #7
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Sarei curioso, a questo punto, di vedere il codice completo
    "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

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: c++] redefinition error

    Originariamente inviato da fausto

    #ifndef MAT_INTEX
    ___#define MAT_INDEX
    Il compilatore ha ragione. Le macro sono diverse.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Gia' ... non me ne ero accorto ... (e non solo io) ...

    #ifndef MAT_INTEX
    ___#define MAT_INDEX



  10. #10
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    Urgh è vero.
    "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

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.