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

    [C] segment fault

    Salve! secondo voi c'è qualche motivo particolare per cui un codice compilato ed eseguito correttamente su un pc a 32 bit su linux funziona correttamente mentre lo stesso codice compilato ed eseguito su un pc a 64 bit (sempre su linux) dà segment fault ?
    Il codice crea una matrice nxn allocando dinamicamente lo spazio necessario (per intenderci uso la funzione calloc per allocare lo spazio necessario). Quando il codice cerca di riempire la matrice con semplici valori costanti, ottengo il segment fault.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ci possono essere tanti motivi, ma se posti la parte del codice dove si verifica il problema, si puo' essere piu' precisi ...

  3. #3
    grazie per la risposta. Provo a darti maggiori info. Ho una struttura dati grafo così fatta presente nella libreria libgraph

    dichiarata in libgraph.h
    typedef struct
    {
    unsigned int *vertices;
    unsigned int **weight;
    unsigned int num_vertices;
    }graph;

    La matrice incriminata è weight.
    Creo ed alloco lo spazio necessario al grafo con la funzione dichiarata in libgraph

    graph* init_graph(value num_vertices)
    {
    int i;
    graph *g;
    g = (graph *)malloc(sizeof(graph));
    g->num_vertices = num_vertices;
    g->vertices = (vertex *)malloc(g->num_vertices*sizeof(vertex));
    g->weight = (value **)calloc(g->num_vertices,sizeof(value));
    for(i=0;i<g->num_vertices;i++)

    g->weight[i]=(value *) calloc(g->num_vertices,sizeof(value));

    return g;
    }

    Nel mio codice dichiaro un puntatore al grafo
    graph *g;

    alloco lo spazio necessario chiamando la funzione di prima

    g = init_graph(8)

    ed inizializzo la matrie così

    for(i = 0; i < 8/*g->num_vertices*/; i++)
    for(l = 0; l < 8/*g->num_vertices*/; l++)
    {
    g->weight[i][l] = 0;
    }

    Il problema risiede proprio in quest ultimo pezzo di codice. Ad un certo punto, mentre il programma inizializza la matrice, si interrompe con un segment fault. Tra l'altro l'errore non capita nemmeno ai "bordi" della matrice il che farebbe pensare che si cerca di accedere ad uno spazio di memoria non allocato. Ripeto il codice su una macchina a 32bit funziona bene

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Cosa e' value ?

  5. #5
    a si scusa non ti ho postato l'ultima versione del codice: value ed index sono entrambi unsigned int.
    Nell'ultima versione del codice ho sostituito value e index direttamente con unsigned int proprio per evitare che ci fossero problemi nel casting

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non ho controllato approfonditamente (anche perche' il codice non e' scritto chiaramente ... devi usare i tag [ CODE ] per inserirli nel forum ...) ma credo che questa

    g->weight = (value **)calloc(g->num_vertices,sizeof(value));

    dovrebbe essere

    g->weight = (value **)calloc(g->num_vertices,sizeof(value *));

  7. #7
    Hai perfettamente ragione! ora funziona grazie mille

  8. #8
    Utente di HTML.it L'avatar di XWolverineX
    Registrato dal
    Aug 2005
    residenza
    Prague
    Messaggi
    2,565
    e perchè sul sistema a 32 bit funzionava???
    "Se proprio devono piratare, almeno piratino il nostro." (Bill Gates)

    "Non è possibile che 2 istituzioni statali mi mettano esami nello stesso giorno." (XWolverineX)

    http://xvincentx.netsons.org/programBlog

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    La spiegazione stai nella differenza tra i valori di

    sizeof(unsigned int) e sizeof(unsigned int *)

    nei sistemi a 32 e 64 bit ...

  10. #10
    se ho capito bene sizeof(unsigned int ) e sizeof(unsigned int *) su sistemi a 32 bit hanno la stessa grandezza poichè un intero è 32 bit proprio come l'indirizzo ( e quindi il puntatore)
    mentre su sistemi a 64 bit il dato (o forse l'indirizzo ???) è 64 bit mentre l'altro è a 32

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.