Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

di il
75 risposte

75 Risposte - Pagina 4

  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    shine_ms ha scritto:


    Ecco questo è quanto più si avvicina alla mia idea iniziale..
    E' quello che ho cercato di dirti dalla prima risposta, separare i dati dal BST
    E' necessario creare una libreria per ogni dato, o è una scelta che fai tu?
    E' una scelta di progetto, meglio avere tutto separato. Poi sono tutti messi insieme nel dati.h che va mantenuto aggiornato dal client man mano che aggiunge tipi nuovi
    error: dereferencing pointer to incomplete type
    mi da questo errore ad ogni riga della funzione insert...
    Controlla di aver inserito correttamente tutti gli include giusti.

    E' un errore che te lo da nel main o nella libreria?

    P.s. Io non lo posso controllare sul pc
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Nella libreria.. Ora provo a separare i dati, perchè avevo messe insieme le funzioni.
    Un consiglio, se possibile... Visto che la traccia te l'ho scritta interamente, secondo te che mi sembri abbastanza esperto, è corretto consegnare la libreria abrgenerico che include la libreria dati, che a sua volta include una libreria per ogni tipo di dato? (ti parlo sempre in base al mio obiettivo, perchè poi ho capito che la soluzione che mi proponi è la migliore).
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    shine_ms ha scritto:


    Nella libreria.. Ora provo a separare i dati, perchè avevo messe insieme le funzioni.
    Un consiglio, se possibile... Visto che la traccia te l'ho scritta interamente, secondo te che mi sembri abbastanza esperto, è corretto consegnare la libreria abrgenerico che include la libreria dati, che a sua volta include una libreria per ogni tipo di dato? (ti parlo sempre in base al mio obiettivo, perchè poi ho capito che la soluzione che mi proponi è la migliore).
    In informatica non esiste la soluzione migliore. Si può fare sempre meglio.

    Io penso sia corretto, perché è il modo di far vedere alla libreria la funzione compare. Devi aggiungere un file di testo readme.txt che spiega come usare la tua libreria. Questo anche come tuo promemoria.

    Attento che devi scrivere le funzioni di distruzione che variano da dato a dato, avere ogni dato separato ti consente di avere più ordine e migliora la leggibilità del codice.

    P.s. Quando risolvi questi esercizi pensa sempre che il codice puoi doverlo migliorare, implementare, manutenere ecc... Non vederlo mai solo come un esercizio universitario dei vantaggi di questo te ne renderai conto nel tempo
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    SVNiko ha scritto:


    In informatica non esiste la soluzione migliore. Si può fare sempre meglio.
    Intendevo migliore la tua rispetto alla mia. Comunque grazie per i consigli, che sono molto efficaci.
    Ho scritto così..
    #include <stdio.h>
    #include <stdlib.h>
    #include "abrgenerico.h"
    
    int main()
    {
        int n;
        ABR albero=NULL;
        int i,k;
        int sceltatipo;
        printf("COSTRUISCI ABR:\n");
        printf("<scegli il tipo dei dati\n");
        printf("1) Interi.\n");
        printf("2) Stringhe\n\n");
        scanf("%d",&sceltatipo);
        printf("Quanti elementi vuoi inserire?");
        scanf("%d",&n);
    
        switch (sceltatipo)
        {
        case 1:
            for (i=0;i<n;i++)
            {
                void* dato=NULL;
                getInputINT(dato);
                albero=abr_insert(albero,(void*)dato, compareINT);
            }
    
        }
    
        return 0;
    }
    abrgenerico.h
    #ifndef ABRGENERICO_H_INCLUDED
    #define ABRGENERICO_H_INCLUDED
    
    typedef struct abr * ABR;
    
    typedef int (*COMPARE)(void * , void * );
    ABR abr_insert(ABR t, void* item, COMPARE compare);
    
    
    #endif // ABRGENERICO_H_INCLUDED
    abrgenerico.c
    #include <stdio.h>
    #include <stdlib.h>
    #include "abrgenerico.h"
    #include "dati.h"
    
    typedef struct abrgenerico
    {
        void * info;
        struct abrgenerico *sx;
        struct abrgenerico *dx} abr;
    
    
    ABR abr_insert(ABR t, void* item, COMPARE compare)
    {
        int pos;
        if (t!=NULL)
        {
            pos=compare(item,t->info);
            if ( pos < 0)
                t->sx=abr_insert(t->sx,item,confronta);
            else if ( pos > 0 )
                t->dx=abr_insert(t->dx,item,confronta);
            return t;
            }
    
        else
        {
            ABR tmp=(abr *)malloc(sizeof(abr));
            t->info=item;
            t->sx=NULL;
            t->dx=NULL;
            return tmp;
            }
    }
    
    
    
    dati.h
    #ifndef DATI_H_INCLUDED
    #define DATI_H_INCLUDED
    
    #include "datoINT.h"
    #include "datoSTRING.h"
    
    #endif // DATI_H_INCLUDED
    
    datoINT.h
    #ifndef DATOINT_H_INCLUDED
    #define DATOINT_H_INCLUDED
    
    int compareINT(void * a, void * b);
    void getInputINT (void* in);
    void getRandomInt (void* in);
    
    #endif // DATOINT_H_INCLUDED
    datoINT.c
    #include <stdio.h>
    #include <stdlib.h>
    #include "datoINT.h"
    
    int compareINT (void * a, void * b)
    {
        int a1= *(int*) a;
        int b1= *(int*) b;
        return a1-b1;
    }
    
    void getInputINT (void* in)
    {
        printf("Inserisci un valore intero:");
        scanf("%d", (int*)in);
    }
    
    void getRandomInt (void* in)
    {
        int d=(int)rand()/(int)RAND_MAX;
        *((int*)in)=(rand()%100) +d;
    }
    
    Errori:

    warning: implicit declaration of function 'getInputINT' [-Wimplicit-function-declaration]|
    |26|error: 'compareINT' undeclared (first use in this function)|

    se riaggiungo in dati.h
    typedef int (*COMPARE)(void * , void * );
    Mi da un errore in abrgenerico.h che dice che COMPARE non è definito.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    typedef int (*COMPARE)(void * , void * );
    Puoi lasciarlo lì oppure aggiungere nella'header abrgenerico.h dati.h.

    Per quanto riguarda il warning, non capisco perché non allochi e perché usi il puntatore void*, lavora come fosse un int, alla inserisci fai il cast a void*.

    Guarda che l'albero devi inizializzare, allocando la struttura.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    SVNiko ha scritto:


    Per quanto riguarda il warning, non capisco perché non allochi e perché usi il puntatore void*, lavora come fosse un int, alla inserisci fai il cast a void*.
    Ho modificato la funzione ma il warning rimane..
    E comunque rimane questo errore:
    error: 'compareINT' undeclared (first use in this function)
    mi sa che salto qualche include mmm ..

    Sull'allocazione della struttura non ho ben capito cosa intendi
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    mi sa che salto qualche include mmm ..
    Penso anch'io.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Pensavo una cosa. Visto che abbiamo usato il puntatore per il compare non dovrebbe essere nemmeno necessario includere dati.h nel'header abrgenerico.h
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Allora
    nel main : #include "abrgenerico.h"
    in abrgenerico.h : nessun include
    in abrgenerico.c : #include "abrgenerico.h" e #include "dati.h"
    in dati.h: #include "datoINT.h"
    in datoINT.h: nessun include
    in datoINT.c: #include "datoINT.h"

    la definizione di COMPARE l'ho messa in abrgenerico.h

    gli errori sono gli stessi..
    warning: implicit declaration of function 'getInputINT' [-Wimplicit-function-declaration]|
    error: 'compareINT' undeclared (first use in this function)|
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Prova così

    nel main : #include "abrgenerico.h" e #include "dati.h
    in abrgenerico.h : nessun include
    in abrgenerico.c : #include "abrgenerico.h"
    in dati.h: #include "datoINT.h"
    in datoINT.h: nessun include
    in datoINT.c: #include "datoINT.h":
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Quando nel main includo anche "dati.h"
    non mi trova più nessuna funzione, neanche abr_insert.. e gli errori diventano 3
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Dunque il problema è nelle priorità del linker. Teoricamente avrebbe dovuto funzionare. Quindi commetto un errore che posso risolverti se metto su PC il codice, questo non posso farlo adesso.

    Fai tu qualche prova spostando i vari include.

    Se non funziona lo vedo nel weekend su PC.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Ho provato, ma ancora devo riuscire a risolvere..
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Ho messo finalmente sul compilatore il codice.

    Dunque di errori ce ne sono diversi, anche concettuali.

    Il problema di compilazione lo risolvi mettendo nell'header abrgenerico.h al posto di:
    typedef struct abr * ABR;

    questo:
    typedef struct abrgenerico * ABR;
    Devi rivederti la visibilità delle variabili.

    Nella funzione abr_insert hai il puntatore t che deve essere tmp, nella parte else.

    Poi le funzioni di getInputInt vanno modificate, devi allocare il dato intero.

    Scriviti una funzione di stampa dell'albrero anche solo per debug.

    P.s. Ascolta questo consiglio, non scrivere mai più di una funzione senza compilare e vedere che funzioni, se no non ne esci mai, è difficile correggere gli errori, che possono essere a cascata. Fidati!
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    SVNiko ha scritto:


    Il problema di compilazione lo risolvi mettendo nell'header abrgenerico.h al posto di:
    typedef struct abr * ABR;

    questo:
    typedef struct abrgenerico * ABR;
    Devi rivederti la visibilità delle variabili.
    Allora già facendo questo mi da un warning..
    warning: no semicolon at end of struct or union [enabled by default]|
    infatti io in origine avevo scritto così, poi ho modificato credendo di poter risolvere questo warning, comunque intanto grazie per il consiglio, mi rivedrò la visibilità delle variabili
Devi accedere o registrarti per scrivere nel forum
75 risposte