Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    [C]Linker error

    Salve ragazzi ho il seguente codice in C:

    codice:
    #include "Console.h"
    #include "Albero.h"
    
    int main(int argc, char *argv[])
    {
        char choise;
        char continua;
        int *value;
        char *stringa;
        NODO *rootInteger = NULL;
        NODO *rootString = NULL;
        NODO *rootFloat = NULL;
        
        do
        {
            printf("MENU:\n\n");
            printf("[1]     Gestisci un albero di stringhe:\n");
            printf("[2]     Gestisci un albero di interi:\n");
            printf("[3]     Gestisci un albero di float:\n");
            //printf("[4]     Cancella un elemento nell'albero:\n");
            printf("[5]     Stampa BST:\n");
            
            choise = getch();
            
            switch(choise)
            {
                case '1':
                    printf("Inserisci la stringa da inserire:\n");
                    stringa = StringaArbitraria();
                    rootString = BST_Insert(rootString, &CompareString, (void *)stringa );
                    break;
                    
                case '2':
                    printf("Inserisci un intero da inserire:\n");
                    InserisciDaTastiera(stringa, 50);
                    value = (int *)malloc(sizeof(int)); // Alloco memoria per il puntatore all'intero
                    *value = (int)stringa; // Forzo il valore di stringa (char *)
                    rootInteger = BST_Insert(rootInteger, &CompareInteger, value);
                    break;                
                    
                /*case '4':
                    if ( BSTIsEmpty(root) )
                        printf("Nessun elemento presente nell'albero!\n");
                    else 
                    {
                        printf("Inserisci la stringa da cancellare:\n");
                        value=StringaArbitraria();
                        root = BST_Delete(root, value);
                    }
                    break;    */            
                    
                /*case '5':
                    printf("STMPA DEL BST:\n");
                    printf("[1].    Stampa l'albero di stringhe:\n");
                    printf("[2].    Stampa l'albero di interi:\n");
                    printf("[3].    Stampa l'albero di float:\n");
                    
                    choise = _getch();
                    
                    switch(choise)
                    {
                        case '1':
                            // Stampo l'albero di stringhe
                            StampaAlbero(rootString, );
                            break;
                            
                        case '2':
                            // Stampo l'albero di interi
                            StampaAlbero(rootInteger, );
                            break;
                            
                        case '3':
                            // Stampo l'albero di float
                            StampaAlbero(rootFloat, );
                            break;    
                    }
                    break; 
            }*/
            }
            
            printf("Vuoi continuare s / n\n");
            continua = _getch();
            
        }while(continua != 's');    
        
      
      system("PAUSE");	
      return 0;
    }
    Quando compilo, mi dà il seguente errore:
    codice:
      [Linker error] undefined reference to `StringaArbitraria' 
      [Linker error] undefined reference to `CompareString' 
      [Linker error] undefined reference to `InserisciDaTastiera' 
      [Linker error] undefined reference to `CompareInteger' 
      ld returned 1 exit status
    Come posso risolvere?
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Hai letto gli errori?

    Dove sono quelle funzioni ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Console.h:
    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #include<string.h>
    
    void InserisciDaTastiera(char *stringa, int Max);
    char *StringaArbitraria();
    Console.c:
    codice:
    #include "Console.h"
    
    /* =============================================
    ** Function per leggere una stringa di caratteri
    ** da tastiera
    ** ---------------------------------------------*/
    void InserisciDaTastiera(char *stringa, int Max)
    {   
        int i;
        
        fgets(stringa, Max, stdin);
        
        for ( i=0; stringa[i] < 0 || stringa[i] > 31; i++);
        stringa[i]=0;
        
        fflush(stdin);
    }
    
    
    /* =============================================
    ** Function per leggere una stringa di caratteri
    ** arbitraria
    ** ---------------------------------------------*/
    char *StringaArbitraria()
    {
        int i=0;
        char *c,ci;
        c=(char*)malloc(sizeof(char));
    
        while(ci!=10) // mi fermo quando trovo un newline \n
        {
          ci=getchar(); // inserisco un singolo carattere
          c[i]=ci; // lo associo puntatore
          i++;
          c=(char*)realloc(c,sizeof(char)*(i+1));
        }
        c[i]='\0'; //inserisco terminatore '\0' 
        
        return c;
    }
    MyLibrary.h:
    codice:
    typedef int (*COMPARE)(void*, void*);
    typedef void (*STAMPAINFO)(void*);
    //typedef (*COPIA)(void*, void*);
    
    int CompareString( void *val1, void *val2 );
    int CompareInteger(void *val1, void *val2);

    MyLibrary.c
    codice:
    #include "Console.h"
    #include "MyLibrary.h"
    
    
    // Compare string
    int CompareString( void *val1, void *val2 )
    {
        int result;
    
        result=strcmp((char *)val1, (char *)val2);
        return result;   
    }
    
    
    // Compare integer
    int CompareInteger(void *val1, void *val2)
    {
        int result;
        
        // Il primo valore è minore del secondo, restituisco -1
        if (val1 < val2)
            result = -1;
        else if (val1 > val2) // se val1 > val2 restituisco 1
            result = 1;
        else
            result = 0; // altrimenti se va1 = val2 restituisco 0
            
        return result;
    }
    
    
    // Compare float
    int CompareFloat(void *val1, void *val2)
    {
        int result;
        
        // Il primo valore è minore del secondo, restituisco -1
        if (val1 < val2)
            result = -1;
        else if (val1 > val2) // se val1 > val2 restituisco 1
            result = 1;
        else
            result = 0; // altrimenti se va1 = val2 restituisco 0
            
        return result;
    }
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    E quindi ?

    Hai creato un "progetto" aggiungendo tutti i file sorgenti (.c) ?

    Cosa usi per compilare?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Si oregon, la cosa strana è che ci sono tutti i collegamenti fatti correttamente, ho dato anche un'occhiata al file makefile.win che ti posto:

    codice:
    # Project: Albero
    # Makefile created by Dev-C++ 4.9.9.2
    
    CPP  = g++.exe
    CC   = gcc.exe
    WINDRES = windres.exe
    RES  = 
    OBJ  = Objects/main.o Objects/Albero.o Objects/MyLibrary.o Objects/Console.o $(RES)
    LINKOBJ  = Objects/main.o Objects/Albero.o Objects/MyLibrary.o Objects/Console.o $(RES)
    LIBS =  -L"C:/Dev-Cpp/lib"  
    INCS =  -I"C:/Dev-Cpp/include" 
    CXXINCS =  -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include" 
    BIN  = Exe/Albero.exe
    CXXFLAGS = $(CXXINCS)  
    CFLAGS = $(INCS)  
    RM = rm -f
    
    .PHONY: all all-before all-after clean clean-custom
    
    all: all-before Exe/Albero.exe all-after
    
    
    clean: clean-custom
    	${RM} $(OBJ) $(BIN)
    
    $(BIN): $(OBJ)
    	$(CPP) $(LINKOBJ) -o "Exe\Albero.exe" $(LIBS)
    
    Objects/main.o: main.c
    	$(CC) -c main.c -o Objects/main.o $(CFLAGS)
    
    Objects/Albero.o: Albero.c
    	$(CC) -c Albero.c -o Objects/Albero.o $(CFLAGS)
    
    Objects/MyLibrary.o: MyLibrary.c
    	$(CPP) -c MyLibrary.c -o Objects/MyLibrary.o $(CXXFLAGS)
    
    Objects/Console.o: Console.c
    	$(CPP) -c Console.c -o Objects/Console.o $(CXXFLAGS)
    utilizzo: Dev-C++ 4.9.9.2
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Non capisco perché alcuni file di tipo CC e altri CPP ... comunque, puoi zippare tutto e farlo scaricare?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Nel main prova a includere anche MyLibrary.h.
    Comunque non so se stai chiamando correttamente le funzioni, ad esempio gli passi &CompareString, ma il puntatore a funzione è CompareString, non &CompareString, però dipende anche dal prototipo cella BST_insert che non conosco.

  8. #8
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Il prototipo della BST_Insert è il seguente:

    codice:
    NODO *BST_Insert(NODO *root, COMPARE Compare, void *value);
    Inoltre non posso includere MyLibrary.h nel main, altrimenti mi dice:

    ridefinizione del tipo COMPARE, ed ha ragione.
    Con i sogni possiamo conoscere il futuro...

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da gaten
    Inoltre non posso includere MyLibrary.h ...
    Gli errori sono del "linker" quindi l'include non c'entra.

    P.S. Non è possibile scaricare i file (vedi PM)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ho visto il progetto e il problema è quello che ti avevo anticipato.

    Se fai tasto destro sul nome del progetto

    -> Project Options -> tab Files

    vedrai che per ogni file .c c'è una voce

    Compile file as C++

    che NON deve essere selezionato per tutti i file .c
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.