Realloc array **void

di il
6 risposte

Realloc array **void

Buongiorno a tutti, ho un problema con la realloc.. Ho fatto vari tentativi, e mi sorge il dubbio che non sia proprio possibile fare una realloc di questo tipo. L'array in questione è un array di puntatori a void, cioè un array che può contenere un tipo qualsiasi di dato.
#define ARRAY_INITIAL_CAPACITY 10 //capacità iniziale dell'array

typedef struct qArray{
    void ** data; //puntatore ad array di un tipo generico
    int size; //dimensione corrente dell'array
    int capacity;//capacità totale dell'array
    }qArray;

ARRAY initARRAY (ARRAY a){
    a=(qArray*)malloc(sizeof(qArray));
    a->size=0;
    a->capacity=ARRAY_INITIAL_CAPACITY;
    a->data=(void**)malloc(sizeof(void*)*a->capacity);

    return a;
}
void setObjectARRAY (void ** A, int i, void * k){
    ARRAY *a=(ARRAY*)A;
    if(*a==NULL) //inizializzo
        *a=initARRAY(*a);
    if((*a)->capacity <= (*a)->size){//controllo che ci sia spazio
    //rialloco al doppio la capacità dell'array
        (*a)->data=realloc(((*a)->data), ((*a)->capacity*2) * sizeof(void*));
        }
    if((*a)->size<i) //sto inserendo un nuovo elemento
        (*a)->size=i;
    //altrimenti sto aggiornando un valore di un elemento esistente
    (*a)->data[i]=k;
}
quando supero la dimensione dell'array, cioè a partire dall'11esimo elemento, il programma riceve un segment fault al rigo della riallocazione..
Premetto che sto svolgendo un progetto, dove mi è espressamente richiesto che la memoria dell'array debba essere allocata in questo modo, cioè con una capacità generale che va aggiornata ogni qual volta supero la soglia memorizzata in a->size.
Grazie per l'eventuale attenzione!

