Pagina 2 di 2 primaprima 1 2
Visualizzazione dei risultati da 11 a 18 su 18
  1. #11
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Sopra ti avevo linkato la documentazione di realloc, guarda qual'è il primo argomento, è l'area di memoria da riallocare...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  2. #12
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Se vuoi evitare accessi ad aree di memoria non valide, utilizza la calloc anche per G->dizionario:

    codice:
    G->dizionario = (void**)calloc(G->N_Max ,sizeof(void*) );
    Originariamente inviato da Scara95
    codice:
    G->dizionario = (void**)malloc(sizeof(void*) * G->N_Max );
    Vorrei farti notare che questa allocazione di memoria ha poco senso, un puntatore a void è un puntatore a un'area di memoria senza una dimensione specifica (anche se alcuni garantiscono una grandezza pari a quella di un int per un void*, in ogni caso non è corretta e non ha un significato logico).
    Ogni puntatore punta ad un indirizzo virtuale, non c'è differenza tra void*, int*, int** e char*** come dimensione.Perché essendo indirizzi virtuali, avranno tutti come dimensione i bit necessari a indirizzare ogni byte.
    Il motivo dei cast che si fanno in C è quello di controllare la correttezza semantica delle operazioni, tutto qua.

  3. #13
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Dunque scara95 quello che dici tu dovrebbe essere una cosa del tipo:

    codice:
    G->archi = (NODO**)realloc(G->archi, sizeof(NODO)*(G->N_Max+STEP_GRAFO));
    
    for ( i = G->N_Max; i<G->N_Max+STEP_GRAFO; i++ )
              G->archi[i] = NULL;
    Inizializzando esplicitamente i puntatori a NULL.
    Con i sogni possiamo conoscere il futuro...

  4. #14
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Per evitare di entrare in questo if:

    codice:
    if (G->dizionario[u] != NULL && G->dizionario[v] != NULL )
    Devi settare a zero la memoria che allochi in G->dizionario.
    G->archi non può influire in alcun modo su questa cosa.

  5. #15
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Ok perfetto quindi ho:

    codice:
    G->dizionario = (void*)realloc(G->dizionario, sizeof(void*)*(G->N_Max+STEP_GRAFO));
    
    for ( i = G->N_Max; i<G->N_Max+STEP_GRAFO; i++ )
              G->dizionario[i] = NULL;
    Con i sogni possiamo conoscere il futuro...

  6. #16
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Mi sembrava che il tuo problema fosse:
    "devo effettuare la realloc,riallocando G->archi di + STEP_NODO(cioè 100) "
    Guarda che G->archi e G->dizionario sono due entità separate, fai tutto come ti ha detto scara per quanto riguarda l' allocazione di G->archi, solo che setti a zero la memoria di G->dizionario come ti ho detto:

    codice:
    G->dizionario = (void**)calloc(G->N_Max ,sizeof(void*) );
    Ma l' avevo già scritto nel post precedente.
    Comunque una funzione per settare la memoria è la memset, al posto avresti potuto fare:

    codice:
    G->dizionario = (void**)malloc(G->N_Max * sizeof(void*) );
    memset((void*)G->dizionario, 0, G->N_Max * sizeof(void*) );

  7. #17
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Who Am I, forse non ti è chiara una cosa.

    Devo poter inizializzare i puntatori a 0 ogni volta che faccio la realloc sia per:
    NODO **G->archi
    sia per void *dizionario.
    Con i sogni possiamo conoscere il futuro...

  8. #18
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    codice:
    G->archi = (NODO**) realloc ( sizeof(NODO*) * (G->N_Max+STEP_NODO));
    memset( &(void*)(G->archi)[G->N_Max], 0, STEP_NODO*sizeof(NODO*) );

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