Newsgroup: it.comp.lang.c
Titolo: if-else

Ciao,
c'è qualcuno che può dirmi perchè con l'utilizzo di if- else il programma
non funziona a dovere??
Vi propongo una parte del programma, nel quale vorrei fare in modo di
visualizzare l'albero binario in modi diversi a seconda del numero di
cerchi, utilizzando il costrutto if-else.
Premetto che senza questa clausola il programma funziona perfettamente.
int Epoint  =1; int Eline   =2; int Epline  =3; int Etext   =4; int Ecircle
=5;
int cerchi(FILE *fp);           /* Conta i cerchi presenti nel file DXF */
int Entita(FILE*);       /* Valuta il tipo di oggetto presente nel file DXF
*/
struct nodo *alb_bin(FILE *);     /* Prende i dati dal file per la
costruzione dell'albero binario */
void anticipato(struct nodo *);  /* Visita le radici dell'albero binario e
le stampa a video */
void grafo(struct nodo *, int, int);    /* Visita le radici dell'albero
binario e le stampa a video */
main()
{
FILE *fp;
char file[30];
struct nodo *radice;
int i;
int k;
printf("\n\n\nInserire il nome del file DXF: ");
gets(file);
fp = fopen(file, "r");
if(fp == NULL) {
  printf("Il file %s non esiste.\n", file);
  exit(1);
}
Il problema dovrebbe essere qui:
assegno a k il valore ritornato dalla funzione cerchi e valuto se è <=10. Se
lo è visualizzo l'albero binario in un modo, altrimenti, se k>10, lo
visualizzo in un altro modo.
k=cerchi(fp);
if(k<=10) {
do{
   i= Entita(fp);    /* La funzione Entita ritorna -1 se e' a fine file*/
   if(i==Epoint){
      printf("\nNel file non ci sono cerchi\n");
      exit(2);}
   if(i==Epline){
      printf("\nNel file non ci sono cerchi\n");
      exit(3);}
   if(i==Ecircle){
      radice = alb_bin(fp);      /* Invoca la funzione alb_bin */
      clrscr();
      grafo(radice, 35, 1);}    /* Invoca la funzione grafo */
   if(i==Eline){
      printf("\nNel file non ci sono cerchi\n");
      exit(4);}
   if(i==Etext){
      printf("\nNel file non ci sono cerchi\n");
      exit(5);}
   }while(i!=-1);}
else{
do{
   i= Entita(fp);
   if(i==Epoint){
      printf("\nNel file non ci sono cerchi\n");
      exit(2);}
   if(i==Epline){
      printf("\nNel file non ci sono cerchi\n");
      exit(3);}
   if(i==Ecircle){
     radice = alb_bin(fp);
     printf("\nQuesto è l'albero binario ordinato secondo il criterio
dato:\n");
     anticipato(radice);}       /* Invoca la funzione anticipato */
   if(i==Eline){
      printf("\nNel file non ci sono cerchi\n");
      exit(4);}
   if(i==Etext){
      printf("\nNel file non ci sono cerchi\n");
      exit(5);}
   }while(i!=-1);}
fclose(fp);        /* Chiude il file */
return 0;
}
L'output del programma è un cursore lampeggiate, situato nella riga sotto la
richiesta del nome del file.
Secondo voi, ma perchè fa cosi' ?????
Grazie per l'aiuto, Ciao.
Stefano

sotto la richiesta del nome del file.
Questo mi porta a pensare che il problema non sia dovuto all'if-else
ma che il programma entri in un loop dal quale non riesce piu' ad
uscire.
Se vuoi mandare il listato completo (e anche un file d'esempio se
quello della volta scorsa non va bene) sai dove trovarmi.
ciao

Il codice, dal punto di vista sintattico, sembra corretto. Di sicuro e'
molto poco leggibile e molto poco mantenibile. Io l'avrei scritto come
riportato sotto, codice che ha la meta' delle righe del tuo e non ripete
istruzioni inutilmente (leggi printf("\nNel file non ci sono cerchi\n")
8 volte). A meno di non aver commesso errori marchiani il mio codice e'
equivalente al tuo.
Se il programma non e' molto complesso (e non e' troppo lungo) e mi
invii un
po' piu' di codice, potrei darci un'occhiata.
Ciao Angelo.
#include <stdio.h>
// perche' queste variabili sono globali? non era meglio
// mettere una enum in un file di include ??? (variabile
// globale, casino totale!).
// -----------------------------------------------------
   int Epoint  = 1;
   int Eline   = 2;
   int Epline  = 3;
   int Etext   = 4;
   int Ecircle = 5;
   typedef struct nodo Nodo;
   int cerchi(FILE* pFileP);     /* Conta i cerchi presenti nel file DXF
*/
   int Entita(FILE* pFileP);     /* Valuta il tipo di oggetto presente
nel file DXF */
   Nodo* alb_bin(FILE*);         /* Prende i dati dal file per la
                                    costruzione dell'albero binario */
   void anticipato(Nodo*);       /* Visita le radici dell'albero binario
e
                                    le stampa a video */
   void grafo(Nodo*, int, int);  /* Visita le radici dell'albero
                                    binario e le stampa a video */
int main(void) // Non serve ma e' sempre meglio fare le cose pulite
{
  FILE*  fileP         = NULL;;
  char   fileName[256] = {'\0'}; // Forse e' meglio aumentare la
dimensione del buffer
                                 // ed evitare di fare casino con i nomi
delle variabili
                                 // (fileName e' un nome piu'
appropriato per una
                                 // variabile che dovra' contenere un
nome di file).
  Nodo*  radiceP       = NULL; // posporre al nome di una variabile
puntatore una "P"
                               // e' utile ad evitare casini con altre
variabili: i
                               // puntatori generano casino sufficiente
da soli, perche'
                               // cercarne altro?
  int    i              = 0;
  int    k              = 0;
  printf("\n\n\nInserire il nome del file DXF: ");
  gets(file);
  fileP = fopen(file, "r");
  if(fileP == NULL) {
    printf("Il file %s non esiste.\n", fileName);
  exit(1);
// } <--- forse questa parentesi e' di troppo
  /*
Il problema dovrebbe essere qui:
assegno a k il valore ritornato dalla funzione cerchi e valuto se e'
<=10. Se
lo e' visualizzo l'albero binario in un modo, altrimenti, se k>10, lo
visualizzo in un altro modo.
  */
   k=cerchi(fileP);
   while{-1 != i)
   {
      switch(i)
      {
           case Ecircle : radice = alb_bin(fileP);  /* Invoca la
funzione alb_bin */
                          if(11 > k) // uguale a k <= 10
                          {
                             clrscr();
                             grafo(radice, 35, 1);  /* Invoca la
funzione grafo */
                          }
                          else
                          {
                             printf("\nQuesto e\' l'albero binario
ordinato secondo il criterio dato:\n");
                             anticipato(radice);       /* Invoca la
funzione anticipato */
                          }
                          break;
           case Epoint  :
           case Epline  :
           case Epoint  :
           case Etext   : printf("\nNel file non ci sono cerchi\n");
                          exit(i+1); // Non so se era voluto, ma il
valore di ritorno del
                                     // tuo codice era sempre pari a
i+1, e allora ...
                          break;     // Non serve ma male non fa.
           default      : break;
        }
       i = Entita(fileP);    /* La funzione Entita ritorna -1 se e' a
fine file*/
   }
fclose(fileP);        /* Chiude il file */
return 0;
}