Bug in switch annidato in ciclo for (principiante)

di il
5 risposte

Bug in switch annidato in ciclo for (principiante)

Salve a tutti,

ho notato uno strano errore in uno statement switch annidato in un ciclo for.

// ciclo che raddoppia le variabili scelte

#include <stdio.h>

int main(void)
{
	int product = -1, coffee = 0, tea = 0, cream = 0, sugar = 0;
	
	printf("Choice (1-4, 0 to exit):\n");
	
selection:
	for (;product != 0;)
	{
		scanf("%d", &product);
		switch (product) {
			case 1: ++coffee; 
					break;
			case 2: ++tea; 
					break;
			case 3: ++cream;
					break;
			case 4: ++sugar;
					break;
			case 0: break;
			default: printf("\nInvalid choice\n"); 
					 goto selection;
		}
		//printf("\n**Coffee=%dTea=%dSugar=%dCream=%d\n", coffee, tea, cream, sugar);
	}

	printf("\nCoffee=%d, Tea=%d, Sugar=%d, Cream=%d\n", coffee, tea, cream, sugar);
		
	return 0;
}
Nel ciclo switch si puó far incrementare delle variabili. Uscendo dal ciclo for, peró, tutte le variabili superiori a 0 risultano raddoppiate!! Come mai?

Ho notato, inoltre, che se aggiungo un qualsiasi statement al ciclo for, il programma funziona normalmente (vedi codice seguente):

// ciclo che funziona correttamente

#include <stdio.h>

int main(void)
{
	int product = -1, coffee = 0, tea = 0, cream = 0, sugar = 0;
	
	printf("Choice (1-4, 0 to exit):\n");
	
selection:
	for (;product != 0;)
	{
		scanf("%d", &product);
		switch (product) {
			case 1: ++coffee; 
					break;
			case 2: ++tea; 
					break;
			case 3: ++cream;
					break;
			case 4: ++sugar;
					break;
			case 0: break;
			default: printf("\nInvalid choice\n"); 
					 goto selection;
		}
		printf("\n**Coffee=%dTea=%dSugar=%dCream=%d\n", coffee, tea, cream, sugar);
	}

	printf("\nCoffee=%d, Tea=%d, Sugar=%d, Cream=%d\n", coffee, tea, cream, sugar);
		
	return 0;
}
Mi sto scervellando da un giorno su questo strano bug ma non riesco a venirne a capo (sono un principiante)

5 Risposte

  • Re: Bug in switch annidato in ciclo for (principiante)

    Non capisco di cosa parli. Ho eseguito il codice e funziona (anche se non userei il goto).

    Cosa inserisci? Cosa visualizzi?
  • Re: Bug in switch annidato in ciclo for (principiante)

    Grazie per la risposta, oregon. Ti posto l'output del codice che dá errore:
    
    Choice (1-4, 0 to exit):
    1
    2
    0
    
    Coffee=2, Tea=2, Sugar=0, Cream=0
    
    Come puoi vedere scelgo una volta "coffee" e una volta "tea" ma, uscito dal ciclo, entrambe le variabili hanno valore 2 (e non 1 come dovrebbe essere).

    Se a te funzionano entrambi i codici che ho postato, potrebbe essere un errore del mio compilatore?? Lo dico perché sto usando, per esercitarmi sul tablet, un compilatore android che si chiama "Mobile C" (sono in vacanza e fino a settembre non avró a disposizione un computer).

    P.S. Anche io avrei preferito evitare il goto ma proprio non sapevo come fare a evitarlo
  • Re: Bug in switch annidato in ciclo for (principiante)

    Probabile che sia un bug, posta il disassembly. Comunque è sconsigliato mescolare il goto al for.

    Commenta selection: e goto selection;

    E comunque quel for è un while
  • Re: Bug in switch annidato in ciclo for (principiante)

    Weierstrass ha scritto:


    Probabile che sia un bug, posta il disassembly. Comunque è sconsigliato mescolare il goto al for.

    Commenta selection: e goto selection;

    E comunque quel for è un while
    Non riesco a postare il disassembly (estensione del file errata) ma provando a compilare con un'altra applicazione ("Cxxdroid") il codice funziona.
    Con la prima applicazione anche commentando il goto l'errore persisteva.
    Sul while hai proprio ragione

    Grazie mille delle risposte
  • Re: Bug in switch annidato in ciclo for (principiante)

    Casomai qualcuno fosse interessato, vi confermo che l'applicazione android "Mobile C" (che pure costa ben 13 euro nella versione senza pubblicitá!) presenta sempre questo bug quando si usa l'operatore ++ in un qualsiasi ciclo.
Devi accedere o registrarti per scrivere nel forum
5 risposte