PDA

Visualizza la versione completa : [C] Funzione con risultato inaspettato


Guitar_joker87
30-11-2007, 14:03
Potete spiegarmi da cosa dipende questo fatto:
Durante l'esecuzione di un programma quando arriva ad eseguire una funzione il programma finisce senza dare spiegazioni, si chiude la finestra. L'ho provato debuggandolo e ho visto che proprio quando arriva alla riga in cui comincia la funzione si chiude anche il debug stesso. Da cosa può dipendere? Grazie.

pallinopinco
30-11-2007, 14:05
Da cosa può dipendere?


A Babbo Natale ho chiesto la sfera di cristallo proprio per rispondere a domande come la tua... Aspettando che arrivi puoi mostrarci il codice? :fagiano:

Guitar_joker87
30-11-2007, 14:22
Scusa. Siccome il codice è su più moduli e molto lunghi ho esitato a postare il codice. Volevo informarmi se dipende da qualcosa in particolare al di la dell'algoritmo della funzione. Comunque se proprio volete lo posto.

oregon
30-11-2007, 14:28
Mi sa che e' proprio quella chiamata che devi mostrare, non tutto il codice ... ovviamente dovrai anche dire quali sono i parametri che passi e di quale tipo ... e soprattutto, cosa ci fa la funzione con i parametri passati ...

Un algoritmo sbagliato semplicemente puo' fornire risultati sbagliati, non fa chiudere il programma senza motivo ... a quello ci pensano i "cattivi" puntatori ... :)

@pallinopinco ... se Babbo Natale ne ha 2 di sfere di cristallo, fammene arrivare una anche a me ... :zizi:

pallinopinco
30-11-2007, 14:45
Comunque se proprio volete lo posto.

Non è questione di volerlo o non volerlo, senza vedere cosa hai scritto dovremmo lanciarci in una serie di ipotesi più o meno plausibili. Per non perdere tempo e non far perdere tempo al prossimo è sempre opportuno formulare le domande nel modo più chiaro e completo possibile.

Posta la funzione incriminata ed il codice nel quale la richiami.



@pallinopinco ... se Babbo Natale ne ha 2 di sfere di cristallo, fammene arrivare una anche a me ...


Ti cedo volentieri una copia di Crystal Ball 2005 Express, quest'anno sono stato buono quindi mi aspetto la versione aggiornata! :D

Guitar_joker87
30-11-2007, 14:59
La funzione ritorna 0 o 1 (false o true). E non riceve niente in input.
è la funzione E()


boolean E(){
boolean allok;
allok=T();
while(allok && (sy==PLUS)||(sy==MINUS)){
insymbol();
allok=T();
}
return allok;
}

boolean statement (){
if (sy==IDENT){
insymbol();
if(sy==BECOMES){
insymbol();
if (E())
return TRUE;
}
}
}



La funzione viene chiamata in statement, sono stati definiti il tipo boolean e
symbol che può assumere vari valori in base a caratteri che incontra. Spero possa essere utile

MacApp
30-11-2007, 16:54
Dal codice che hai inviato è impossibile diagnosticare il tuo problema, anche se si intravede, con l'uso che fai della "sy", un probabile sconsiderato utilizzo di variabili globali.

Non riesci a mettere un breakpoint subito all'inizio della funzione incriminata "E"?
Che fanno le funzioni "insymbol" e "T"?

Guitar_joker87
03-12-2007, 13:42
cosa vuol dire uso sconsiderato?

Ho messo il breakpoint proprio all'inizio della funzione E() e succede proprio quello che detto prima cioè si blocca l'esecuzione senza motivo o comunque non mi viene comunicato.

La funzione insymbol assegna un valore a sy in base a caratteri incontrati in un file, mentre T serve per trovare se una serie di simboli è un termine di un espressione. (E sta per espressione e T sta per termine)....

quindi?

oregon
03-12-2007, 14:14
"Sconsiderato", penso, nel senso di eccessivo.

Dato che l'uso di variabili globali e' considerato sintomo di "cattiva programmazione" (per dei motivi su cui, per ora, e' inutile soffermarci) probabilmente averne usate parecchie e' da ritenersi molto dannoso.

Per venire al tuo problema specifico, come ti e' stato detto prima, devi mostrare la funzione T() e la insymbol(), perche' il problema e', molto probabilmente, in queste funzioni ...

Guitar_joker87
03-12-2007, 14:40
boolean T(){
boolean a2;
a2=F();
while (a2 && (sy=DIVSY)||(sy=MODSY)||(sy=TIMES)){
insymbol();
a2=F();
}
return a2;
}

boolean F(){
switch (sy){
case INTCON:
insymbol();
return TRUE;
break;
case IDENT :
insymbol();
return TRUE;
break;
case LPAR:
insymbol();
if (E()){
if(sy==RPAR)
insymbol();
return TRUE;
}
}
}


la insymbol non la metto perchè al suo interno contiene altre funzioni che contengono a loro volta altre funzioni, la lista sarebbe troppo lunga.Comunque dopo averla testata da sola funziona in tutti i modi: fa quello che deve fare senza problemi.

Loading