Errore di visibilità di un vettore

di il
4 risposte

Errore di visibilità di un vettore

Ciao, sto scrivendo un programma molto elementare in C, ma ho un problema che non riesco a risolvere di visibilità di un vettore multidimensionale. :
#include <stdio.h>
#define VEND 5 // asse orizzontale matrice SaleS
#define PROD 6 // asse verticale matrice SaleS


int SaleS [PROD][VEND] = {{0},{0}} ; // Matrice inizializzata a 0

void Calcolo ( int IdVend) ; // popola SaleS invocata da main
void Stampa (void) ; // stampa i risultati invocata da main
int Totali ( int x, int y ) ; // restituisce a Stampa i totali per prodotto e venditore


int main(void)
{
	
	int scelta ; // variabili di prompt
	


	// presentazione programma 
	
	printf ("****************************************************************************************************\n") ;
	printf ("*                                                                                                  *\n") ;
	printf ("*                                                                                                  *\n") ;
	printf ("*                                        Bisboccia Srl                                             *\n") ;
	printf ("*                                         Contabilità                                              *\n") ;
	printf ("*                                                                                                  *\n") ;
	printf ("*                                                                                                  *\n") ;
	printf ("*                                                                                                  *\n") ;
	printf ("****************************************************************************************************\n\n\n\n") ;
	
	printf ("Inserire l'ID del Venditore : (EOF to End)\n") ;
	
	while ( ( scelta = getchar() ) != EOF ) { // iterà il ciclo per la registrazione dei dati
		
		switch ( scelta ) {
			
			case '1' :
			case '2' :
			case '3' :
			case '4' :
				Calcolo (scelta) ; // richiama la funzione per il popolamento della matrice
				printf ("Inserire l'ID del Venditore: (EOF to End)\n");
				printf ("%d da calcolo\n", SaleS [1][1] ) ;
				break ;
				
			case '\t' :
			case '\n' :
 			case ' '  :
				break ;
				
			default:
				printf ("Valore non valido\n") ;
				printf ("Inserire l'ID del Venditore: (EOF to End)\n");
				break ;
			}
		

		}
		
		printf ("%d da main\n", SaleS [1][1] ) ; // stampa di controllo per la messa a punto
		
	Stampa () ; // stampa i risultati in formato tabulare
	
	printf ("Termine Programma\n");
	
	return 0 ;
	
} // fine funzione main
	
void Calcolo (IdVend) // inizio funzione popolamento matrice
{ 
	int IdProd ; // Identificativo prodotto
	int Venduto ; // venduto da prompt
			
		printf ("Inserire l'ID del Prodotto :\n") ;
		scanf ("%d", &IdProd ) ;
			
	printf ("Inserire il dato del Venduto : \n") ;
	scanf ("%d", &Venduto) ;
	
	SaleS [IdProd][IdVend] = SaleS [IdProd][IdVend] + Venduto ; // popola la matrice alle coordinate indicate
	printf ("%d\n", SaleS [IdProd][IdVend]) ; // stampa di controllo per la messa a punto
		
} // fine funzione Calcolo

void Stampa (void) { // inizio funzione Stampa risultati
	
	int count ; // contatore per il primo ciclo for
	int count2 ; // contatore per il secondo ciclo for
	int prod = (PROD - 1) ; 
	int vend = (VEND - 1) ;
	
	printf ("%d\n", SaleS [1][1] ) ;
			printf ("\t\t%c\t\t%c\t\t%c\t\t%c\t\tTot\n", '1' , '2' , '3' , '4'  ) ; //intestatione
	
			for ( count = 1 ; count <= prod ; count++) { //inizia il ciclo for per la stampa delle righe 
				
				printf ("%d\t\t", count) ; // intestazione riga
				
				for ( count2 = 1 ; count2 <= vend ; count2++ ) { // inizia il ciclo for per la stampa delle colonne
					
					printf("%d\t\t", SaleS[count][count2] ) ; // stampa risultato prodotto/venditore
				}
				
				printf ("%d\n" , Totali (count, vend) ); // stampa invocando Totali il totale per la riga(prodotto)
			}
			
			printf (" \t\t") ; //stampa un campo vuoto
			
			for (count = 1 ; count <= vend ; count++) { // ciclo for per la stampa dei totali per colonne (venditore) 
				
				printf ("%d\t\t", Totali (count, prod)) ;
				
			}
			
			printf ("\n") ; // manda a capo
			
} // fine funzione Stampa

int Totali ( x, y ) // inizio funzione calcolo dei totali invocati da stampa
{
	
	int Sum = 0 ;
	int count3 ; 
	
	for ( count3 = 0 ; count3 <= y ; count3++) { // inizio ciclo for calcolo totali da matrice
		
		Sum = SaleS [x][count3] + Sum ;
	}
	
	return Sum ; // restituisce sum
	
} // fine funzione Totali
l'output è quello seguente :
 omissis.... 

Inserire l'ID del Venditore : (EOF to End)
1
Inserire l'ID del Prodotto :
1
Inserire il dato del Venduto : 
1
1
Inserire l'ID del Venditore: (EOF to End)
0 da calcolo
1
Inserire l'ID del Prodotto :
1
Inserire il dato del Venduto : 
1
2
Inserire l'ID del Venditore: (EOF to End)
0 da calcolo
1
Inserire l'ID del Prodotto :
1
Inserire il dato del Venduto : 
1
3
Inserire l'ID del Venditore: (EOF to End)
0 da calcolo
1
Inserire l'ID del Prodotto :
1
Inserire il dato del Venduto : 
1
4
Inserire l'ID del Venditore: (EOF to End)
0 da calcolo
1
Inserire l'ID del Prodotto :
1
Inserire il dato del Venduto : 
1
5
Inserire l'ID del Venditore: (EOF to End)
0 da calcolo
0 da main
0
		1		2		3		4		Tot
1		0		0		0		0		0
2		0		0		0		0		0
3		0		0		0		0		0
4		0		0		0		0		0
5		0		0		0		0		0
 		0		0		0		0		
Termine Programma
come potete vedere il valore del vettore viene conservato all'interno della funzione calcolo, ma rimane a 0 sia in main che nelle altre funzioni.

Purtroppo nn riesco a capire dove stia l'errore, considerando che non è la prima volta che scrivo un programma che dichiara un vettore con visibilità su tutto il file.

qualcuno ha la pazienza di spiegarmi dove sbaglio?

Vi ringrazio

4 Risposte

  • Re: Errore di visibilità di un vettore

    La funzione Calcolo accetta un intero e tu passi un char (ovvero passi il valore ASCII della cifra).
    Dovrai correggere la chiamata con

    Calcolo(scelta-'0');
  • Re: Errore di visibilità di un vettore

    Ma sono proprio un pollo... ... ...

    mi hai anche chiarito come usare getchar passando però un intero che era ciò che nella realtà volevo fare.

    Piccolo chiarimento, ma se io uso invece di getchar un normale scanf EOF è possibile utilizzarlo cmq?

    Grazie cmq per la risposta.
  • Re: Errore di visibilità di un vettore

    Fossi in te eviterei di usare EOF nell'input perché il suo utilizzo da tastiera può variare e dipendere dal sistema impiegato.

    Puoi semplicemente chiedere di inserire 0 o -1 quando chiedi l'ID per terminare. In questo modo utilizzi tranquillamente una scanf e un intero.
  • Re: Errore di visibilità di un vettore

    Grazie
Devi accedere o registrarti per scrivere nel forum
4 risposte