Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - correzione void
Forum - C/C++ - correzione void

Avatar
espaoloema (Normal User)
Newbie


Messaggi: 11
Iscritto: 18/02/2010

Segnala al moderatore
Postato alle 18:25
Domenica, 21/02/2010
ragazzi eccomi con un altro progetto....
ho implementato quasi ttt, si tratta di una gestione di una biblioteca...ma non riesco a capire ke c è ke mi manda in crash la void prestito_con_titolo....
mi date una mano please?!?!?


Codice sorgente - presumibilmente C++

  1. typedef struct{
  2.         char titolo[256];
  3.         char autore[64];
  4.         int codice;
  5.         char inPrestito;
  6. } LIBRO;
  7.  
  8. int codice;
  9. int libriInseriti = 0;
  10. LIBRO libri[MAX_LIBRI];
  11.  
  12. void inserimento();
  13. void prestito_con_titolo(char*);
  14. void prestito_con_codice(int);
  15. void restituisci_libro(int);
  16. void contenuto();
  17.  
  18. /*main*/
  19.  
  20. void main() {
  21.         int scelta, codiceDaCercare, codiceDaRestituire;
  22.         char *titoloDaCercare = "";
  23.          char tit[100];
  24.         /* Codice di partenza per i libri */
  25.         codice = abs(rand());
  26.         printf("\n\n --- Biblioteca ---");
  27.  
  28.  
  29. case 2:
  30.                                 printf("\n\nInserire titolo del libro da     prestare\n");
  31.                                 fflush(stdin);
  32.                                 gets(tit);
  33.                                 titoloDaCercare=tit;
  34.                                 prestito_con_titolo(titoloDaCercare);;
  35.                         }
  36.  
  37. /* funzioni */
  38. void prestito_con_titolo(char *titolo) {
  39.         int pos,scelta, libroPresente=0;
  40.         char continua;
  41.  
  42.         for(pos=0;pos<libriInseriti;pos++) {
  43.                 if(strcmp(libri[pos].titolo,titolo)==0) {
  44.                         libroPresente = 1;
  45.                         if(libri[pos].inPrestito == 'f'){
  46.                                 printf("\n\nVuoi continuare con il prestito di questo libro?");
  47.                                 printf("\n\t1: Si.\n\t2: No.\n");
  48.                                 scanf("%d",&scelta);
  49.                                 switch(scelta){
  50.                                         case 1:
  51.                                                 libri[pos].inPrestito = 'v';
  52.                                                 printf("\nPrestito effettuato...");
  53.                                                 scanf("%c",&continua);
  54.                                         case 2: break;
  55.                                 }
  56.                         } else {
  57.                                 printf("\nSpiacenti libro gia' in prestito...");
  58.                                 scanf("%c",&continua);
  59.                         }
  60.                 }
  61.         }
  62.         if(libroPresente == 0) {
  63.                 printf("\n\nSpiacenti questo libro non e' presente in ");
  64.                 printf("questa biblioteca...");
  65.                 scanf("%c",&continua);
  66.         }
  67. }
  68. 


Ultima modifica effettuata da espaoloema il 21/02/2010 alle 20:26
PM Quote
Avatar
giuseppe93 (Ex-Member)
Pro


Messaggi: 166
Iscritto: 02/08/2009

Segnala al moderatore
Postato alle 19:11
Domenica, 21/02/2010
non puoi fare gets(titoloDaCercare); in quanto titoloDaCercare è un puntatore, quindi o dichiari titoloDaCercare come un array di char oppure dichiari un'altra variabile come array di char del tipo char nuovavariabile[100], fai gets(nuovavariabile) e titoloDaCercare=nuovavariabile;

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 19:25
Domenica, 21/02/2010
Ciao!

Ho letto il tuo programma e, ho notato che ti affidi a variabili globali.
Prova a riscriverlo usando variabili locali, a mio avviso, è molto più sicuro!

Per quanto riguarda la funzione "void prestito_con_titolo ( char* )", a me sembra funzionare bene!

