Newsgroup: it.comp.lang.c
Titolo: Aiuto x problema che non mi so spiegare

Sto provando a fare un programma riesco a capire il motivo per il quale non 
funziona.
Il compilatore non mi restiruisce errori ma 3 warning che non mi so 
spiegare.
posto il codice cosi magari ci date uno sguardo:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 500
typedef struct {
 char nome[30];
 char cognome[30];
 char tel[20];
 int eta;
}CONTATTO;
int visualizza(FILE *f); //prototipo di funzione
void main()
{
 FILE *f;
 char nome[30];
 char tel[30];
 CONTATTO vett[DIM];
 int n=0,i;
 visualizza(f,&n); //invocazione della funzione
 //ricerca
 printf("inserire il nome da ricercare: ");scanf("%s",nome);
 printf("inserire il nuovo numero: ");scanf("%s",tel);
 f=fopen("c:\\rubrica.rub","rb");
 if (f==NULL)
 {
  perror("Errore");exit(1);
 }
 fread(vett,sizeof(CONTATTO),n,f);
 for (i=0;i<n;i++)
 {
  if (strcmp(vett[i].nome,nome))
  {
   strcpy(vett[i].tel,tel);
  }
 }
 fclose(f);
 //scrittura
 f=fopen("c:\\rubrica.rub","wb");
 fwrite(vett,sizeof(CONTATTO),i,f);
 visualizza(f,&n);
 fclose(f);
}
//funzione
int visualizza(FILE *f, int *n)
{
 CONTATTO e;
 f=fopen("c:\\rubrica.rub","rb");
 if (f==NULL)
 {
  perror("Errore");exit(1);
 }
 while(fread(&e,sizeof(CONTATTO),1,f)>0
 {
     (*n)++;
      printf("%s %s %s %d\n",e.nome,e.cognome,
e.tel
,e.eta);
 }
 fclose(f);
 return *n;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
I warning sono i seguenti:
--------------------Configuration: R2 - Win32 Debug--------------------
Compiling...
R2.c
C:\Programmi\Microsoft Visual Studio\MyProjects\R2\R2.c(22) : warning C4020: 
'visualizza' : too many actual parameters
C:\Programmi\Microsoft Visual Studio\MyProjects\R2\R2.c(44) : warning C4020: 
'visualizza' : too many actual parameters
C:\Programmi\Microsoft Visual Studio\MyProjects\R2\R2.c(50) : warning C4029: 
declared formal parameter list different from definition
C:\Programmi\Microsoft Visual Studio\MyProjects\R2\R2.c(22) : warning C4700: 
local variable 'f' used without having been initialized
Linking...
R2.exe - 0 error(s), 4 warning(s)
Quando faccio girare il programma al momento dell'inserimento del nuovo 
numero di telefono mi da la comunicazione "Press any key to continue"
Ho provato per diverse ore a capire il problema ma non me lo so spiegare.
Ringrazio per l'attenzione

visualizza ) senza essere stata inizializzata.
Forse sto per porre una domanda stupida: come faccio per inizializzarla !?
Ora mi rimane solo questo warning:
--------------------Configuration: R2 - Win32 Debug--------------------
Compiling...
R2.c
C:\Programmi\Microsoft Visual Studio\MyProjects\R2\R2.c(22) : warning C4700: 
local variable 'f' used without having been initialized
Linking...
R2.exe - 0 error(s), 1 warning(s) 

 
assegnandogli un valore :-)
magari ottenuto come risultato di una chiamata di funzione ( di libreria 
)  che ritorni un FILE *


 Forse sto per porre una domanda stupida: come faccio per inizializzarla !?