6 Risposte

  • Re: Realloc array **void

    Cosa è ARRAY ? Manca parte del codice
  • Re: Realloc array **void

    oregon ha scritto:


    Cosa è ARRAY ? Manca parte del codice
    Giusto!!
    typedef struct qArray{
        void ** data; //puntatore ad array di void 
        int size; //dimensione corrente dell'array
        int capacity;//capacità totale dell'array
        }qArray;
    typedef struct qArray * ARRAY;
  • Re: Realloc array **void

    E un main per provare?

    Ma non mi rispondere tra 6 giorni ...
  • Re: Realloc array **void

    oregon ha scritto:


    E un main per provare?

    Ma non mi rispondere tra 6 giorni ...
    Ne devo scrivere uno di prova. Questo è un estratto di codice da un progetto molto molto più lungo.
  • Re: Realloc array **void

    Però senza un main di prova non posso compilare e provare ...
  • Re: Realloc array **void

    Ho cercato di sintetizzare al minimo il codice..
    priorityqueue.h:
    #ifndef PRIORITYQUEUE_H_INCLUDED
    #define PRIORITYQUEUE_H_INCLUDED
    
    typedef struct priorityQueue * PQUEUE;
    
    /*** CALLBACK AL TIPO DI DATO ***/
    typedef int (*COMPAREDATA)(void * , void * ); //confronta due elementi e restituisce -1, 0, 1
    typedef void (*PRINTDATA) (void *); //visualizza al video il contenuto di un elemento
    typedef void * (*INPUTDATA) (void); //legge un elemento dallo stdin
    
    /*** CALLBACK AL TIPO DI STRUTTURA DATI CON CUI E' IMPLEMENTATA LA CODA ***/
    typedef void (*PRINT) (void *, PRINTDATA);
    typedef void * (*GETOBJECT) (void *, int);
    typedef void (*SETOBJECT) (void **,int, void *);
    typedef int (*GETPRIORITY) (void*,void*,COMPAREDATA);
    
    
    /*** FUNZIONI PER GESTIRE UNA CODA A PRIORITA' ***/
    
    PQUEUE insertKey (PQUEUE Q, void * k,GETOBJECT getObject, SETOBJECT setObject, COMPAREDATA compareData);
    PQUEUE increaseKey (void * Q, int i, void * k, GETOBJECT getObject, SETOBJECT setObject, COMPAREDATA compareData);
    int parent(int i);
    
    /*** Funzioni ausiliari ***/
    void * getInput(void); //Legge l'input da tastiera
    
    
    #endif // PRIORITYQUEUE_H_INCLUDED
    
    priorityqueue.c:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "priorityqueue.h"
    #include "array.h"
    
    typedef struct priorityQueue{
        void * coda;
        int heapsize;
        }priorityQueue;
    
    void * getInput(void){
        int i; char c; int j=0;
        char * str=malloc(80*sizeof(char));
        char buffer[80];
    
        if((c=getchar())!= '\n') //per liberare stdin dalla pressione di invio
            buffer[j++]=c;
    
        for(i=j; ((c=getchar())!='\n') && (i<80); i++)
                buffer[i]=c;
    
        buffer[i] = '\0';
        strcpy(str,buffer);
        return str;
    }
    
    PQUEUE insertKey (PQUEUE Q, void * k,GETOBJECT getObject, SETOBJECT setObject, COMPAREDATA compareData){
        if(Q==NULL){
            Q=(priorityQueue*)malloc(sizeof(priorityQueue));
            Q->coda=NULL;
            Q->heapsize=0;
        }
        Q->heapsize=Q->heapsize+1;
        Q->coda=increaseKey(Q->coda,Q->heapsize,k,getObject,setObject,compareData);
        return Q;
    }
    
    PQUEUE increaseKey (void * Q, int i, void * k, GETOBJECT getObject, SETOBJECT setObject, COMPAREDATA compareData){
        setObject(&Q,i,k);
        while( (i>1) && ( compareData(getObject(Q,parent(i)),getObject(Q,i)) < 0 ) ){
            void * tmp=getObject(Q,i);
            setObject(&Q,i,getObject(Q,parent(i)));
            setObject(&Q,parent(i), tmp);
            i=parent(i);
        }
        return Q;
    }
    
    int parent(int i){
        return i/2;
        }
    
    
    array.h:
    #ifndef ARRAY_H_INCLUDED
    #define ARRAY_H_INCLUDED
    
    typedef struct qArray * ARRAY;
    
    ARRAY initARRAY (ARRAY a);
    void * insertARRAY (void * A, void * k);
    void setObjectARRAY (void ** A, int i, void * k);
    void * getObjectARRAY(void * A, int i);
    
    #endif // ARRAY_H_INCLUDED
    array.c:
    #include <stdio.h>
    #include <stdlib.h>
    #include "priorityqueue.h"
    #include "array.h"
    
    #define ARRAY_INITIAL_CAPACITY 3 //capacità iniziale dell'array
    
    typedef struct qArray{
        void ** data; //puntatore ad array di void //GETPRIORITY TORNA L'INDICE /GETDATO TORNA IL DATO
        int size; //dimensione corrente dell'array
        int capacity;//capacità totale dell'array
        }qArray;
    
    ARRAY initARRAY (ARRAY a){
        a=(qArray*)malloc(sizeof(qArray));
        a->size=0;
        a->capacity=ARRAY_INITIAL_CAPACITY;
        a->data=(void**)malloc(sizeof(void*)*a->capacity);
    
        return a;
    }
    void setObjectARRAY (void ** A, int i, void * k){
        ARRAY *a=(ARRAY*)A;
        if(*a==NULL) //inizializzo
            *a=initARRAY(*a);
        if((*a)->capacity <= (*a)->size){//controllo che ci sia spazio
        //rialloco al doppio la capacità dell'array
            (*a)->capacity=(*a)->capacity*2;
            (*a)->data=realloc(((*a)->data), (*a)->capacity * sizeof(void*));
            }
        if((*a)->size<i) //sto inserendo un nuovo elemento
            (*a)->size=i;
        //altrimenti sto aggiornando un valore di un elemento esistente
        if(k==NULL)//elimino ultimo elemento
            (*a)->size=(*a)->size-1;
        printf("Inserisco %d in i %d\n",(int)k,i);
        (*a)->data[i]=k;
    }
    
    void * getObjectARRAY(void * A, int i){
        ARRAY a=(ARRAY)A;
        return a->data[i];
        }
    
    datoINT.h:
    #ifndef DATOINT_H_INCLUDED
    #define DATOINT_H_INCLUDED
    
    int compareINT(void * a, void * b);
    void * inputINT (void);
    
    #endif // DATOINT_H_INCLUDED
    datoINT.c:
    //datoINT.c
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "datoINT.h"
    
    int compareINT (void * a, void * b){
        int a1= (int) a;
        int b1= (int) b;
        return a1-b1;
    }
    
    void * inputINT (void){
        int in;
        printf("Inserisci un numero intero: ");
        scanf("%d", &in);
        return (void*)in;
    }
    main:
    #include <stdio.h>
    #include <stdlib.h>
    #include "priorityqueue.h"
    #include "array.h"
    #include "datoINT.h"
    
    int main(){
        PQUEUE Q=NULL;
        int i; void *key;
        for(i=0;i<7;i++){
            key=inputINT();
            Q=insertKey(Q,key,getObjectARRAY, setObjectARRAY, compareINT);
        }
    return 0;
    }
    L'errore compare a runtime quando si prova ad inserire il 4° elemento (in quanto ho impostato capacity a 3), al rigo della realloc in array.c
Devi accedere o registrarti per scrivere nel forum
6 risposte