ciao a tutti.
ho un problema: ho scritto un programma per determinare minimi percorsi tra i nodi di una rete.
durante l'esecuzione a volte mi segnale errore di violazione di accesso nella funzione calculate_routing in corrispondenza dell'aterisco.
di seguito allego la funzione che mi causa errore, altre funzioni che vengono richiamate da quest'ultima e le strutture utilizzate.
spero che qualcuno possa darmi un consiglio.
codice://calculate_routing: Calculate the minimum path for each couple of source-destination nodes void calculate_routing(NETINFO_PTR netinfo_ptr, LISTNODEPTR adiacence_array, PATH* routing_array, LISTNODEPTR path_array, STATENODE** nodeinfo_mtx) { int i, j, num, back; LISTNODEPTR current = NULL; LISTNODEPTR swapptr; LISTNODEPTR cur_adiacence = NULL; LISTNODEPTR actual_list; enum stop_condition {TRUE, FALSE} stop; stop = FALSE; actual_list = listnode_init(); swapptr = listnode_init(); //-- Nodes initialization ----------------------- for (i = 0; i <= netinfo_ptr->size->NNODES - 1; i++) { for (j = 0; j <= netinfo_ptr->size->COUPLE_NUM - 1; j++) { nodeinfo_mtx[i][j].predecessor = INIT_PRED; nodeinfo_mtx[i][j].precedent = INIT_PRED; nodeinfo_mtx[i][j].hop_number = INFINITY; nodeinfo_mtx[i][j].label = tentative; } } //-- Sources initialization --------------------- for (i = 0; i <= netinfo_ptr->size->COUPLE_NUM - 1; i++) { nodeinfo_mtx[routing_array[i].source][i].label = permanent; nodeinfo_mtx[routing_array[i].source][i].hop_number = 0; routing_array[i].length = 0; listnode_insert(actual_list, routing_array[i].source); listnode_insert(&path_array[i], routing_array[i].source); num = 0; while (stop != TRUE) { current = actual_list; while (current != NULL && stop != TRUE) { cur_adiacence = &adiacence_array[current->node]; while (cur_adiacence != NULL && stop != TRUE) { * if (nodeinfo_mtx[cur_adiacence->node][i].label == tentative) { nodeinfo_mtx[cur_adiacence->node][i].label = permanent; nodeinfo_mtx[cur_adiacence->node][i].hop_number = num; nodeinfo_mtx[cur_adiacence->node][i].predecessor = current->node; listnode_insert(swapptr, cur_adiacence->node); if (cur_adiacence->node == routing_array[i].destination) { stop = TRUE; back = routing_array[i].destination; while (back != routing_array[i].source) { nodeinfo_mtx[back][i].precedent = nodeinfo_mtx[back][i].predecessor; listnode_insert(&path_array[i], back); back = nodeinfo_mtx[back][i].predecessor; } listnode_insert(&path_array[i],routing_array[i].source); } } cur_adiacence = cur_adiacence->listptr; } current = current->listptr; } listnode_free(actual_list); actual_list = listnode_init(); if (stop != TRUE) listnode_copy(swapptr, actual_list); listnode_free(swapptr); swapptr = listnode_init(); num++; } routing_array[i].length = num; stop = FALSE; } }
codice:// listnode_init: Initialize a list of nodes LISTNODEPTR listnode_init() { LISTNODEPTR tmp_list = malloc(sizeof(LISTNODE)); if(tmp_list != NULL) { tmp_list->node = -1; tmp_list->listptr = NULL; } return tmp_list; } // listnode_insert: Insert a new node in the list of nodes void listnode_insert(LISTNODEPTR node_list, int node) { LISTNODEPTR newnode_ptr, prevnode_ptr, currnode_ptr; if (node_list->node == -1) node_list->node = node; else { newnode_ptr = malloc(sizeof(LISTNODE)); if (newnode_ptr != NULL) { newnode_ptr->node = node; newnode_ptr->listptr = NULL; prevnode_ptr = NULL; currnode_ptr = node_list; while (currnode_ptr != NULL) { prevnode_ptr = currnode_ptr; currnode_ptr = currnode_ptr->listptr; } if (prevnode_ptr != NULL) prevnode_ptr->listptr = newnode_ptr; else fprintf(stderr, "\nError: cannot allocate memory for the node.\n"); } } } // listnode_free: Clear a list of nodes and free memory void listnode_free(LISTNODEPTR node_list) { LISTNODEPTR aux_ptr, curr_ptr; if (node_list != NULL) { curr_ptr = node_list; aux_ptr = curr_ptr->listptr; free(curr_ptr); curr_ptr = NULL; listnode_free(aux_ptr); } } // listnode_copy: Copy nodes from a list (src) to another (dest) void listnode_copy(LISTNODEPTR src, LISTNODEPTR dest) { while (src != NULL) { listnode_insert(dest, src->node); src = src->listptr; } }
codice:// List of nodes struct listnode { int node; struct listnode* listptr; }; typedef struct listnode LISTNODE; typedef LISTNODE* LISTNODEPTR; struct nodelinks { LISTNODEPTR inlinks; LISTNODEPTR outlinks; }; typedef struct nodelinks NODELINKS; typedef NODELINKS* NODELINKS_PTR; // Node State struct state { int predecessor; int precedent; int hop_number; enum {permanent, tentative} label; }; typedef struct state STATENODE; // Routing Path Definition struct path { int source; int destination; int length; float penalty; int rate_quantity; int n_path; }routing; typedef struct path PATH; //netinfo: data from files struct netinfo_const { double delta; double W; double radius; double lambda; double netdia; }; typedef struct netinfo_const NICONST; typedef NICONST* NICONST_PTR; struct netinfo_size { int NNODES; int COUPLE_NUM; int POWERLEVELS_NUM; int CAPACITYLEVELS_NUM; }; typedef struct netinfo_size NISIZE; typedef NISIZE* NISIZE_PTR; struct netinfo_data { double** ncoord_mtx; PATH* routing_array; double* powercost_array; double** pathcouple_mtx; double* powerlevel_array; double* capacitylevel_array; double** normconst_mtx; double* sigma_array; }; typedef struct netinfo_data NIDATA; typedef NIDATA* NIDATA_PTR; struct netinfo { NICONST_PTR consts; NISIZE_PTR size; NIDATA_PTR data; }; typedef struct netinfo NETINFO; typedef NETINFO* NETINFO_PTR;

Rispondi quotando
