Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2020
    Messaggi
    4

    [C++] Incompatibilità controllo input-switch

    Buongiorno a tutti,
    ho scritto questo codice di controllo input che, se testato a parte fa egregiamente il suo dovere per le finalità con cui è stato concepito:

    codice:
    #include <string>
    #include <typeinfo>  
    #include <iostream>
    
    
    int ReadStr (std::string ins){
      std::locale loc;
      bool numb=true;
       for(int i=0; i<ins.length(); i++){
         numb = numb && (isdigit(ins[i],loc));
       }
       if(numb == true){return 0;}
       if(ins.length() == 1){return 1;}
       return 2;
    }
    
    
    template <typename T>
    void Inserimento (T ins){
      int a, b;
      do{
      std::string str;
      std::cin.clear();
      std::getline(std::cin, str);
      if(typeid(ins) == typeid(int)){a = 0;}
      else if(typeid(ins) == typeid(char)){a = 1;}
      else {a = 2;}
      b = ReadStr(str);
      if (a != b){
        std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
      }
      }while (a != b);
    }
    Tuttavia, se lo collego al resto del programma, riscontro problemi:

    codice:
    do{
      std::cout<<"\n\n\u2022 Visualizza Catalogo (C)\n\u2022 Effettua un Ordine (O)\n\u2022 Visualizza il Carrello (B)\n\u2022 Rimuovi un prodotto dal carrello (R)\n\u2022 Termina e paga - Esci (Q)\n";
        std::cout<<"\nScelta selezionata: ";
        char c;
        Inserimento(c); // Leggo input utente
        switch(c) {  //Switch per i diversi casi
            case 'C' : //Catalogo
            case 'c' :
            Catalogo.print();
            break;
            case 'O' : // Ordine
            case 'o' :
                ordine(Catalogo, Carrello);
                break;
            case 'B' : //Carrello
            case 'b' :
                std::cout<<"\n";
                Carrello.print();
                break;
            case 'R' : //Rimovi
            case 'r' :
                std::cout<<"\n";
                remove(Catalogo,Carrello);
            break;
            case 'Q' : //quit
            case 'q' :
          std::cout<<"\n\nGrazie per aver scelto Grandi Magazzini PPP \nArrivederci al prossimo acquisto!\n\n";
            return;
            default : //In ogni altro caso
                std::cout<<"L'inserimento non è valido\n";
                while (std::cin.get() != '\n') // pulisco il cin
                {
                    continue;
            }
            //  menu(Catalogo, Carrello);
        }
        }while('c' == 'q' || 'Q');
      }
    Infatti, pur inserendo 'c' o le altre lettere disponibili nell'indice, questa non viene riconosciuta come tale e lo switch ricade sempre nel case "default".
    Dove risiede questa "incompatibilità"?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,347
    Scusa ma ins nella inserimento dove viene assegnata??
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2020
    Messaggi
    4
    La utilizzo solo per confrontare il suo type d'origine

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,347
    Eh no perché poi la utilizzi nello switch come variabile c e ovviamente la trovi con valori casuali, non quelli dell'input che non hai mai assegnato!
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2020
    Messaggi
    4
    Si, effettivamente ho notato a posteriori che il carattere immesso nello switch era vuoto.
    Così ho modificato la funzione Inserimento del controllo input in:

    codice:
    template <typename T>
    T Inserimento (T ins){
      int a, b;
      T output;
      std::string::size_type sz;
      do{
      std::string str;
      std::cin.clear();
      std::getline(std::cin, str);
      if(typeid(ins) == typeid(int)){
        a = 0;
        try{
          output=std::stoi(str,&sz);
        }catch(const std::invalid_argument& ia){}
      }else if(typeid(ins) == typeid(char)){
        a = 1;
        output = str[0];
      }
      else {
        a = 2;
        //output=str;
      } 
      b = ReadStr(str);
      if (a != b){
        std::cout << "Inserimento non valido, riprovare -> \tScelta selezionata:  ";
      } else {return output;}
      }while (a != b);
    con la modifica che nel resto del programma Inserimento viene così assegnato:

    codice:
    c=Inserimento(c)
    Così infatti è tutto più controllato e lo switch non riscontra impedimenti.

    Ho tuttavia un'altra difficoltà: se lancio il controllo input anche con la riga che ora è commentata in Inserimento (//output=str;), mi segnala errore in quanto riscontrerebbe difficoltà assegnare la stringa str alla variabile output nei casi in cui questa sia definita int o char.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2020
    Messaggi
    4
    Quote Originariamente inviata da fra.p Visualizza il messaggio
    mi segnala errore in quanto riscontrerebbe difficoltà assegnare la stringa str alla variabile output nei casi in cui questa sia definita int o char.
    Per chiarezza, la dicitura esatta che mi compare è questa:

    inputCheck.h: In instantiation of ‘T Inserimento(T) [with T = char]’:
    ordine.h:39:31: required from here
    inputCheck.h:47:10: error: cannot convert ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to ‘char’ in assignment
    output=str;
    ~~~~~~^~~~

    con analogo duplicato per tipo int

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,347
    ..
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2020
    Messaggi
    4
    Dunque la modifica più ragionevole da fare sarebbe, ad esempio, una sorta di "duplicazione" della variabile?

    codice:
    std::string nomein, nomeout;
    nomeout=Inserimento(nomein);
    In cui poi quella che verrà utilizzata nella parte successiva di programma sarà dunque nomeout

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 © 2020 vBulletin Solutions, Inc. All rights reserved.