PDA

View Full Version : Problema C AIUTO PLS


Pettinato
25-04-2002, 12:29
Ciao a tutti

ho riscontrato un problema durante la compilazione in questa parte di programma:

int verifica(int s,PUNT **H,int *w){
NODO *q,*z;
PUNT *c;
for (q=p;q!=NULL;q=q->next)
for (z=q;z->k!=s || z->down!=NULL;z=z->down)
if(z->k==s){
*w=1;
if(*H==NULL){
*H=(PUNT*)malloc(sizeof(PUNT));
*H->next=NULL; //riga 54
*H->p=q;}//riga 55
else{
c=(PUNT*)malloc(sizeof(PUNT));
c->p=q;
c->next=H;
*H=c;}
return 1;}
else
return 0;}


Il compilatore mi scrive così:
STALA.c: In function `verifica':
STALA.c:54: request for member `next' in something not a structure or union
STALA.c:55: request for member `p' in something not a structure or union


La mia struttura è questa:

typedef struct punt {
NODO *p;
struct punt *next;
}PUNT;


Sembra che non veda questa struttura che sta in un file .h che ovviamente ho specificato con #include "STALA.h"

Ciao a tutti e grazie

Pettinato
25-04-2002, 15:18
Ho risolto qualche problema ma il compilatore fa ancora capricci.

La funzione:
int verifica(int s,PUNT **H,int *w){
NODO *q,*z;
PUNT *c;
for (q=p;q!=NULL;q=q->next)
for (z=q;z->k!=s || z->down!=NULL;z=z->down)
if(z->k==s){
*w=1;
if(*H==NULL){
*H=(PUNT*)malloc(sizeof(PUNT));
*H->next=NULL;
*H->p=q;}
else{
c=(PUNT*)malloc(sizeof(PUNT));
c->p=q;
c->next=*H;
*H=c;}
return 1;}
else
return 0;}

Il compilatore dice:
gcc: P: No such file or directory
STALA.c: In function `verifica':
STALA.c:56: request for member `next' in something not a structure or union
STALA.c:57: request for member `p' in something not a structure or union


La struttura è sempre quella di prima non so che dire.

AIUTO!

CIAO e grazie

Pettinato
25-04-2002, 15:52
Ho risolto la storia del doppio puntatore.

Adesso mi dice solo:

gcc: Pr: No such file or directory

Dopo aver scritto :

gcc -o -Wall Pr P.c STALA1.c

AIUTO!!!

CIAO e grazie

MickMacello
25-04-2002, 16:07
devi specificare il nome del file eseguibile subito dopo l' opzione -o credo:

... -o Pr -Wall

Pettinato
25-04-2002, 16:39
Compilato!

ma adesso mi va in ciclo infinito ARGGG!!!

vi posto il codice della parte che secondo me crea questo problema:

void inserisci_stag(a,b,h){

int s,w,c,e;
w=0;

H=NULL;
for(c=a;c!=b-1;c++){
for(e=0;e!=h;e++){
s=(e*m)+c;
if(verifica(s,&w)==0 || w==0 || p==NULL){insert(s);}
else
{concatena(s);}}}

Provando con delle printf mi è sembrato di capire che il problema lo creano i 2 for.

AIUTOOOOOOO!!!!!!!!!!!!

Ciao e grazie

/\/\@®¢Ø
25-04-2002, 17:09
Originariamente inviato da Pettinato

[b]
for(c=a;c!=b-1;c++){

for(e=0;e!=h;e++){



Se l'errore e' qua puo' essere che non vadano bene i parametri che passi alla funzione. Se ad esempio a e' uguale a b, il ciclo non terminera' mai perche' c sara' sempre maggiore o uguale di a e quindi maggiore ( in particolare diverso ) da b.
Per vedere se il problema e'ì questo prova a cambiare i due for con delle disuguaglianze, ad esempio

for(c=a;c < b-1;c++){
for(e=0; e<h;e++){

Se il problema e' li' , il ciclo termina subito

Pettinato
25-04-2002, 17:41
GRANDE!!!MARCO

ho tolto il ciclo infinito!!!

ma adesso ho qualche problemino..................

vi terrò al corrente nei prossimi minuti =P


CIAO e grazie

Pettinato
25-04-2002, 19:41
adesso sono in fase di debugging e si forma ancora un ciclo infinito:
void inserisci_stat(a,b,h){

int s,w,c,e;
w=0;
H=NULL;
for (c=a;c<b-1;c++){
for (e=n;e<h;e--){
s=(e*m)+c;
if(verifica(s,&w)==0 || w==0 || p==NULL){insert(s);}
else
{concatena(s);}}}}

void insert(s){
NODO *z;
if(p==NULL)
{z=(NODO*)malloc(sizeof(NODO));printf("Insert...\n");
p=z;
p->k=s;
p->next=NULL;
p->down=NULL;}
else
{z=(NODO*)malloc(sizeof(NODO));
z->k=s;
z->next=p;
p=z;
z->down=NULL;}}


La funzione verifica è quella di prima.
Non mi entra neanche in concatena il problema sono i 2 for(credo).
Non ne ho idea!!

AIUTO!!!!!

GRAZIE A TUTTI

CIAO

/\/\@®¢Ø
26-04-2002, 12:03
Originariamente inviato da Pettinato
adesso sono in fase di debugging e si forma ancora un ciclo infinito:
<cut>
for (e=n;e<h;e--){
<cut>
La funzione verifica è quella di prima.
Non mi entra neanche in concatena il problema sono i 2 for(credo).
Non ne ho idea!!

AIUTO!!!!!

GRAZIE A TUTTI

CIAO
Il problema e' lo stesso di prima, solo a rovescio...
Se tu fai calare e e ti interessa continuare il ciclo finche' non raggiunge h, devi stare attento al primo passo ! Se n<h , allora facendo decrementare e, questo sara' sempre minore di h , e quindi non si fermera' mai !
Prova con
for (e=n;[b]e>h;e--){

ovvero cambia il < in >.
Cosi' se al primo passo "sfori" il controllo, almeno ti si ferma subito. L'importante e' che tu abbia capito perche' va messa la disuguaglianza !
Attento pero' . Come il for che ti ho sistemato nel post precedente, non e' detto che sia la soluzione appropriata ! Lo e' se il caso n<h e' un caso particolare in cui non occorre fare niente . Se invece non dovrebbe succedere, allora il problema e' a monte, quando passi i parametri alla funzione.
Spero di essere stato chiaro ( difficile conoscendomi :D ).