Problemi con C++ lato linux

di Anonimizzato30950 il
20 risposte
Salve ragazzi,
sono giorni che non riesco a venire a capo di un problema che mi sta lasciando insonne.
devo consegnare un progetto per un esame universitario, ho fatto la stesura del progetto su visual studio e tutto funzionava egregiamente, all'ultimo minuto il prof ci ha detto che il programma deve girare su linux e fin qui nessun problema fino a quando, compilato il programma vedo qualcosa che non va: in pratica io ho un vector che viene letto da una funzione, ma quando esso entra in una nuova funzione esso mi risulta un vettore pieno ma di elementi nulli: come si può vedere dalla foto vi sono i 2 codici fiscali in un primo caso e successivamente nel check esso risulta nullo infatti mi stampa due volte "sto nel check" senza però stampare il contenuto del vettore

20 Risposte

  • Il professore avrebbe dovuto avvisarvi che il codice va scritto multipiattaforma, nei limiti del possibile.

    Non si vede niente. Comunque posta la parte di codice incriminato usando il pulsante < />
  • Ciao, alla fine smanettando un po sono riuscito a trovare l'errore, ti ringrazio per la risposta repentina a presto!
  • No ragazzi il problema persiste
    allego il codice:
    bool check_CF(vector<string>&CF,string CF1) {
    
    
    
        bool trovato ;
    
    		int trova=0;
    
    
    
        for (int i = 0; i < CF.size(); i++){
    
            if (CF1 == CF[i]) {
    	trovato=true;
    
                trova=1;
    
                
    
                }
    	}
    
            
    
       cout<<trova<<endl; 
    
        if(trova==0){
    
            trovato=false;
    
        }
    	
    	return trovato;
    
    }   

    non mi riesce a comparare le due stringhe non mi entra proprio nel if, su visual studio funzione tutto
  • Sicuro che nel vector ci sia qualcosa che possa soddisfare la condizione?
    Come lo riempi il vector?
  • Il vector viene riempito con una serie di codici fiscali prelevati da file di testo, stampadolo prima del il mi risulta che è riempito e che in CF1 c'è il codice fiscale che inserisco da testiera, però anche se coincidono non entra nella condizione, infatti ribadisco in visual tutto funziona correttamente.
  • Paziente inserire_pazienti(vector<string>&CF) {
    
        Paziente p1;
    
        		
    
            string nome,cognome,CF1;
    
            int eta;
    
            cout << "Dimmi un nome: ";
    
            cin >> nome;
    
            cout << "Dimmi un cognome: ";
    
            cin >> cognome;
    
            cout << "Dimmi Anno Nascita: ";
    
            cin >> eta;
    
            cout << "Dimmi CF: ";
    
            cin >> CF1;
    
    	
    
    			
    
            if((check_CF(CF,  CF1)) ) {
    
                    cout << "NOME REGISTRATO CON SUCCESSO" << endl;
    
                    p1 = Paziente(nome, cognome, CF1, eta);
    
    				return p1;
    
    
    
               }
    
    		
    
            else 
    
            {
    
    
    
                cout << "INSERIMENTO FALLITO" << endl;
    
                
    
    
    
            }
    
           
    
            
    
        
    
            
    
    }
    qui è dove la funzione viene richiamata
  • Potrebbe non cambiare niente, ma io proverei anche con
    
    if (CF1.compare(CF[i]) == 0) etc..
    
    del resto se funziona con VS deve funzionare anche con GCC (previ Bug del compilatore).
  • Per escludere bug legati alla lettura del file, prova ad inizializzare tu il vettore e vedi se funziona.
  • Posta tutta la catena di chiamate.

    Poi comunque cambia la prima funzione che non si può vedere
    
     for(...)
            if (CF1 == CF[i]) {
                cout << "trovato\n";
    	    return true;
    	    }
    return false;
    
  • Consiglio spassionato: acquisisci tutti (ma proprio tutti) gli input con getline per evitare problemi di buffer ed convertire eventuali interi con le apposite funzioni.
    Non saresti il primo ad avere casini con operator >> tra i vari sistemi e/o compilatori.
  • Ho provato è se inserisco io i valori nell' vector il tutto funziona
    vector<string> readfile(string filename) {
    
        fstream my_file;
    
        vector<string> CFs;
    
        my_file.open(filename, ios::in);
    
        if (!my_file) {
    
            cout << "FILE NON TROVATO ERRORE"<<endl;
    
    		
    
        }
    
        else {
    
            string tp;
    
            while (getline(my_file, tp)) { //read data from file object and put it into string.
    
                //cout << tp << "\n"; //print the data of the string
    
                CFs.push_back(tp);
    
            }
    
        }
    
        my_file.close();
    
    
    
    
    
        return CFs;
    
    }
    
    
    il file lo leggo in questo modo
    come potrei cambiare la prima funzione?
    scusate l'ignoranza!
  • Come come si fa, te l'ho scritto. Perché trova e trovato?

    Comunque prova a dichiarare come globale vector<string> CFs; senza stare a impazzire. Eventualmente lo pulisci con clear() se lo devi reinizializzare
  • do{
    
                                    string nomefile;
    
                                    cout << " Ora Inserisci il nome del file " << endl;
    
                                    cin >> nomefile;
    
                                    string estenzione = ".txt";
    
                                     CF = readfile(nomefile + estenzione);
    
    		}while(CF.size()==0);
    
    
    
    								
    
                                    do {
    
                                        cout << "*******************************" << endl;
    
                                        cout << "DIGITA R PER REGISTRARE PAZIENTE" << endl;
    
                                        cout << " DIGITA C PER CERCARE PAZIENTE" << endl;
    
                                        cout << "DIGITA D PER CANCELLARE UN PAZIENTE APPENA VACCINATO" << endl;
    
                                        cout << "DIGITA S STAMPARE CF PAZIENTI CHE DEVONO FARE IL VACCINO" << endl;
    
                                        cout << "DIGITA E PER TERMINARE" << endl;
    
                                        cout << "*******************************" << endl;
    
                                        cout << "INSERIRE OPERAZIONE" << endl;
    
                                        cin >> sceltap;
    
                                        switch (tolower(sceltap))
    
                                        {
    
                                        case 'r': {
    
                                            P.push_back(inserire_pazienti(CF));
    
    											
    					(...)
    												
    
    
    ovviamente poi continua ma il problema sostanziale è quello della comparazione
  • Ciao scusa weiestrass come potrei renderlo globale?
    scusami davvero!
Devi accedere o registrarti per scrivere nel forum
20 risposte