Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

di il
75 risposte

75 Risposte - Pagina 3

  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Ma è impossibile! Perché non hai idea di che tipo di dato userà.
    Quello che puoi fare è impostare dei prototipi che chi utilizzerà la libreria dovrà implementare, ma sempre a parte in dato.c

    P.s. sai programmare in java?
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Quello che puoi fare è impostare dei prototipi che chi utilizzerà la libreria dovrà implementare, ma sempre a parte in dato.c
    Eh questo l'ho capito... ma la mia domanda rimane sempre la stessa ahaha pare non ci sia risposta!
    P.s. sai programmare in java?
    No purtroppo.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Stavo rileggendo tutti i messaggi per cercare di capire cosa mi sfugge in quello che mi dici, visto che non riesco a trovare risposta alla mia domanda..
    Un modo per farlo e scrivere una insercisci così:
    inserisci(lista, (void *), 1); // questo se inserisci a destra
    inserisci(lista, (void *), -1); // questo se inserisci a sinistra
    inserisci(lista, (void *), 0); // questo se uguali e non inserisci

    Quei numeri li chiedi alla funzione
    int confronta(tipo dato, tipo dato);
    Questo non basta, perchè ho necessità di una funzione di ricerca per trovare il punto esatto dove inserire il nodo.. ma a questo punto la funzione di ricerca dove la inserisco? nella mia libreria..?! ma se non vede dato.c non può fare i confronti. La inserisco in dato.c? no perke serve conoscere la struttura di abr. La inserisco nel main? Ma neanche perchè che libreria completa sto creando se non permetto di fare neanche la ricerca? E allora si ritorna a quello che sto cercando di dire dall'inizio.. E cioè in che modo le funzioni della mia libreria utilizzano i vari confronti senza conoscere l'entità del dipo di dato? Cercando su internet ho trovato che quello che io cerco viene fatto con i puntatori a funzione! Ritorniamo così al codice del mio primo messaggio.. Che secondo me (errori a parte) è quello che si avvicina di più alla mia traccia.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    In java ci sta una classe Object che contiene dei metodi che tutti ereditano.
    Fai finta sia un .h visto da tutti. All'interno ci sono i prototipi, tra cui un metodo compareTo, serve appunto a fare comparazioni, l'implementazione è però lasciata alla'utente perché solo lui conosce com'è implementata la sua classe. Tu dovresti semplicemente fare la stessa cosa.

    La risposta c'è ed è sempre quella.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Quindi vediamo passo passo cosa deve fare la libreria.
    1) creare un nuovo BST
    2) inserire il primo elemento
    3) inserire il secondo elemento, scegliendo dove posizionarlo (puoi prendere il dato in radice e farlo confrontare dalla libreria che ti gestisce quel tipo di dato, visto solo lei sa come farlo, quindi puoi posizionarlo a sx o dx della radice)
    4) inserire tutti gli altri elementi con il medesimo approcio (risolvi con una funzione ricorsiva che ti piazza il dato al posto giusto).

    Tutti i confronti li fai fare dalla funzione che gestisce il dato. Solo lei conosce il dato.
    Qui sta la chiave per la ricerca. La funzione inserisci fa quello che ti serve.
    Se inserisci la radice allora inserisce ed tutto a posto.
    Se non inserisci la radice stai ricorrendo quindi confronti la radice con il dato da inserire, per vedere se devi metterlo a sx o dx.

    In dato.c per i confronti, nella libreria abr non ti serve il dato ma solo sapere dove, devi esportare il dato e farlo confrontare.

    Bene se conosci come utilizzare i puntatori a funzione, allora saprai che quando chiami la funzione tramite il suo puntatore passi il puntatore alla prima istruzione, come per i vettori. Il punto è la funzione dove la scrivi? E sei al punto di partenza. Lo puoi fare anche con un puntatore alla funzione, ma la funzione sta fuori da quel modulo abr.c, perchè non hai idea di come scriverla se non conosci il dato.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Fai finta sia un .h visto da tutti. All'interno ci sono i prototipi, tra cui un metodo compareTo, serve appunto a fare comparazioni, l'implementazione è però lasciata alla'utente perché solo lui conosce com'è implementata la sua classe.
    Ma io voglio scriverlo io, perciò non ci capiamo. Ho capito che quello che dici tu è più funzionale, ma io devo svolgere una traccia non devo consegnare a qualcuno un programma

    "Definire una libreria per la manipolazione di Abr generici. Generico è un abr i cui nodi possono contenere un dato di tipo qualsiasi, sia un dato di tipo predefinito che di tipo definito dall'utente.
    1.Definire una struttura per il nodo della lista in grado di contenere un qualsiasi tipo di dato.
    2.Definire diverse funzioni di costruzione e distruzione del dato, IN BASE AL TIPO DI DATO DA CONFRONTARE.
    3.DEFINIRE FUNZIONI DI CONFRONTO DIPENDENTI DAL TIPO DI DATO DA CONFRONTARE.
    4.Estendere la libreria dell'esercizio 2 (una libreria per la manipolazione di abr di stringhe) in modo che possano gestire abr generici."

    L'implementazione delle funzioni di confronto, sono proprio il fulcro del mio codice, non posso lasciarla all'utente.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Sempre con il limite che non posso mettere il codice sul compilatore, ti dispiace postare tutto il codice, il main, e tutti i .h e .c che li guardo un attimo.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Ma quelli dell'altra libreria? Perchè quelli per la libreria generica sto cercando appunto di scriverli ahaha
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    shine_ms ha scritto:


    Ma quelli dell'altra libreria? Perchè quelli per la libreria generica sto cercando appunto di scriverli ahaha
    Quelli della libreria generica, so che non è completa e funzionante. Proprio per quello chiedi aiuto giusto?
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Il codice che sto provando a scrivere è con i puntatori a funzione confronta.. quindi diciamo quello che ho inviato nel primo messaggio.. ho fatto poche modifiche, perchè purtroppo quello che mi blocca non mi fa proprio andare avanti nella scrittura delle funzioni..
    cioè più o meno una cosa del genere
    //abrgenerico.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "abrgenerico.h"
    
    
    
    typedef struct abrgenerico
    {
        void * info;
        struct abrgenerico *sx;
        struct abrgenerico *dx} abr;
    
    
    ABR abr_insert(ABR t, void* item, int tipo, COMPARE confronta)
    {
        int pos;
        if (t!=NULL)
        {
            pos=confronta(item,t->info); //bisogna fare il cast a tipo
            if ( pos < 0)
                t->sx=abr_insert(t->sx,item,tipo,confronta);
            else if ( pos > 0 )
                t->dx=abr_insert(t->dx,item,tipo,confronta);
            return t;
            }
    
        else
        {
            ABR tmp=(abr *)malloc(sizeof(abr));
            t->info=item;
            t->sx=NULL;
            t->dx=NULL;
            return tmp;
            }
    }
    #ifndef ABRGENERICO_H_INCLUDED
    #define ABRGENERICO_H_INCLUDED
    
    typedef struct abr * ABR;
    typedef int (*COMPARE) (void*,void*);
    
    ABR abr_insert(ABR t, void* item, int tipo, COMPARE confronta);
    
    
    #endif // ABRGENERICO_H_INCLUDED
    
    pensando nel main di passare per esempio nel caso di un int
    albero=abr_insert(albero, (void*)dato, sizeof(int), &confrontaInt)

    la funzione confronta int è proprio del tipo COMPARE.. ma non so appunto dove metterla!
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Tutti i post con la divisio del dato dalla libreria e non hai provato a scrivere nulla del genere?
    Dici di aver capito.

    La funzione compare come la scrivi? E dove?
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    La funzione per il confronto tra int l'ho scritta così
    int confrontaInt (void* a, void*b)
    {
        int a1= *(int*) a;
        int b1= *(int*) b;
        return a1-b1;
    }
    la scriverei in un altro file, ma giustamente tu dici che non lo posso includere nella libreria altrimenti perderei la sua generalità e quindi appunto non so come fare. E' proprio questo che non ho capito e quindi mi impedisce di proseguire..
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Abrgenerico.h
    
    #ifndef ABRGENERICO_H_INCLUDED
    #define ABRGENERICO_H_INCLUDED
    
    typedef struct abr * ABR;
    
    ABR abr_insert(ABR t, void* item);
    
    #endif // ABRGENERICO_H_INCLUDED
    
    abrgenerico.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "abrgenerico.h"
    #include "dato.h"
    
    typedef struct abrgenerico{
        void * info;
        struct abrgenerico *sx;
        struct abrgenerico *dx
    } abr;
    
    ABR abr_insert(ABR t, void* item ){
        int pos;
        if (t!=NULL){
    	pos = compare(t->info, item);
            if ( pos < 0)
                t->sx=abr_insert(t->sx,item);
            else if ( pos > 0 )
                t->dx=abr_insert(t->dx, item);
            return t;
            }
        else
            {
            ABR tmp=(abr *)malloc(sizeof(abr));
            t->info=item;
            t->sx=NULL;
            t->dx=NULL;
            return tmp;
            }
    }
    
    dato.h
    
    #ifndef DATO_H_INCLUDED
    #define DATO_H_INCLUDED
    
    /* FISSO PER TUTTI I TIPI DI DATO. NON CAMBIANO I PROTOTIPI A SECONDA DEL DATO */
    
    int compare(void * t, void * item);
    
    #endif // DATO_H_INCLUDE
    
    dato.c
    
    /* PER INTERI */
    #include <stdio.h>
    #include <stdlib.h>
    #include "dato.h"
    
    /* Questa funzione va cambiata dall'utilizzatore a seconda del tipo di dato */
    int compare(void * a, void * b){
    	/* implementazione della compare per interi*/
    }
    
    dato.c
    
    /* PER STRINGHE */
    #include <stdio.h>
    #include <stdlib.h>
    #include "dato.h"
    
    /* Questa funzione va cambiata dall'utilizzatore a seconda del tipo di dato */
    int compare(void * a, void * b){
    	/* implementazione della compare per le stringhe*/
    }
    
    Prova in questo modo, vedi se funziona e ricordati di implementare le funzioni compare.

    ATTENZIONE sono due file diversi. Devi sostituire il file giusto a seconda del dato che utilizzi.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    La libreria del post precedente dovrebbe funzionare se il client utilizza solo un tipo di dato. Se invece vuoi che lo stesso client possa utilizzare piu tipi di dato, dovresti fare questa modifica:

    abrgenerico.h
    
    #ifndef ABRGENERICO_H_INCLUDED
    #define ABRGENERICO_H_INCLUDED
    
    typedef struct abr * ABR;
    
    ABR abr_insert(ABR t, void* item);
    
    #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(t->info, item);
            if ( pos < 0)
                t->sx=abr_insert(t->sx,item, compare);
            else if ( pos > 0 )
                t->dx=abr_insert(t->dx, item, compare);
            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"
    
    /* Bisogna includere di volta in volta gli header dei tipi definiti */
    
    typedef int (*COMPARE)(void * , void * );
    
    #endif // DATI_H_INCLUDED
    
    datoINT.h
    
    #ifndef DATOINT_H_INCLUDED
    #define DATOINT_H_INCLUDED
    
    /* Libreria per la gestione degli int */
    
    int compareINT(void * t, void * item);
    
    #endif // DATOINT_H_INCLUDE
    
    datoINT.c
    
    //PER INTERI
    #include <stdio.h>
    #include <stdlib.h>
    #include "datoINT.h"
    
    /* Questa funzione va cambiata dall'utilizzatore a seconda del tipo di dato */
    int compareINT(void * a, void * b){
    	/* implementazione della compare*/
    }
    
    datoSTRING.h
    
    #ifndef DATOSTRING_H_INCLUDED
    #define DATOSTRING_H_INCLUDED
    
    /* Libreria per la gestione degli int */
    
    int compareSTRING(void * t, void * item);
    
    #endif // DATOSTRING_H_INCLUDED
    
    datoSTRING.c
    
    //PER LE STRINGHE
    #include <stdio.h>
    #include <stdlib.h>
    #include "datoSTRING.h"
    
    /* Questa funzione va cambiata dall'utilizzatore a seconda del tipo di dato */
    int compareSTRING(void * a, void * b){
    	/* implementazione della compare*/
    }
    
    MAIN.c
    
    /* Quando il main chiama la inserisci deve indicare in compare giusto */
    ....
    
    abr_insert(tint, datoint, compareINT); //Per gli interi
    ...
    abr_insert(tstring, datostring, compareSTRING); //Per le stringhe
    ....
    
    
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Ecco questo è quanto più si avvicina alla mia idea iniziale..
    E' necessario creare una libreria per ogni dato, o è una scelta che fai tu?

    error: dereferencing pointer to incomplete type
    mi da questo errore ad ogni riga della funzione insert...
Devi accedere o registrarti per scrivere nel forum
75 risposte