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

    [c] gestire struttura dati in modo astratto

    ciao a tutti

    vorrei implementare in c una struttura dati, tipo stack o lista, però vorrei slegarmi dal tipo di dati contenuto, in modo da poterla utilizzare per inserirci struct,int,double,char, ecc ecc

    è possibile?

    grazie nik
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  2. #2

    Re: [c] gestire struttura dati in modo astratto

    Originariamente inviato da nik600
    vorrei implementare in c una struttura dati, tipo stack o lista, però vorrei slegarmi dal tipo di dati contenuto, in modo da poterla utilizzare per inserirci struct,int,double,char, ecc ecc

    è possibile?
    Di solito la soluzione piu` comune in C e` una cosa del genere...

    codice:
    struct element {
        /* ... */
        void *data;
        int data_size;
        /* ... */
    };
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  3. #3
    ok, e poi ogni volta che estraggo lelemento faccio un cast, giusto?
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  4. #4
    Originariamente inviato da nik600
    ok, e poi ogni volta che estraggo lelemento faccio un cast, giusto?
    la crei con malloc esempio

    struct pippo{
    int *c;
    }
    struct pippo s,v;
    s.c=(int *)malloc(sizeof(int)*12213);
    v.c=(int *)malloc(sizeof(int)*113);

    e poi ci accedi come *(s.c+23) o *(v.c+1);

    infine devi ricordarti di liberare la memoria..

    spero di non aver sbagliato sintassi..

  5. #5
    ciao

    io ho fatto una cosa di questo tipo:

    struttura dati
    codice:
    typedef struct ArrayList{
    
      int initialized;//variabile di controllo
    
      float growth;//crescita in percentuale
      int size;//dimensione effettiva
      int indice;//indice di inserimento
      
      void **db;//array di elementi
    
    
    }ArrayList;
    
    /*
      funzione che fa crescere la dimensione dell'array
    */
    void cresci(ArrayList *);
    
    /*
      inizializza la struttura dati
    */
    void initialize(ArrayList *,int,float);
    
    void add_element(ArrayList *,void *);
    
    void print_array(ArrayList *);
    
    void copia(void **from,int size,void **to);
    funzioni
    codice:
    #include "funzioni.h"
    
    void initialize(ArrayList *array,int size,float growth){
    
      array->growth=growth;
      array->size=size;
      array->indice=0;
    
      //alloco la memoria richiesta
      array->db=(void *)malloc(sizeof(void *)*array->size);
    
      array->initialized=1;//segno la struttura dati come inizializzata
    
    }
    
    void cresci(ArrayList *array){
      printf("cresco\n");
      int size_tmp=array->size;
    
      //incremento la dimensione
      array->size+=(array->size*array->growth);
     
      //creo il nuovo database
      void **new_db=(void *)malloc(sizeof(void *)*array->size);
      
      //copio i dati dal vecchio nel nuovo
      copia(array->db,size_tmp,new_db);
    
      //elimino il vecchio
      free(array->db);
    
      //assegno il nuovo alla struttura dati
      array->db=new_db;
    }
    
    void copia(void **from,int size,void **to){
      int i=0;
      printf("copio\n");
      for(i=0;i<size;i++){
        to[i]=from[i];
      }
      printf("fine copia\n");
    }
    
    
    void add_element(ArrayList *array,void *element){
    
      //controllo che la struttura sia stata inizializzata
      if(array->initialized){
        
        printf("elemento = %i\n",(int)element);
        if(array->indice==array->size){
    
          cresci(array);
          array->db[array->indice]=element;
          array->indice++;
        }else{
          
          array->db[array->indice]=element;
          array->indice++;//incremento l'indice
          
        }
        
      }else{
        printf("attenzione la struttura dati non è stata inizializzata\n");
      }
      
    
    }
    
    void print_array(ArrayList *array){
      int i;
      for(i=0;i<array->indice;i++){
        printf("elemento %i=%i\n",i,(int)array->db[i]);
      }
    }
    main

    codice:
    #include <stdio.h>
    #include "src/arraylist.c"
    
    int main(){
    
      ArrayList *a;
    
      a=(ArrayList *)malloc(sizeof (ArrayList));
    
      initialize(a,10,0.1);
    
      int i=0;
      int *element;
      
      for(i=0;i<10;i++){
        element=(int *)malloc(sizeof (int));
        *element=i;
        //printf("elemento- %i=%i\n",i,*element);
    
        add_element(a,element);
      }
     
      printf("stampo:\n\n");
      print_array(a);
      
    
    
      return 0;
    }

    però qando eseguo ottengo questo:

    codice:
    elemento = 134520984
    elemento = 134521000
    elemento = 134521016
    elemento = 134521032
    elemento = 134521048
    elemento = 134521064
    elemento = 134521080
    elemento = 134521096
    elemento = 134521112
    elemento = 134521128
    stampo:
    
    elemento 0=134520984
    elemento 1=134521000
    elemento 2=134521016
    elemento 3=134521032
    elemento 4=134521048
    elemento 5=134521064
    elemento 6=134521080
    elemento 7=134521096
    elemento 8=134521112
    elemento 9=134521128
    in pratica nella funzione add_elemento perdo il valore di i!

    dove sbaglio?

    grazie nik
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  6. #6
    ma guarda che X *c e' un puntatore ad un indirizzo di tipo X (anche se questo non e' propriamente vero)

    se tu vuoi un array di elementi X(sia X una struttura o cio' che vuoi)
    ti basta un puntatore *c e non un **c (che definisce un array di array)
    infatti quando fai
    (X *)malloc(sizeof(X)*n)
    n e' la grandezza dell'area di memoria puntata da c (o se vuoi la grandezza dell' array di oggetti X a cui punta c),
    quindi credo(non ho guardato bene)
    che il tuo errore sia

    void **db;//array di elementi

    che deve diventare void *db;

  7. #7
    ciao

    ti ringrazio per la segnalazione, ho capito che prima di complicarmi la vita con le cose astratte è meglio vedere prima come funzionano in pratica...
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

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 © 2024 vBulletin Solutions, Inc. All rights reserved.