Ho trovato un errore nella funzione " void inserimento ( ) " :
Codice sorgente - presumibilmente C/C++

  1. void inserimento(){
  2.     LIBRO libro = {"","",0,'f'};
  3.     int esiste, pos;
  4.     printf("\n\nInserire i dati relativi al libro N. %d", (libriInseriti+1));
  5.     do{
  6.         esiste = 0;
  7.         printf("\nTitolo: ");
  8.         fflush(stdin);
  9.         scanf("%s", libro.titolo);  
  10.         for(pos=0; pos < libriInseriti; pos++){
  11.             if(strcmp(libro.titolo, libri[pos].titolo) == 0){
  12.                 esiste = 1;
  13.                 printf("Titolo libro gi… presente, inserire un titolo differente");
  14.                 break;
  15.             }
  16.         }
  17.     } while(esiste == 1);
  18.     printf("Autore: ");
  19.     fflush(stdin);
  20.     scanf("%s", &libro.autore);
  21.     libro.codice = codice++;
  22.     printf("Codice libro: %d", libro.codice);
  23.     libri[libriInseriti] = libro;
  24.     libriInseriti++;
  25. }



Quando chiedi il titolo, devi inserire " scanf("%s", &libro.titolo ) ; ", o meglio se inserisci " gets( libro.titolo ) ; "
  

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:14
Domenica, 21/02/2010
Marco ... il problema è quello che ha spiegato Giuseppe ... la funzione viene chiamata passando un puntatore che non punta a nessuna zona di memoria ...

Un errore grave, che indica che non si è capito come usare puntatori ed array.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
espaoloema (Normal User)
Newbie


Messaggi: 11
Iscritto: 18/02/2010

Segnala al moderatore
Postato alle 20:21
Domenica, 21/02/2010
ho corretto...vi ringrazio x le correzioni servono x farmi apprendere di +!!!!!

ho editato il primo post!!

Ultima modifica effettuata da espaoloema il 21/02/2010 alle 20:27
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 21:36
Domenica, 21/02/2010
Testo quotato

Postato originariamente da nessuno:

Marco ... il problema è quello che ha spiegato Giuseppe ... la funzione viene chiamata passando un puntatore che non punta a nessuna zona di memoria ...

Un errore grave, che indica che non si è capito come usare puntatori ed array.



Lo so! Io ho trovato un secondo errore nella funzione
" void inserimento ( ) ". Che ora, stranamente non esiste più.
Inoltre, il sorgente è diventato molto confuso.

PM Quote
Avatar
espaoloema (Normal User)
Newbie


Messaggi: 11
Iscritto: 18/02/2010

Segnala al moderatore
Postato alle 23:52
Domenica, 21/02/2010
Testo quotato

Postato originariamente da Poggi Marco:

Testo quotato

Postato originariamente da nessuno:

Marco ... il problema è quello che ha spiegato Giuseppe ... la funzione viene chiamata passando un puntatore che non punta a nessuna zona di memoria ...

Un errore grave, che indica che non si è capito come usare puntatori ed array.



Lo so! Io ho trovato un secondo errore nella funzione
" void inserimento ( ) ". Che ora, stranamente non esiste più.
Inoltre, il sorgente è diventato molto confuso.
  



l'ho editato io...lasciando solo la void ke mi interessava...
x l errore ke mi hai segnalato, ti ringrazio..e l ho corretto...

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 10:57
Lunedì, 22/02/2010
Testo quotato

Postato originariamente da espaoloema:

l'ho editato io...lasciando solo la void ke mi interessava...
x l errore ke mi hai segnalato, ti ringrazio..e l ho corretto...



per la cronaca... non si chiamano "le void", ma "le funzioni". La parola prima del nome della funzione è il tipo del valore restituito (void significa in particolare che non restituisce alcun valore).

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6404
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:48
Lunedì, 22/02/2010
Testo quotato

Postato originariamente da TheKaneB:


per la cronaca...



la void ... :asd: :asd: :asd:


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote