Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [c] Realloc, anomalia

    Ok c'è qualcosa che non va in una parte del codice che posto:

    codice:
    ALexception extendArray(arraylist_t* al, int dim){
    
        int i;
        item_t** tarray;
        
        //general check
        if(al == NULL){
            printf("arraylisy not initialized or null\n");
            return ALParametersError;
        }
    
        //realloc
    
        tarray = (item_t**) realloc(al->array,  al->size+dim);
    
        if(tarray == NULL){
            printf("error, memory full");
            return ALMemoryError;
        }
        else{ //refresh and initialization
            al->array = tarray;
            al->size = al->size + dim;
    
            for(i = al->size - dim; i< al->size; i++){
                al->array[i] = returnVoidElement();
            }
            
        }
        return ALSuccess;
    }
    la riga incriminata è quella della realloc
    allora faccio qualche premessa. Si tratta di una funzione in uso in una libreria particolare che ho creato così per comodità. Semplicemente gestisce un mio tipo di array.

    la struct di base è:
    codice:
    struct arraylist{
    	item_t** array;
    	int size;
    };
    L'extendArray serve per aumentare la dimensione dell'array nel caso io abbia richiesto un inserimento di un valore in una posizione che fuoriesce dalla size attuale dell'array (in teoria sarebbe una static, ma sto ancora decidendo se renderla disponibile al client nel caso voglia estendere l'array per altri motivi)

    Fondamentalmente il mio array, col mio programma di test, al momento della chiamata è formato da tre item_t* creati da me nel main che sono inseriti in posizione 0-1-2.
    Tutte le altre posizioni sono occupate da VUOTO che è un particolare item_t* gestito dalla mia libreria item.h, comunque non è che importi ora.

    Quando chiamo la realloc succede qualcosa di strano °_°. Sin poco prima controllando con il debugger effettivamente tutte le posizioni dell'array sono settate a valore VUOTO, tranne 0-1-2 che appunto sono quelle in cui tramite il main ho inserito i miei oggetti
    subito dopo la realloc però, sia in tarray sia in al->array il valore in posizione 3 cambia improvvisamente, senza motivo, settandosi ad un altro indirizzo che risulta non leggibile (infatti se chiamo la funzione che stampa tutto l'array, mi da un segmentation failure e anche gdb mi segnala sin subito dopo l'esecuzione della realloc che la posizione al->array[3] risulta non leggibile mentre tutte le altre sono effettivamente uguali al valore che avevano in precedenza, come dovrebbe essere)
    Ora, che diavolo c'è di sbagliato? A che si deve questo comportamento?

  2. #2
    Oh God, che errore noob -_- scusate stavo dormendo probabilmente

    mi son dimenticato di inserire nella realloc il * (sizeof(item_t*))
    -_- figo il fatto che ci si renda conto dell'errore esattamente 5 secondi dopo aver postato sul forum

    risolto

  3. #3
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Giusto per curiosità: quel item_t** rappresenta una matrice? E quello che contiene è allocato dinamicamente?
    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.

  4. #4
    no, è un vettore di item_t*
    ogni item_t* è allocato dinamicamente

  5. #5
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Che libreria usi per dichiarare un item_t ?
    Io su c++ reference ho trovato solo time_t.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Te lo crei no?
    typedef qualcosa item_t
    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.

  7. #7
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Si ma in C il bool alla fine contiene un byte,in cpp come si fa a creare un elemento di 1 bit?

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ma dove lo vedi l'elemento da un bit?
    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.

  9. #9
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Ah si scusa,ho capito.
    Praticamente usi item_t per dichiarare la struttura,ho capito adesso.
    Pensavo lo usassi per crearti un tipo nuovo con memoria diversa.

  10. #10
    si item_t come ho detto è gestito da un altra libreria item.h

    per la precisione nel punto h c'è solo
    typedef struct item item_t

    mentre nel .c
    struct item{
    int key;
    int value;
    char* definition;
    };

    ma come già avevo specificato, era irrilevante

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.