PDA

Visualizza la versione completa : [C] liste di adiacenza e grafi


misterx
25-04-2008, 09:49
riuscite a capire perchè digitando in input 100 non mi si presentano problemi di memoria ?



#define MAX 50

struct nodo {
int info;
int w;
struct nodo *next;
};

//-----------------------------------------------------------------------------
/*
* Legge in input il grafo e lo rappresenta attraverso
* n liste di adiacenza.
*/

struct nodo *leggi_lista(void)
{
struct nodo *p, *primo=NULL;
for (int i=0; i<10; i++)
{
p = (nodo *)malloc(sizeof(struct nodo));
p->info=5;
p->w=2;
p->next = primo;
primo = p;
}

return(primo);
}
//-----------------------------------------------------------------------------
int leggi_grafo(struct nodo *G[]) {

int n;
printf("Numero di vertici: ");
scanf("%d", &n);
for (int i=0; i<n; i++) {
printf("Lista di adiacenza del vertice %d.\n", i);
G[i] = leggi_lista();
}
return(n);
}

//-----------------------------------------------------------------------------

int main(void)
{
int n;
struct nodo *G[MAX];

n = leggi_grafo(G);
}

mondobimbi
25-04-2008, 10:07
l'allocazione di memoria ed il suo uso corretto sono responsabilità del programmatore nel linguaggio C.


char *str = (char *)malloc(10);
str[15]='\0';

è formalmente corretto ed il compilatore lo compila correttamente.
Probabilmente 90 volte su cento non avrai neppure un errore a run-time.
Questo tipo di errori sono molto subdoli, non sai quando si possano presentare e sono quindi difficilissimi da individuare. Ti raccomando di inserire dei controlli stretti sugli input.

ciao
sergio

misterx
25-04-2008, 10:10
ciao

io mi aspettavo che chiamata la funzione leggi_grafo(...) e fornendo in input il valore 100, avessi problemi legati alla memoria.
Difatti viene allocato spazio per 50 strutture di tipo nodo, non capisco come mai ne "digerisca" 100.

oregon
25-04-2008, 10:19
Aggiungo che dipende "anche" dai compilatori e dal loro grado di "intelligenza" rispetto a questo tipo di operazioni ...

Ad esempio, con il Visual C++, avresti sicuramente delle segnalazioni di "corruzione dello stack" ...

misterx
25-04-2008, 10:42
mi sa che ci stiamo allontanando dal vero problema.
scrivendo: printf("%d\n",sizeof(G)); mi viene stampato 200 che dovrebbe essere i 50 elementi dichiarati in MAX per 4 byte per struttura.

Digitando alla richiesta:
printf("Numero di vertici: ");
200

alla 185 allocazione si ha segnalazione di errore ma non riesco a capirne il perchè :dhò:

mondobimbi
25-04-2008, 11:05
te lo abbiamo già spiegato, rileggiti le risposte e meditaci su un po'.
ciao
sergio

misterx
25-04-2008, 11:10
scusa ma come risposta non mi basta, c'è per forza una ragione dimostrabile, magari calcolando in un qualche modo :)

mondobimbi
25-04-2008, 11:30
ci sono linguaggi che non hanno questo tipo di problemi, tipo il C#.
In C tu sei liberissimo di scrivere nella memoria dove meglio credi (all'interno della spazio che il sistema operativo ti ha reso disponibile), il C presume che tu sappia cosa stai facendo.
Come ti dicevo l'unica cosa che puoi fare e inserire dei controlli, come possono essere degli assert.
ciao
sergio

oregon
25-04-2008, 22:24
Originariamente inviato da misterx
scusa ma come risposta non mi basta,

Piu' che altro non hai compreso la risposta ...


c'è per forza una ragione dimostrabile, magari calcolando in un qualche modo :)

Ma cosa vuoi calcorare? Ragione dimostrabile di cosa?

misterx
26-04-2008, 09:24
Originariamente inviato da oregon
Piu' che altro non hai compreso la risposta ...



Ma cosa vuoi calcorare? Ragione dimostrabile di cosa?

non ci siamo.
Se ad un esame univrsitario rispondi al dcente con la storia del compilatore ti manda a casa. Altro è dire che lo spazio sullo stack si è esaurito per la causa xyz e perchè il compilatore parcheggia le variabili statiche o dinamiche sullo stack o heap a quant'altro: vado a memoria perchè non mi ricordo molto di questi aspetti!

Siccome desideravo conoscere il reale motivo del comportamento di quello scorcio di programma e questo sono sicuro che è calcolabile e dimostrabile, vengo qui e chiedo. I controlli li so inserire anch'io, non è un problema questo, ma se si desidera imparare cos'è la programmazione non si deve tralasciare nulla, mai, altrimenti si finisce per sapere le cose solo pressapoco.

Senza offese mi raccomando, la mia citazione vuole solo dirti cosa desidero sapere: a me hanno insegnato ad andare sempre a fono alle questioni e così faccio, sempre e se non te la senti di andare a fondo per qualsiasi motivo, semplicemente non interventire :).

Ciao

Loading