Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    10

    [c]simulare chiamate di metodo con i puntatori a funzione

    Ciao a tutti, devo affrontare un esercizio riguardo questo uso dei puntatori a funzione in c. L'esercizio di partenza consiste nel definire una struttura dati per un punto cartesiano, per un triangolo, un quadrato e un pentagono. Inoltre c'era da definire una struttura(union) che potesse contenere una qualsiasi tra le 2 figure precedenti. Infine l'esercizio chiedeva una funzione perimetro() che ricesse come parametro l'union figura. Io ho definito, rispettivamente, la struttura per il punto, il triangolo, il quadrato, il pentagono come segue:
    codice:
    struct point{
    double x;
    double y;
    };
    codice:
    struct triangolo{
    struct point p1;
    struct point p2;
    struct point p3;
    };
    codice:
    struct quadrato{
    struct point p1;
    struct point p2;
    struct point p3;
    struct point p4;
    };
    codice:
    struct pentagono{
    struct point p1;
    struct point p2;
    struct point p3;
    struct point p4;
    };
    codice:
    union figura{
    struct triangolo t;
    struct quadrato q;
    struct pentagono p;
    };
    Ora è richiesto nell'esercizio avanzato quanto segue:
    "Si modifichi ora quell'esercizio definendo varie funzioni che calcolano il perimetro, una per ogni tipo di figura geometrica considerata, e si aggiunga a figura un puntatore a funzione perimetro che sarà inizializzato, per ogni istanza di figura, alla funzione che calcola il perimetro nel modo appropriato per quella particolare figura. In questo modo, data una istanza di figura, sarà possibile invocare il "metodo" perimetro() senza sapere a priori di che tipo di figura si tratta."
    Ecco, io ho dei problemi ad impostare l'esercizio, in particolare:
    1)quella che prima era una union figura ora è una struct contenente una union e il puntatore a funzione?
    2)Se sì cosa prende per parametro?
    3)le funzioni per calcolare i perimetri prendono per parametro una struct triangolo, quadrato o pentagono oppure una struct figura?
    Per favore aiutatemi perchè non ci levo le gambe!!
    ps:nel caso non fossi stata chiara i testi degli esercizi sono qui http://margot.di.unipi.it/mediawiki/...ne_come_metodi

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    10
    ciao, grazie per aver risposto prima di tutto! Quindi la soluzione potrebbe essere usare come parametri per la funzione i puntatori void?Ma l'idea di trasformare la union figura in una struct contenente la union è corretta o c'è uno sbaglio concettuale?

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Forse ho letto male, ma non trovo dove c'è scritto di trasformare la union in una struct.
    Quello che è richiesto è di aggiungere un puntatore a funzione che data una specifica istanza della union, consenta di calcolare il perimetro.
    Diciamo che dal mio personale punto di vista, una union usata in quel modo è sbagliata, visto che nessuno vieta di inserire un triangolo ed estrarre un pentagono. Personalmente avrei usato una struct di figure diverse, ma l'uso della union non è sbagliato di per se.

    L'uso dei puntatori void è obbligato dal momento che non si sa a priori con che figura verrà invocata la funzione. Quindi dovendo essere generica, deve poter prendere qualsiasi tipo di parametro. Il problema semmai è che ogni singola funzione reale deve adattarsi alla figura reale, ma quale funzione associare alla figura lo decidi tu. E nulla (a livello di compilatore) vieta di usare la funzione perimetro del triangolo su un pentagono, per esempio.

    Per quello che ho capito, la cosa diventa (supponendo che la funzione in questione non restituisca nulla):
    codice:
    typedef void (*CalcolaPerimetro)(const void*);
    
    void CalcolaTriangolo(const void*);
    void CalcolaQuadrato(const void*);
    void CalcolaPentagono(const void*);
    
    union figura{
    struct triangolo t;
    struct quadrato q;
    struct pentagono p;
    CalcolaPerimetro cp;
    };
    
    union figura figuraTriangolo;
    figuraTriangolo.cp = CalcolaTriangolo; // ora posso solo usare un triangolo
    figuraTriangolo.t.p1 = ...
    /* etc */
    
    figuraTriangolo.cp(&figuraTriangolo.t);
    
    /* Qui il punto. Posso usare figura Triangolo anche per un pentagono.
    figuraTriangolo.cp = CalcolaPentagono; // ora posso solo usare un pentagono
    figuraTriangolo.p.p1 = ...
    
    figuraTriangolo.cp(&figuraTriangolo.p);
    Come vedi, usare una union non è di per se sbaglaito, ma può creare un pò di confusione.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2009
    Messaggi
    10
    Perfetto ti ringrazio molto, ho messo i puntatori void come parametro alle funzioni per calcolare i vari perimetri e al puntatore a funzione in figura e ora funziona. Ora un ultima cosa: mi sto preparando per l'orale del laboratorio in c e nel programma è riportato "uso di campi di tipo "puntatore a funzione" per simulare chiamate di metodo con le struct" e l'esercizio sopra faceva parte delle esercitazioni e si riferiva proprio a questo argomento. Correggimi se sbaglio: in java abbiamo la programmazione ad oggetti e quindi in una classe abbiamo variabili e metodi d'istanza, in C la programmazione ad oggetti non c'è ma è "emulabile" attraverso le struct e l'inserimento al loro interno di puntatori a funzione, giusto?
    Grazie ancora!

  6. #6
    Originariamente inviato da chu
    in C la programmazione ad oggetti non c'è ma è "emulabile" attraverso le struct e l'inserimento al loro interno di puntatori a funzione, giusto?

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.