Inspiegabile errore 'undefined reference to ...'

di Anonimizzato21875 il
4 risposte
Buonasera.
Mi sono riavvicinato alla programmazione dopo diversi mesi di sospensione. Sono un vecchio programmatore che ha iniziato il suo hobby con l'assembler per l'IBM 360/370 e 7090. Nella mia stupidità, credevo che i miei pregressi fossero sufficienti per inoltrarmi nel c++, ma mi sbagliavo: ci sono troppe cose che non so e non riesco a risolvere. Inizio col dirvi quello che non mi fa andare avanti.
Innanzi tutto: sono su Linux, con l'IDE Qt-Creator impostato per usare Gtkmm e le maschere video realizzate con Glade. Veniamo al dunque.
Ho una classe che ha come membro-dati una struttura intabellata in una matrice a due dimensioni. Questa matrice serve in tutti i moduli dell'applicazione, avrei voluto renderla "static" ma credo di avere capito che le classi non si possono definire statiche, ma la struttura sì. Così nell'header della classe ho queste istruzioni:
#define COMBINAZIONIPREVISTE 101
#define DIMENSIONETABELLA 1000
static structTabIndicatori TabIndicatori [DIMENSIONETABELLA + 1] [COMBINAZIONIPREVISTE + 1];
In tutti i moduli .cpp che necessitano l'accesso a questa matrice ho inserito, prima di ogni altra cosa, l'istruzione:
extern structTabIndicatori TabIndicatori [DIMENSIONETABELLA + 1] [COMBINAZIONIPREVISTE + 1];
ma non riesco a capire come mai l'IDE mi riconosce i nomi della matrice e non mi segnala nessun errore, mentre a livello di compilazione ottengo l'errore "undefined reference to 'TabIndicatori' ". Oltretutto, sembra che questo errore ci sia solo per alcuni moduli e non per altri, a meno che non sia perché si ferma di elencare gli errori dopo un certo numero.
C'è qualche anima buona che mi può suggerire cosa dovrei fare per eliminare il problema ?
Vi ringrazio molto.

4 Risposte

  • Non è inspiegabile, è l'errore classico di chi non ha capito come si fanno i moduli. Prendi esempio da un programma già fatto per vedere come organizzare define, definizioni di struct e extern, altrimenti posta tutto il codice (header e sorgenti)
  • Grazie per la risposta.
    Non saprei come postare tutta la procedura, altrimenti lo farei, ma restando nelle cose terra-terra, una matrice definita static in un modulo, per poter essere utilizzata in un altro modulo quale accorgimento dovrei applicare ? Dalle risposte date in alcuni forum ho capito che extern è la voce da assegnare alle variabili statiche definite in un altro modulo, o dovrei applicare qualche altro stratagemma ?
  • Static non c'entra nulla col discorso.
    Define, typedef struct e extern tutte in un header che può essere chiamato tramite include dai moduli, la matrice vera e propria la dichiari in un unico modulo. Inizia con matrici di int così cominci a capire come funziona il linker.

    Non ci sono scorciatoie che puoi trovare in un forum, è una cosa che o studi o impari sperimentando finché la compilazione va a buon fine
  • Grazie. Forse ho capito una cosa che non sapevo: un medesimo modulo header può essere incluso in tutti i moduli, in aggiunta al modulo header definito per la creazione della classe particolare del modulo. Proverò così.
Devi accedere o registrarti per scrivere nel forum
4 risposte