Newsgroup: it.comp.os.linux.development
Titolo: undefined reference...ma perkè???

ciao a tutti
per voi che siete programmatori esperti sicuramente più di me sarà una 
cavolata risolvere questo probl. (un premio a chiunque mi risponde!!)
allora, per conto università, stò facendo un esercizietto in c++, per 
giocare a mastermind.
3 file: main.cpp
        mastermind.cpp e mastermind.h
g++ versione 3.0.4 (ma da lo stesso errore anche con la 2.95)
distribuzione mdk 8.1 kernel non ricompilato.
dunque il problema è il seguente: 
la compilazione di entrambi i file và senza problemi
il linking però restituisce questa robba qui:
main.o: In function `main':
main.o(.text+0x3e): undefined reference to `stampaArray(unsigned*)'
main.o(.text+0xf2): undefined reference to `posizioneGiusta(int, int, 
unsigned*)'
main.o(.text+0x11f): undefined reference to `presente(unsigned*, unsigned)'
main.o(.text+0x14c): undefined reference to `stampaArrayChar(char*)'
mastermind.o: In function `sequenzaVincente()':
mastermind.o(.text+0x62): undefined reference to `presente(unsigned*, 
unsigned)'
collect2: ld returned 1 exit status
io non capisco perkè!
vi posto anche i sorgenti di entrambi i file 
vi prego aiutatemi!!!!!!
//file main.cpp
/*
*Programma c++ pr giocare a MasterMind.il programma genera una sequenza 
random di 4 numeri
 * il giocatore prova ad indovinare la sequenza, per la quale in risposta 
dal prog riceve
 * una X per ogni numero azzeccato nella posizione giusta, e O per ogni 
numero azzeccato nella posizione
 * sbagliata.
 * Per semplicità i numeri generati a randon sono tutti diversi tra loro (è 
più facile indovinare
 * la sequenza vincente.
 * Esempio:
 * sequenza random : [2,5,6,8]
 * tentativo 1: [1,3,5,0]
 * risposta: O (il numero 5 è presente nella sequenza vinc ma non è nella 
posizione esatta
 * tent2:       [2,3,5,0]
 * riposta: X0 (il numero 2 è in posizione esatta, il 5 è presente ma non 
nella posizione giusta
 *
 */
#include <iostream.h>
#include "mastermind.h"
#include <time.h>
#include <stdlib.h>
main(){
        unsigned int* sequenza= new unsigned int[4];
        srand(time(NULL));
        sequenza=sequenzaVincente(); //genera la sequenza vincente
        stampaArray(sequenza);//stampa la sequenza che dovrò indovinare
        cout<<"Ho generato la sequenza che devi indovinare..."<<endl;
        cout<<"Adesso ti sfido ad indovinarla.buon divertimento"<<endl;
        bool vinto=false; //diventa true quando ci sono 4 X nella sequenza 
di risposta
        do{
                char* risposta= new char[4];
                unsigned int* tentativo= new unsigned int[4];
        //      bool vinto=false; //diventa true quando ci sono 4 X nella 
sequenza di risposta
                tentativo=leggiTry();//legge il tentativo ddll'utente
                for(int i=0;i<4;i++){
                        if(posizioneGiusta(tentativo[i],i,sequenza))
                        risposta[i]='X';
                        else if(presente(tentativo,sequenza[i]))
                                risposta[i]='O';
                        else risposta[i]=' ';
                }
                stampaArrayChar(risposta);
        if(contaX(risposta)==4)
                        vinto=true;
        } while(!vinto);
        //delete [] sequenza; //dealloco la memoria
}
//file mastermind.h
#ifndef MASTERMIND_H
#define MASTERMIND_H
int unsigned randomInteger(unsigned int);
unsigned int* sequenzaVincente(); //ritorna la sequenza da indovinare
unsigned int* leggiTry();//legge la sequenza da tastiera,ritorna la 
sequenza letta
bool presente (unsigned int[],unsigned int);//verifica se all'interno 
dell'array è presente il numero passato
                                   //come secondo parametro
bool posizioneGiusta(int,int,unsigned int []);//verifica che il primo 
numero sia presente nella posizione
                                        //passata dal secondo parametro 
all'interno dell'array
void stampaArray(unsigned int []);//stampa un array
void stampaArrayChar(char []);//stampa un array
int contaX(char []);//conta le X dentro l'array di risposta
#endif
/FILE mastermind.cpp
/* libreria che contiene le funzioni relative al gioco mastermind:
 * genera la iequenza vincente
 * legge i tentativi del giocatore
 * restituisce i risultati parziali
 */
#include <time.h>
#include <stdlib.h>
#include <iostream.h>
#include "mastermind.h"
/*funzione che genera un numero a random*/
unsigned int randomInteger(unsigned int n){
//return random integer greater than or equal to 0 and less than m
return rand() % n;
};
//genera la sequenza vincente
unsigned int* sequenzaVincente(){
        unsigned int* sequenza= new unsigned int[4];
        //genero la sequenza vincente
        for(int i=0;i<4;i++){ //inizializzo
                //l'array sequenza vincente
                unsigned int w=randomInteger(10);
                if(!presente(sequenza,w))
                sequenza[i]=w;
        }
        //stampa la sequenza vincente//
/*      for(int n=0;n<4;n++)
                cout<<sequenza[n]<<' ';
                cout<<endl;*/
        return sequenza;
};
/*questa funzione legge i 4 numeri immessi dall'utente da tastiera e li 
salva in un'array
 * tentativo[] anche questo di 4 elementi,restituendo il puntatore al primo 
elemento
 */
unsigned int* leggiTry(){
        unsigned int* tentativo= new unsigned int[4]; //alloca staticamente 
lo spazio per i numeri immessi dall'utente
        //legge da tastiera i numeri
        //
        cout<<"scrivi una sequenza di 4 numeri diversi"<<endl;
        for(int i=0;i<4;i++){
        cin>>tentativo[i];
        }
        //stampa il tentativo (solo per verifica)
        for (int x=0;x<4;x++) {
                cout<<tentativo[x]<<' ';
                cout<<endl;
        }
        return tentativo;
};
/*funzione che verifica se il numero n è presente nella posizione p 
dell'array sequenza:se
 *ritorna true in caso affermativo*/
bool posizioneGiusta(int n,int p,int sequenza[]){
        int* seq= new int[4];
        seq=sequenza;
        bool posgiusta=false;
        if(seq[p]==n)
                posgiusta==true;
        delete seq; //deve essere deallocata la memoria relativa all'array 
seq
        return posgiusta;
};
/*questa funzione controlla che all'interno dell'array tentativo sia 
presente il numero n,che viene
 * preso dall'array generato a random*/
bool presente(int tentativo[],int n){
                bool presente=false;//verifica se il numero n è presente 
nell'array tentativo
                                    //il numero n è preso dall'array 
sequenzaVincente
                        for(int i=0;i<4;i++){
                                if(tentativo[i]==n)
                                presente=true;
                                }
        return presente;
};
void stampaArrayInt(unsigned int  array[]){
        for(int k=0;k<4;k++)
                cout<<array[k]<<' ';
};
void stampaArray(char array[]){
        for(int k=0;k<4;k++)
                cout<<array[k]<<' ';
};
int contaX(char risposta[]){
        int giusti=0;
        for(int i=0;i<4;i++){
                if(risposta[i]=='X')
                giusti++;
                }
        return giusti;
}

scusate la lunghezza ovviamente
prima che lo chiediate, per linkare uso:
g++ main.o mastermind.o -o mastermind
ok...that's all folk!

 g++ main.o mastermind.o -o mastermind
E se fai:
    g++ mastermind.o main.o -o mastermind
cosa ti dice?
  Xav

 g++ main.o mastermind.o -o mastermind
Se per fare il tutto usi
g++ main.cpp mastermind.cpp -o mastermind
cambia qualcosa?
(non dovrebbe, ma non si sa mai :-) )
-- 
Saluti,
    Mardy
http://castellina.org/interlingua

 main.o(.text+0x11f): undefined reference to `presente(unsigned*, unsigned)'
mastermind.h:
 bool presente (unsigned int[],unsigned int);
mastermind.cpp:
 bool presente(int tentativo[],int n) {
Max

grazie ! non mi ero accorto che facendo modifiche da una parte non le 
riportavo anche in altre porzioni...
grazie Max
