Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

di il
75 risposte

75 Risposte - Pagina 2

  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Il mio obiettivo è:
    "Definire una libreria per la manipolazione di Alberi Binari di Ricerca <<generici>>. Sia <<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."

    Quindi giustamente tu dici nel main l'utente sceglie che tipo di abr creare? A me interessa solo creare la libreria che sia in grado di gestirli tutti, è così?
    Se è così, allora, in base alle tue indicazioni credo di aver capito.. faccio una prova con l'inserimento di int e stringa solo.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    shine_ms ha scritto:


    Il mio obiettivo è:
    "Definire una libreria per la manipolazione di Alberi Binari di Ricerca <<generici>>. Sia <<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."
    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.
    Quindi giustamente tu dici nel main l'utente sceglie che tipo di abr creare?
    L'utente nel main sceglie di inizializzare una libreria di tipo BST. Se il BST è generico non ne serve uno particolare. Voglio dire non esiste quello per gli int, quello per gli altri.
    A me interessa solo creare la libreria che sia in grado di gestirli tutti, è così?
    Appunto
    faccio una prova con l'inserimento di int e stringa solo.
    Non ho capito bene cosa intendi. Ad ogni modo dopo aver scritto la libreria puoi inserire i dati dei tipi che desideri.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Non ho capito bene cosa intendi. Ad ogni modo dopo aver scritto la libreria puoi inserire i dati dei tipi che desideri.
    Intendevo semplicemente che sto provando a scrivere il codice solo per il tipo di dato int, e stringa.. semplicemente per provare.
    Allora, ho definito la libreria abrgenerico.h, e nel abrgenerico.c ho definito la struttura abr e la funzione inserimento, e ho incluso dato.h in cui ho scritto le funzioni di confronto che trattano il dato specifico. Mi rimane un dubbio... Nel main quando chiamo la funzione inserimento devo aggiungere una qualche variabile in modo tale che la funzione inserimento di abrgenerico riconosca quale tipo di dato della libreria dato.h trattare?
    Ho considerato comunque che al cliente sia visibile solo abrgenerico.h.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Hai inserito dato.h nel alberogenerico.c? No. Non serve! Tienilo fuori. Ricorda la libreria non sa e non deve sapere niente del dato.

    Il main conosce il dato e in base a quello scegli le funzioni necessarie.

    Una singola libreria per ogni singolo dato.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Scusa ma se non includo dato.h le funzioni non le vede..
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Ti pongo una domanda per farti riflettere hai scritto che hai realizzato la libreria generica quindi teoricamente puoi compilarla e consegna a me, adesso io sarò libero di inserire il dato che mi serve? Come faccio?
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    No, perchè ho un problema che non riesco a risolvere, quindi non posso compilare il codice...
    In che modo la libreria che ho creato capisce che tipo di dato ho, e richiama le funzioni di quel tipo specifico di dato? Devo passare qualche variabile all'inserimento? non basta la chiamata inserimento(root, (void*)dato) ..
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Non ha necessità di sapere di quale tipo di dato necessita. Al più gli serve sapere se viene prima o dopo dell'elemento che fa confrontare.

    P.s. Non voglio la libreria il mio era un modo di dire per farti capire che la libreria devi poterla dare a terzi.

    P.s.s. Non è buona abitudine avere degli errori che non ti permettono di compilare, fai in modo che possa sempre compilare a ogni funzione che aggiungi.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    SVNiko ha scritto:


    Non ha necessità di sapere di quale tipo di dato necessita. Al più gli serve sapere se viene prima o dopo dell'elemento che fa confrontare.
    forse non riesco a esprimere chiaramente la mia domanda.. allora..
    in abrgenerico.c scrivo il corpo della struttura come
    typedef struct abrgenerico
    {
        void * info;
        struct abrgenerico *sx;
        struct abrgenerico *dx} abr;
    e la funzione inserimento (ABR root, void* item) [in abrgenerico.h definisco il tipo di dato ABR * abr]
    il cui corpo contiene il confronto nel caso in cui root sia != NULL.

    In datoint.h, come dici tu, definisco le funzioni di confronto del dato intero.
    Ora se dal main io richiamo l'inserimento come inserimento(root,(void*)item) in che modo la funzione inserimento all'interno di abrgenerico.h chiama la funzione di confronto di interi, piuttosto che di stringhe, o di altri tipi di dato? Non necessità di sapere, ma le funzioni di confronto che io scrivo sono diverse, quindi in qualche modo dovrà pur chiamare una o l'altra... Ecco perchè inizialmente io avevo utilizzato un puntatore a funzione di tipo confronta.. da dare in input a inserimento.
    Nel main è a scelta dell'utente che utilizza il programma il tipo di dato da inserire.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Per fare l'inserimento nell'albero tu hai necessità di sapere semplicemente se la radice del sotto albero in questione è maggiore o minore dell'elemento che vuoi inserire, questo per poterlo inserire a destra o a sinistra del sotto albero di ricerca binario.
    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 lavoro fallo fare al main. Così dai a chi utilizza la libreria di scrivere dato.h e dato.c che gli serve.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Ora ho capito quello che dici tu.
    Ma non credo sia quello che devo fare io... io nella mia libreria devo scrivere tutto ciò che serve per gestire un tipo di dato generico, quindi il confronto devo farlo all'interno di esso.. è proprio quello l'esercizio.. se lo svincolo e lo scrivo nel main non faccio quello che dovrei fare, anche se ho capito cosa dici ed è corretto.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    I confronti devi farli se no non saprai dove inserire.
    Nel mio esempio ho messo dei numeri interi che devi farti dare da una funzione, ma questa non è della libreria albero. Se metti nella libreria albero i confronti non la rendi generica.

    A me dispiace che non posso scriverti un pezzo di codice provato sul mio PC. Ma penso che ci sei quasi.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    SVNiko ha scritto:


    I confronti devi farli se no non saprai dove inserire.
    Nel mio esempio ho messo dei numeri interi che devi farti dare da una funzione, ma questa non è della libreria albero. Se metti nella libreria albero i confronti non la rendi generica.
    E se la libreria include un altro file in cui faccio i confronti? perchè comunque devo avere dei tipi predefiniti, oltre che scelti dall'utente. In questo modo nell'header della mia libreria ho i prototipi della funzioni con il paramentro void, poi come questo viene trattato all'interno della libreria.c è sconosciuto all'utente.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Sempre nel nostro esempio dove dai a me la tua libreria, io per il mio dato che faccio? Inserisco in dato.c l'implementazione delle mie funzione di confronto?

    Non è meglio scrivere dato.h e dato.c che l'utilizzatore della libreria può gestire per conto proprio.
  • Re: Consiglio Manuali-ListaDoppiamentePuntata tipo dato generico

    Non è meglio scrivere dato.h e dato.c che l'utilizzatore della libreria può gestire per conto proprio.
    Ma poi comunque se vuole inserire un nuovo tipo di dato come fa con le funzioni di confronto?
    Io vorrei che all'utilizzatore di questa specifica libreria non conosca proprio la definizione di tutte le funzioni di confronto, cioè lui inserisce il dato, e la mia libreria lo riconosce, e lo inserisce utilizzando la giusta funzione di confronto..
Devi accedere o registrarti per scrivere nel forum
75 risposte