Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] funzioni in strutture

    posso mettere come elemento di una struttura una funzione che mangia un elemento della stessa struttura (o sui sottoelementi) e sputa un numero?
    Per esempio:

    // cromosoma
    typedef struct{
    gene g[np]; // vettore dei geni
    double lp=lp(c); <--- non so se e' giusto qui
    } crom;

    // lunghezza percorso
    double lp(crom c){
    for(int i=0,double lp=0.;i<(np-1);i++){
    lp+=distanza(c.g[i],c.g[i+1]);
    }
    return lp;
    }

  2. #2
    Utente bannato
    Registrato dal
    Sep 2003
    Messaggi
    1,012
    Funziona solo in C++ (con qualche modifica), altrimenti ti tocca fare una funzione a parte che lo inizializzi

  3. #3

    Re: [C] funzioni in strutture

    Originariamente inviato da yagorossi
    posso mettere come elemento di una struttura una funzione che mangia un elemento della stessa struttura (o sui sottoelementi) e sputa un numero?
    1° variante
    codice:
    #include <stdio.h>
    
    typedef struct {
      int a;
      int (*doTask)(crom*);
    } crom;
    
    int fooTask(crom* c)
    {
      return c->a / 2; 
    }
    
    int main()
    {
      crom c = {10, fooTask};
    
      printf("%d", c.doTask(&c));
    
      return 0;
    }

    2° variante, utilizzata da alcuni moduli del kernel di linux
    codice:
    #include <stdio.h>
    
    struct data {
      char buffer[80];
    };
    
    struct data_operations {
      void (*fill)(struct data *);
      void (*convert)(struct data *);
    };
    
    void con_fill(struct data *d)
    {
      printf("con_fill\n");
    }
    
    void con_convert(struct data *d)
    {
      printf("con_convert\n");
    }
    
    struct data_operations con_data_operation = {
      fill: con_fill,
      convert: con_convert
    };
    
    int main()
    {
      struct data d;
      struct data_operations* d_op = &con_data_operation;
    
      d_op->fill(&d);
      d_op->convert(&d);
      
      return 0;
    }

    In c++ questa cosa si fa in maniera più pulita, dato che è orientato ad oggetti e supporta il polimorfismo, e non è necessario "simularlo" con questa tecnica.

  4. #4
    correzione:

    codice:
    #include <stdio.h>
    
    
    typedef struct crom {
      int a;
      int (*doTask)(struct crom*);
    } crom;
    
    
    int fooTask(crom* c)
    {
      return c->a / 2; 
    }
    
    int main()
    {
      crom c = {10, fooTask};
      
      printf("%d\n", c.doTask(&c));
      
      return 0;
    }

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.