Non capisco il problema mi dice che non ho inizializzato il void?

di Anonimizzato24167 il
32 risposte
Lo scopo del mio programma è caricare da file dei nomi di professori e dei numeri vedere se è ordinato se non lo è ordinarlo ed eliminare i nomi uguali

Questo è il mio txt:

rossi
3321
di lorenzo
3345
ferrante
2134
di lorenzo
3345

Questo è il mio main :
#include "alfabetico.h"

int main(){
	
	Stringa nome_file;
	fstream file;
	Docenti dati;	
	int dim;
	
	
	carica_file(nome_file, file, dati, &dim);
	stampa_file(dati, dim);
	controllo_ordine(dati, dim);

}
Queste sono le mie funzioni :
 #include "alfabetico.h"

void carica_file(Stringa nome, fstream &f, Docenti professore, int *d){
	
	int i=0;
	
	cout<<"\n Inserisci nome del file che vuoi caricare :";
	cin.getline(nome,STR_MAX-1, '\n');
	f.open(nome, ios::in);
	if(!f){
		
		cout<<"\n Errore durante l'inserimento del nome del file...";
		exit(1);
		
	}else{
		
		while(!f.eof()){
			
			f>>professore[i].Cognome;
			f>>professore[i].Numero;
			i++;
		}
		i--;
	}

	*d=i;	
	f.close();
}

void stampa_file( Docenti insegnanti, int dimensione){
	
	cout<<"\n Stampo il file :\n";
	for(int i=0; i<dimensione; i++){
		
		cout<<insegnanti[i].Cognome<<endl;
		cout<<insegnanti[i].Numero<<endl;
		
	}
	
}

void controllo_ordine( Docenti professori, int size){
	
	Professore scambio;
	int risult, cont;

	
	for(int i=0; i<size; i++){
		
		for(int j=i+1; j<size; j++){

			risult=strcmp(professori[i].Cognome, professori[j].Cognome);
			
				if(risult>0){
				
				scambio=professori[i];
				professori[i]=professori[j];
				professori[j]=scambio;
				
					}else{
		
				cont++;
				risult=cont;
		
			}
		}
			
	}
	
	if(risult==size){
		
		cout<<"\n L'elenco è già ordinato alfabeticamente \n";
		
	}
	
	stampa_file(professori, size);
	cout<<"\n Controllo se ci sono elementi uguali: \n";
	elimina_uguali(professori, size);
	stampa_file(professori, size);
	
}

void elimina_uguali(Docenti prof, int s){
	
Pnodo L1;
int ris;
	
for(int i=0; i<s; i++){
		
	for(int j=i+1; i<s; j++){
	
		ris=strcmp(prof[i].Cognome, prof[j].Cognome);
		
			if(ris==0){
			
				cancella_nodo(prof[j].Cognome,Pnodo &L1);
							
			}
					
		}
				
	}	
			
}
		
void cancella_nodo(Stringa cognome, Pnodo &n1){

Pnodo Temp;
		
	if(n1!=NULL){

		if(n1->Cognome==prof[j].Cognome){
								
			Temp=n1;
			n1=n1->next;
			delete Temp;
			}else {
			
				cancella_nodo(Stringa cognome, Pnodo &n);
			
			}
		}
} 
Questa è la mia libreria :
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>

using namespace std;

#define STR_MAX 100
#define VET_MAX 100

typedef char Stringa [STR_MAX];

typedef struct Lista{
	
	Stringa Cognome;
	int Numero;
	Lista *next;
	
}Professore;

typedef Lista* Pnodo;
typedef Professore Docenti [VET_MAX];

void carica_file(Stringa, fstream &f, Docenti , int *);
void stampa_file( Docenti, int);
void controllo_ordine(Docenti, int);
void confronto(Stringa , Stringa , int *);
void scambio(Docenti, int);
void elimina_uguali(Docenti, int);
void cancella_nodo(Stringa , Pnodo &)

