Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Problema con lo switch-case

    Inizio a capire qualcosina e chiedendo un po' anche ai tutori e al mio prof, ho provato a riprendere il programmino per il calcolo delle resistenze in base al colore che viene scritto nel programma.
    Ho utilizzato il costrutto switch-case e ho notato che al case non si può mettere una stringa di caratteri, ma solo un carattere o un numero (cosa abbastanza ovvia ora che ci penso)
    Compilando il programma, mi da degli warning per l'overflow sulle righe dove ho messo i colori. Ho un'idea di quale possa essere il problema.
    Inizialmente il codice era così
    codice:
    #include <stdio.h>
    #include <ctype.h>
    #include <math.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define COL 10
    
    void colore(){
    	int colore[COL] = {0};
    	int c;
    	int i;
    	
    	c = tolower(c);
    	switch(c){
    		case 'nero':
    			colore[0]++; break;
    		case 'marrone':
    			colore[1]++; break;
    		case 'rosso':
    			colore[2]++; break;
    		case 'arancio':
    			colore[3]++; break;
    		case 'giallo':
    			colore[4]++; break;
    		case 'verde':
    			colore[5]++; break;
    		case 'blu':
    			colore[6]++; break;
    		case 'viola':
    			colore[7]++; break;
    		case 'grigio':
    			colore[8]++; break;
    		case 'bianco':
    			colore[9]++; break;
    	}
    	
    	char col[COL] = {'NERO', 'MARRONE', 'ROSSO', 'ARANCIO', 'GIALLO', 'VERDE', 'BLU', 'VIOLA', 'GRIGIO', 'BIANCO'};
    	for (i = 0; i < COL; i++){
    		printf("%c -> %d\n", col[i], colore[i]);
    	}
    
    
    }
    
    
    int main(){
    	colore();
    	return 0;
    }
    poi l'ho corretto mettendoci i numeri nei case; anzichè il colore ho messo direttamente case 1, 2 ecc...Pensavo che nel case ci stesse cosa deve venir scritto sul programma, invece è solo un elenco.
    Mi resta il problema del char col[COL]. Mi da l'overflow perchè la lunghezza del vettore è di 10 e al compilatore non piace? Non capisco.
    Avevamo fatto un programmino simile all'uni ma lì mi funzionava xD

  2. #2
    Come hai detto, in C lo switch si può usare solo con tipi interi (e quindi ad esempio char e interi; l'idea è che possano essere compilati facilmente in una jump table); per questo motivo, non puoi fare uno switch su stringhe, e devi invece usare una serie di if e di strcmp.
    Quei 'nero' & co. tra apici singoli sono i cosiddetti "multicharacter literal", il cui valore è "implementation defined" e sono impiegati solo in casi particolari (e non per quello che vuoi fare tu).

    Per il resto, il programma è un po' un pasticcio, cosa stai cercando di fare esattamente?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Ah ecco ho capito. L'idea era di dare al programma i colori che ci sono sopra le resistenze, così che lui li converta nel rispettivo valore.

    L'avevo pensato anche io con gli if ma ne verrebbero molti e tutti uguali e il mio prof me l'ha sconsigliato perchè "farebbe schifo da vedere" XD

    Avevo fatto un programma con questo costrutto per contare quante vocali ci fossero in un testo.
    Ovviamente per ora stavo facendo in modo che, dato un colore mi dava il suo valore numerico. Infatti nel main manca la richiesta di inserimento del colore (generalmente uso la fgets che a quanto ho capito è meglio della scanf)

  4. #4
    Ti basta fare un array di const char *, con ciascun elemento che punta alla stringa (literal) del colore corrispondente all'indice:
    codice:
    const char * colori[]={"nero", "marrone", "rosso", "arancio", "giallo", "verde", "blu", "viola", "grigio", "bianco"};
    Quindi, una volta che hai acquisito la stringa dall'utente, fai una ricerca lineare nell'array (con un for e una strcmp), individui l'indice corrispondente e ottieni così il numero che corrisponde al colore.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Intendi per esempio così?
    codice:
    const char * colori[]={"nero", "marrone", "rosso", "arancio", "giallo", "verde", "blu", "viola", "grigio", "bianco"};
    	int i;
    	x = "rosso";
    
    	for (i=0, i<9, i++){
    		if (!strcmp(x, colori[]));
    		break;
    	}

  6. #6
    Sì, anche se il for dovrebbe essere:
    codice:
        for (i=0; i<10; i++)
    (e se fuori dal for i==10 significa che non è stata trovata alcuna corrispondenza)
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Ah si, giusto. L'avevo tenuto con i case da 0 a 9.

    Compilando mi vengono fuori questi errori sulla riga x = "rosso"; dopo averla dichiarata char x[10] e sul for

    resistenze.c:12:4: error: incompatible types when assigning to type ‘char[10]’ from type ‘char *’
    resistenze.c:14:13: error: incompatible types when assigning to type ‘const char *[10]’ from type ‘int’

  8. #8
    Non puoi assegnare le stringhe in quella maniera, se vuoi copiare una stringa in un array di char devi usare la strcpy. Comunque, mi pare che tu abbia un po' di confusione sull'uso delle stringhe, per questo ti rimando al relativo capitolo del tuo libro di C.
    Amaro C++, il gusto pieno dell'undefined behavior.

  9. #9
    Allora cerco in giro come usarlo perchè il mio libro mi dice cos'è nel capitolo dove spiega le librerie string.h

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.