void main()
{
 FILE *f;
 char nome[30];
 char tel[30];
 CONTATTO vett[DIM];
 int n=0,i;
 visualizza(f,&n); //invocazione della funzione
 //ricerca
 printf("inserire il nome da ricercare: ");scanf("%s",nome);
 printf("inserire il nuovo numero: ");scanf("%s",tel);
 f=fopen("c:\\rubrica.rub","rb");
 ...
}
tu usi f prima di averla inizializzata.
la usi nell'invocazione di visualizza(), ma ci scrivi dentro qualcosa
per la prima volta solo 3 righe sotto.
Cmq ho c&p il codice del tuo primo post, e non funziona (a parte
l'errore del prototipo di visualizza()). c'e' un altro errore:
while(fread(&e,sizeof(CONTATTO),1,f)>0
manca una parentesi. l'hai dimenticata copiando il codice nel post, o
manca proprio? Ma che compilatore stai usando?
Ciao Jack

 void main()
Tanto che ci siamo, sarebbe bene usare "int main()" e non "void main()".
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 Tanto che ci siamo, sarebbe bene usare "int main()" e non "void main()".
Non volevo girare il coltello nella piaga :)
Ciao Jack

 compilatore stai usando?
L'avevo dimenticata.. Uso il Visual Studio 6.0 che mi ha fornito 
l'università per esercitarmi..
Grazie a tutti.

 utilizza "f"? Ora provo..
O apri il file prima e usi il valore di 'f' nella funzione, oppure togli 'f'
dagli argogmenti di 'visualizza' e la dichiari come variabile locale.
Max

Bene ho modificato il codice in modo tale da inizializzare f:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define DIM 500
typedef struct {
 char nome[30];
 char cognome[30];
 char tel[20];
 int eta;
}CONTATTO;
int visualizza(FILE *f, int *n); //prototipo di funzione
void main()
{
 FILE *f;
 char nome[30];
 char tel[30];
 CONTATTO vett[DIM];
 int n=0,i;
 f=fopen("c:\\rubrica.rub","rb");
 if (f==NULL)
 {
  perror("Errore");exit(1);
 }
 visualizza(f,&n); //invocazione della funzione
 //ricerca
 printf("inserire il nome da ricercare: ");scanf("%s",nome);
 printf("inserire il nuovo numero: ");scanf("%s",tel);
 fread(vett,sizeof(CONTATTO),n,f);//conoscendo gia il numero di elementi si 
puo leggere senza ciclo
 for (i=0;i<n;i++)
 {
  if (strcmp(vett[i].nome,nome))
  {
   strcpy(vett[i].tel,tel);
  }
 }
 fclose(f);
 //scrittura
 f=fopen("c:\\rubrica.rub","wb");
 fwrite(vett,sizeof(CONTATTO),i,f);//conoscendo gia il numero di elementi si 
puo leggere senza ciclo
 visualizza(f,&n);
 fclose(f);
}
int visualizza(FILE *f, int *n)
{
 CONTATTO e;
 f=fopen("c:\\rubrica.rub","rb");
 if (f==NULL)
 {
  perror("Errore");exit(1);
 }
 while(fread(&e,sizeof(CONTATTO),1,f)>0)
 { (*n)++;
  printf("%s %s %s %d\n",e.nome,e.cognome,
e.tel
,e.eta);
 }
 fclose(f);
 return *n;
}
In pratica ho aperto il file subito dopo aver dichiarato f, e prima di aver 
dichiarato la funzione.
Ora ho 0 errori  e 0 warnings...
Il problema inziale mi rimane!!!!
In pratica quando mi chiede di inserire il nuovo numero non me lo fa 
inserire e mi dice direttamente "press any key to continue". Si insomma mi 
butta fuori dal programma.
Non saprei! 

 Perchč preferisci int?  A scuola mi hanno insegnato a mettere void... boh!
Non č questione di preferenze, č cosě che prevede lo standard del
linguaggio e a scuola ti hanno insegnato una cosa sbagliata.


linguaggio e a scuola ti hanno insegnato una cosa >sbagliata.
Capito.. inizierň ad addotare questo metodo allora..( ovviamente all'esame 
gli metto void se no mi sega! :-)  )
Cmq il mio problema purtroppo permane.. non so proprio che fare.. ho provato 
anche con il debug ma zero risultati.. 

 gli metto void se no mi sega! :-)  )
no.
metti int anche all'esame.
Ci sono solo 2 forme giuste del main:
int main(void)
int main(int argc, char *argv[])
il resto e' formalmente sbagliato, anche se a volte i compilatore
danno solo un warning.
Chiaramente alla fine del main devi mettere un return (normalmente un
return 0).
E' nello standard del linguaggio perche' normalmente i programmi *nix
quando terminano ritornano un valore (0 se e' andato tutto bene, o !=0
se c'e' stato un errore), in modo che se il programma e' stato
chiamato da uno script si possa gestire l'errore.
Ciao Jack

 Non saprei!
allora: insieme a perror() usa printf(), perche' perror non
necessariamente scrive sullo stesso device di printf(). Cosi magari
vedi se ci sono errori.
Poi: cosa succede se fopen() non trova il file che devi aprire?
Quando apri il file per scriverci sopra cosa succede se hai dentro
gia' dei dati?
Io comincierei a fare l programma scrivendo e leggendo da file in
modalita' testo, non binaria, cosi vedi se la lettura/scrittura
funziona come dovrebbe.
Per ultimo: il tuo programma e' pensato malissimo (lo so che stai
ancora imparando), specialmente la parte che riguarda la lettura del
file. Tu apri il file e lo leggi tutto una volta in visualizza()
usando una variabile globale per ricordarti quanti record ci sono (poi
chiudi il file), poi nel main usi n per rileggere il file e mettere in
un vettore i record.
Tutto cio' e' malissimo. Se ci pensi un po' sono sicuro che riesci a
trovare una soluzione molto migliore. Ricordati che l'accesso ad un
file e' lentissimo, finche' hai 10 record non te ne accorgi, ma se ne
hai 1 milione...quindi meno accessi fai ad un file meglio e'.
Ciao Jack

trovare una soluzione molto migliore.
Grazie mille per le dritte, ci smanetto su un paio di giorni e poi ci 
risentiamo!
Grazie ancora! 

 danno solo un warning.
Non è esatto. Lo standard ammette i due prototipi che hai indicato
oppure *qualsiasi* altro prototipo implementation defined.
Questo vuol dire che se una certa implementazione ammette (e.g.)
int main(int argc, char **argv, char **envp)
un programma che ne facesse uso sarebbe comunque conforme allo standard
C99. Il programma non sarebbe però "strictly conforming", perché un
requisito fondamentale è che non vengano usate caratteristiche
implementation defined.
Questo non toglie che dove possibile è bene usare i due prototipi
canonici.
Luca
-- 
"La Via prosegue senza fine."
	Bilbo Baggins - Il Signore degli Anelli - J.R.R. Tolkien

return 0).
Non è strettamente necessario.