Newsgroup: it.comp.lang.c
Titolo: Help Me

Salve a tutti...mi aiutereste a capire cosa c'è che non va in questo
codice?
Grazie in anticipo!!
#include <string.h>
#include <malloc.h>
#include <stdlib.h>
#include <time.h>
int MAXPESO= 100; //MAX PESO ARCO
int MAXITEM = 0;
struct _item **itemArray = NULL;;
struct _item {
	int pesoNodo;
	int numSucc;
struct _succ *primoSucc;
};
struct _succ {
	int pesoArco;
	int id;
	struct _succ *next;
};
void * construisciSuccessori(int maxsucc) {
	void *retval = NULL;
	struct _succ *aux = NULL;
	struct _succ *succ = NULL;
	int i = 0;
	for(i=0; i < maxsucc; i++) {
		succ = (struct _succ *) malloc(sizeof(struct _succ));
		succ->pesoArco = -1;
		succ->id = -i;	// PER ORA METTO -i POI METTO IL VALORE RANDOM
		//printf("\t\tpeso #%d id #%d\n",succ->pesoArco,succ->id);
		succ->next = NULL;
		if(retval == NULL)	// PRIMO NODO
			retval = succ;
		else
			aux->next = succ;
		aux = succ;
	}
	return retval;
}
void * costruisciItem(int maxitem) {
  int i=0;
  struct _item **item;
  item = malloc(sizeof(struct _item *) * maxitem);
  printf("size of 'item' is %d\n", sizeof(struct _item *) * maxitem);
//PER VEDERE QUANTO "OCCUPA"
  for(i=0; i < maxitem; i++) {
		item[i] = malloc(sizeof(struct _item));
  }
  return item;
}
int checkEsistenti(int nodo,int numero) {
	struct _succ *s = NULL;
	//int conta = 0;
	int risultato = 0;
	for(s = itemArray[nodo]->primoSucc; s != NULL; s = s->next) {
		if(s->id == numero) {
				risultato = 1;
				break;
		}
		if(s->id < 0) break;
	}
	return risultato;
}
// Copia il Grafo !!!!!QUESTA E' LA FUNZIONE CHE POI RICHIAMO E MI DA
PROBLEMI!!!!!
struct _item *  CopiaGrafo(struct _item *lista, struct _item
**digcomunic){
    int i;
    struct _succ * s;
    int MAXITEM = 10;
  for(i = 0;i < MAXITEM; i++){
          digcomunic[i]->pesoNodo = itemArray[i]->pesoNodo;
          digcomunic[i]->numSucc = itemArray[i]->numSucc;
          for (s = itemArray[i]->primoSucc; s != NULL; s = s->next){
                  digcomunic[i]->primoSucc->pesoArco = s->pesoArco;
                  digcomunic[i]->primoSucc->id = s->id;
              }
  }
  return * digcomunic;
}
int
main (int argc, char *argv[])
{
  int i=0,x=0;
  struct _item * copia;
  struct _succ *s = NULL;
  //struct _item itemArray[MAXITEM];
  //struct _item **itemArray = NULL;;
  // accetta il numeri di nodi
  printf("digita il numero massimo di nodi ");
  scanf("%d",&MAXITEM);
  if(MAXITEM <= 0)
     return -1;
  itemArray = (struct _item **) costruisciItem(MAXITEM);
  // costruisci il grafo
  srand((unsigned)time(NULL));
  for(i=0; i < MAXITEM; i++) {
     itemArray[i]->pesoNodo = -1;
	// genera il numero massimo di adiacenti
	  itemArray[i]->numSucc = rand() % MAXITEM;
	  itemArray[i]->primoSucc = NULL;
     printf("Si costruisce il nodo #%d con #%d adiacenti\n",
							i,itemArray[i]->numSucc);
	  itemArray[i]->primoSucc =
construisciSuccessori(itemArray[i]->numSucc);
  }
  // genera il peso del nodo
  srand((unsigned)time(NULL));
  for(i=0; i < MAXITEM; i++) {
     itemArray[i]->pesoNodo = rand() % MAXPESO;
  }
	srand((unsigned)time(NULL));
	for(i=0; i < MAXITEM; i++) {
		for(s = itemArray[i]->primoSucc; s != NULL; s = s->next) {
		// genera il numero del nodo: ID
			while(1) {
				x = rand() % (itemArray[i]->numSucc + 1);
				if(x != i && checkEsistenti(i,x) == 0) {
					s->id = x;
					break;
				}
			}
		}
	}
  // visualizza il grafo
	srand((unsigned)time(NULL));
	for(i=0; i < MAXITEM; i++) {
	printf("risultato per il nodo #%d con peso nodo [%d] con #%d
adiacenti\n",
						 	i,itemArray[i]->pesoNodo,itemArray[i]->numSucc);
		for(s = itemArray[i]->primoSucc; s != NULL; s = s->next) {
		// genera il numero dell'arco
			s->pesoArco = rand() % MAXPESO;
			printf("\tpeso arco #%d id %d\n",s->pesoArco,s->id);
		}
	}
	// !!!!!E' QUESTA LA CHIAMATA CHE MI DA PROBLEMI!!!!!
  *copia=CopiaGrafo(*itemArray,**copia);
  system("PAUSE");
  return 0;
}



gllfnc wrote:
 > 1.  itemArray = (struct _item **) costruisciItem(MAXITEM);
 >
 >
 > 2. struct _item *  CopiaGrafo(struct _item *lista, struct _item **digcomunic)
 >
 > 3. struct _item * copia;
 >
 > 4. // !!!!!E' QUESTA LA CHIAMATA CHE MI DA PROBLEMI!!!!!
 >    *copia=CopiaGrafo(*itemArray,**copia);
Date le LoC sopra menzionate, prova a riscrivere la linea che io ho numerato 
come 4, in questa maniera..
	copia = CopiaGrafo(*itemArray, &copia);
Dati i prototipi e le dichiarazioni fatte, se non mi sono confuso pure io, 
questa č la chiamata corretta. Poi, magari, succederanno casini dentro la 
funzione dopo questa modifica.
Se vuoi un consiglio, crea una funzione printerr che non fa altro che emulare 
una printf, condizionata da una variabile *bool* isDebugActive. Una volta 
fatta, usala piů spesso possibile per fare debug degli indirizzi dei 
puntatori, dei valori attuali e di quelli che ti aspetteresti.
La usi prima di fare la chiamata alle funzioni e appena entrato nella 
funzione. Poi, basta che giri il flag isDebugActive, e puoi 
abilitare/disabilitare queste stampe in un secondo.
Magari creala in un file sorgente separato, cosě la puoi riutilizzare per 
altri progetti.
Byez

Se posti 200 righe di codice dicendo solo "questa e' la funzione che da
problemi" troverai pochi, o nessuno, che avranno voglia di mettersi li a
debuggare il tuo codice.
Posta solo la funzione incriminata ed indica che tipo di problema di da:
 - crasha sempre
 - crasha ogini tanto
 - non compila
 - etc..
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 
E soprattutto cosa dicono compilatore e linker.
-- 
Devaraja (Xdevaraja87^gmail^c0mX)
Linux Registerd User #338167
http://counter.li.org