32 Risposte

  • Nell'ultima riga del file alfabetico.h manca il ;
  • oregon ha scritto:


    Nell'ultima riga del file alfabetico.h manca il ;
    Grazie ora però a quanto pare non era l'unico errore chissà che ho combinato in queste funzioni mi puoi dare un mano?Se puoi?

    Ho cambiato nel mio ccp delle funzioni così le funzioni elimina uguali e cancella nodo
    void elimina_uguali(Docenti prof, int s){
    	
    Pnodo L1;
    int ris;
    	
    for(int i=0; i<s; i++){
    		
    	for(int j=i+1; i<s; j++){
    	
    		ris=strcmp(prof[i].Cognome, prof[j].Cognome);
    		
    			if(ris==0){
    			
    				cancella_nodo(prof[j].Cognome,&j, Pnodo L1);
    							
    			}
    					
    		}
    				
    	}	
    			
    }
    		
    void cancella_nodo(Docenti insegnante,int *j, Pnodo &n1){
    
    
    Pnodo Temp;
    		
    	if(n1!=NULL){
    
    		if(n1->Cognome==insegnante[j].Cognome){
    								
    			Temp=n1;
    			n1=n1->next;
    			delete Temp;
    			}else {
    			
    				cancella_nodo(Docenti insegnante,int &j, Pnodo &n1);
    			
    			}
    		}
    }

    E così è la mia libreria
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <cstring>
    
    using namespace std;
    
    #define STR_MAX 100
    #define VET_MAX 100
    
    typedef char Stringa [STR_MAX];
    
    typedef struct Lista{
    	
    	Stringa Cognome;
    	int Numero;
    	Lista *next;
    	
    }Professore;
    
    typedef Lista* Pnodo;
    typedef Professore Docenti [VET_MAX];
    
    void carica_file(Stringa, fstream &f, Docenti , int *);
    void stampa_file( Docenti, int);
    void controllo_ordine(Docenti, int);
    void confronto(Stringa , Stringa , int *);
    void scambio(Docenti, int);
    void elimina_uguali(Docenti, int);
    void cancella_nodo(Docenti ,int *, Pnodo &);

  • Comincia dal primo errore , identifica la linea dal numero, leggi l'errore ...
  • oregon ha scritto:


    Comincia dal primo errore , identifica la linea dal numero, leggi l'errore ...
    Risolto alcuni ma qua non capisco soprattutto quando mi chiamo la funzione cancella.

    funzioni
    void elimina_uguali(Docenti prof, int s){
    	
    Pnodo L1;
    int ris;
    	
    for(int i=0; i<s; i++){
    		
    	for(int j=i+1; i<s; j++){
    	
    		ris=strcmp(prof[i].Cognome, prof[j].Cognome);
    		
    			if(ris==0){
    			
    				cancella_nodo(prof[j].Cognome,j, L1);
    							
    			}
    					
    		}
    				
    	}	
    			
    }
    		
    void cancella_nodo(Docenti insegnante,int j, Pnodo &n1){
    
    
    Pnodo Temp;
    		
    	if(n1!=NULL){
    
    		if(n1->Cognome==insegnante[j].Cognome){
    								
    			Temp=n1;
    			n1=n1->next;
    			delete Temp;
    			}else {
    			
    				cancella_nodo(insegnante, j, n1);
    			
    			}
    		}
    }
    Libreria
    #include <iostream>
    #include <fstream>
    #include <cstdlib>
    #include <cstring>
    
    using namespace std;
    
    #define STR_MAX 100
    #define VET_MAX 100
    
    typedef char Stringa [STR_MAX];
    
    typedef struct Lista{
    	
    	Stringa Cognome;
    	int Numero;
    	Lista *next;
    	
    }Professore;
    
    typedef Lista* Pnodo;
    typedef Professore Docenti [VET_MAX];
    
    void carica_file(Stringa, fstream &f, Docenti , int *);
    void stampa_file( Docenti, int);
    void controllo_ordine(Docenti, int);
    void confronto(Stringa , Stringa , int *);
    void scambio(Docenti, int);
    void elimina_uguali(Docenti, int);
    void cancella_nodo(Docenti ,int , Pnodo &);

  • Cosa non capisci? Ti dice che non può convertire un char* in un Professore* quando chiami la funzione cancella_nodo nel file alfabeto.cpp come primo parametro. Quindi cosa fai?
    Vai a vedere la riga corrispondente e scopri che chiami cancella_nodo() passandole come primo parametro "prof[j].Cognome" che guarda un po' è un campo stringa. Quindi cosa fai?
    Ora sta a te...
  • jfet ha scritto:


    Cosa non capisci? Ti dice che non può convertire un char* in un Professore* quando chiami la funzione cancella_nodo nel file alfabeto.cpp come primo parametro. Quindi cosa fai?
    Vai a vedere la riga corrispondente e scopri che chiami cancella_nodo() passandole come primo parametro "prof[j].Cognome" che guarda un po' è un campo stringa. Quindi cosa fai?
    Ora sta a te...
    Scusa l'ignoranza sono agli inizi. Ma io quando gli lo avrei detto che doveva convertirmi, la stringa di un array di struct professore.Cognome, in una variabile char? E questo che non capisco.
    Comunque grazie per l'aiuto che mi state dando, fate bene a darmi questi indizi, e non darmi la pappa pronta così cerco di capire io il problema e risolvermelo.
  • Scusami se sono stato poco chiaro nella risposta di prima e non aver specificato questa mia incomprensione del errore
  • Di che tipo è Cognome? È quello che stai passando. É quello che accettava la funzione?
  • oregon ha scritto:


    Di che tipo è Cognome? È quello che stai passando. É quello che accettava la funzione?
    Cognome dovrebbe essere una stringa di char professore.Cognome contenuta dentro all'array di struct giusto? Ma io invece gli sto passando una variabile di tipo Docenti che è un typedef di struct, quindi dovrei passargli una variabile di tipo Stringa? Ma quindi poi come potrò eliminare il nodo all'interno della pila?
  • Sir.Croccodile ha scritto:


    Scusa l'ignoranza sono agli inizi ma io quando gli lo avrei detto che doveva convertirmi la stringa di un array di struct professore.Cognome in una variabile char? E questo che non capisco. Comunque grazie per l'aiuto che mi state dando fate bene a darmi questi indizi e non la pappa pronta così cerco di capire io il problema.


    Per favore, utilizza la dovuta punteggiatura e un italiano sufficientemente corretto. Grazie.
  • Io con le liste e l'utilizzo dei nodi sto un pò litigato mi consigliate qualche testo web per capirci un pò in più che dal mio libro non ci capisco niente?
  • Sir.Croccodile ha scritto:


    oregon ha scritto:


    Di che tipo è Cognome? È quello che stai passando. É quello che accettava la funzione?
    Cognome dovrebbe essere una stringa di char professore.Cognome contenuta dentro all'array di struct giusto? Ma io invece gli sto passando una variabile di tipo Docenti che è un typedef di struct, quindi dovrei passargli una variabile di tipo Stringa? Ma quindi poi come potrò eliminare il nodo all'interno della pila?


    Confusione. Questo succede quando inizi a scrivere C e salti i primi 5 capitoli del libro perché "tanto ho capito e lo so fare".
  • jfet ha scritto:


    Sir.Croccodile ha scritto:


    Scusa l'ignoranza sono agli inizi ma io quando gli lo avrei detto che doveva convertirmi la stringa di un array di struct professore.Cognome in una variabile char? E questo che non capisco. Comunque grazie per l'aiuto che mi state dando fate bene a darmi questi indizi e non la pappa pronta così cerco di capire io il problema.


    Per favore, utilizza la dovuta punteggiatura e un italiano sufficientemente corretto. Grazie.

    Corretto scusa
Devi accedere o registrarti per scrivere nel forum
32 risposte