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++ - Dubbio sul ritorno della funzione
Forum - C/C++ - Dubbio sul ritorno della funzione - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 20:42
Lunedì, 19/12/2011
Testo quotato

Postato originariamente da nessuno:

Testo quotato

Postato originariamente da Driverfury:

Comunque ho modificato il codice come mi avete consigliato ma l'applicazione si blocca e si chiude.



Per il futuro, il fatto che un'applicazione venga corretta (e vengano eliminati gli errori di compilazione) non significa che funzioni quando venga eseguita e non ci possano essere "altri" errori (a runtime appunto).

Il problema del tuo codice è causato dal fatto che hai utilizzato, nella struttura, dei puntatori a char e li hai utilizzati direttamente "senza allocare lo spazio" per ogni stringa. Questo causa (almeno) un crash dell'applicazione (come capita a te).

P.S. Per la firma, ok ... de gustibus ...



Ho modificato i puntatori a char nella struttura "contact":

Codice sorgente - presumibilmente C++

  1. // Struttura: Contatto
  2. struct contact
  3. {
  4.     char name[30];
  5.     char surname[30];
  6.     char number[15];
  7.     char address[100];
  8. };



Ma l'errore è sempre lo stesso: "Si è verificato un errore in Rubrica.exe. L'applicazione verrà chiusa.". Perchè?

Vi posto l'intero sorgente:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define FILE_NAME "rubrica.txt"
  6.  
  7. #define DEBUG 1
  8.  
  9. // Variabili e costanti globali
  10. const int MAX_CON = 500; // Costante che sta ad indicare il massimo numero di contatti della rubrica
  11.  
  12. // Struttura: Contatto
  13. struct contact
  14. {
  15.     char name[30];
  16.     char surname[30];
  17.     char number[15];
  18.     char address[100];
  19. };
  20.  
  21. // Prototipi di funzioni
  22. void showMenu();
  23. void controlMenu();
  24. int addContact(char *fileName);
  25. int showContacts(char *fileName);
  26. void returnContacts(char *fileName, struct contact *c);
  27. int returnNContacts(char *fileName);
  28.  
  29. int main(int argc, char *argv[])
  30. {
  31.    
  32.     // Compie all'infinito questo ciclo
  33.     do
  34.     {
  35.        
  36.         showMenu();
  37.         controlMenu();
  38.        
  39.     } while(1);
  40.    
  41.     // Se il programma è in fase di debug allora usa la funzione di sistema "PAUSE"
  42.     #if DEBUG == 1
  43.         system("PAUSE");
  44.     #endif
  45.    
  46.     return 0;
  47. }
  48.  
  49. // Procedura che stampa a schermo il menù
  50. void showMenu()
  51. {
  52.     printf("--- MENU' PRINCIPALE ---\n");
  53.     printf("\n1. Aggiungi contatto");
  54.     printf("\n2. Guarda rubrica");
  55.     printf("\n3. Cerca contatto");
  56.     printf("\n9. Esci\n");
  57. }
  58.  
  59. // Procedura che richiama una funzione a seconda della decisione presa nel menù
  60. void controlMenu()
  61. {
  62.     int choise;
  63.     printf("\nScegli un'opzione dal menu' => ");
  64.     scanf("%d", &choise); // Prendo in input la scelta dell'utente
  65.    
  66.     // Richiamo le funzioni in base alla scelta
  67.     switch (choise)
  68.     {
  69.         case 1:
  70.             addContact(FILE_NAME);
  71.             break;
  72.         case 2:
  73.             showContacts(FILE_NAME);
  74.             break;
  75.         case 3:
  76.             break;
  77.         case 9:
  78.             exit(1);
  79.         default:
  80.             controlMenu(); // Se la scelta non è valido richiamo ricorsivamente questa funzione
  81.     }
  82. }
  83.  
  84. // Funzione per aggiungere un nuovo contatto nella rubrica (ritorna 1 se la funzione va a buon fine)
  85. int addContact(char *fileName)
  86. {
  87.     FILE *fp; // Puntatore a file
  88.     struct contact c; // Variabile di tipo struttura "contact"
  89.     char *temp_c; // Variabile d'appoggio
  90.    
  91.     if(!(fp=fopen(fileName, "a"))) // Se non riesce ad aprire il file in modalità di scrittura
  92.     {
  93.         printf("\nErrore durante l'apertura del file \"%s\" in modalita' append.\n", fileName);
  94.         return 0;
  95.     }
  96.    
  97.     printf("Inserire il nome: ");
  98.     gets(c.name); // Prendo in input il nome del contatto
  99.     gets(temp_c);
  100.    
  101.     printf("Inserire il cognome: ");
  102.     gets(c.surname); // Prendo in input il cognome del contatto
  103.     gets(temp_c);
  104.    
  105.     printf("Inserire il numero di telefono: ");
  106.     gets(c.number); // Prendo in input il numero di telefono del contatto
  107.     gets(temp_c);
  108.    
  109.     printf("Inserire l'indirizzo: ");
  110.     gets(c.address); // Prendo in input l'indirizzo
  111.     gets(temp_c);
  112.    
  113.     if(fprintf(fp, "%s %s %s %s\n", c.name, c.surname, c.number, c.address)>0) /* Se riesce a scrivere su file
  114.     più di 0 Byte */
  115.     {
  116.         printf("\nContatto inserito con successo!\n");
  117.     } else {
  118.         fclose(fp); // Chiudo il file
  119.         printf("\nErrore durante l'inserimento del contatto!\n");
  120.         return 0;
  121.     }
  122.    
  123.     fclose(fp); // Chiudo il file
  124.     return 1; // Se tutto va a buon fine ritorna 1
  125. }
  126.  
  127. // Funzione per stampare a schermo tutti i contatti della rubrica (ritorna 1 se la funzione va a buon fine)
  128. int showContacts(char *fileName)
  129. {
  130.     FILE *fp; // Puntatore a file
  131.     struct contact c[MAX_CON]; // Variabile di tipo struttura "contact"
  132.     int nOfContacts;
  133.     int i=0; // Contatore
  134.    
  135.     returnContacts(fileName, c);
  136.    
  137.     nOfContacts = returnNContacts(fileName);
  138.    
  139.     for (i=0; i < nOfContacts; i++)
  140.     {
  141.         if (i==0) // Se questo è il primo contatto stampa le descrizioni delle informazioni dei contatti
  142.         {
  143.             printf("\nCognome\t\tNome\t\tNumero\t\tIndirizzo\n");
  144.         }
  145.        
  146.         // Stampo a schermo il contatto attuale
  147.         printf("\n%s\t\t%s\t\t%s\t\t%s", c[i].surname, c[i].name, c[i].number, c[i].address);
  148.     }
  149.    
  150.    
  151.     fclose(fp); // Chiudo il file
  152.     return 1; // Se tutto va a buon fine ritorna 1
  153. }
  154.  
  155. // Procedura che assegna un array di contatti
  156. void returnContacts(char *fileName, struct contact c[])
  157. {
  158.     FILE *fp; // Puntatore a file
  159.     int i=0; // Contatore
  160.    
  161.     if(!(fp=fopen(fileName, "r"))) // Se non riesce ad aprire il file in modalità di scrittura
  162.     {
  163.         printf("\nErrore durante l'apertura del file \"%s\" in modalita' lettura.\n", fileName);
  164.         return;
  165.     }
  166.    
  167.     while(fscanf(fp, "%s %s %s %s\n", c[i].name, c[i].surname, c[i].number, c[i].address)>0) /* Fin quando
  168.     riesce a leggere da file più di 0 Byte */
  169.     {
  170.         i++;
  171.     }
  172.    
  173.     fclose(fp); // Chiudo il file
  174. }
  175.  
  176. // Funzione che ritorna il numero dei contatti nella rubrica
  177. int returnNContacts(char *fileName)
  178. {
  179.     FILE *fp; // Puntatore a file
  180.     struct contact c[MAX_CON]; // Variabile di tipo struttura "contact"
  181.     int i=0; // Contatore
  182.    
  183.     if(!(fp=fopen(fileName, "r"))) // Se non riesce ad aprire il file in modalità di scrittura
  184.     {
  185.         printf("\nErrore durante l'apertura del file \"%s\" in modalita' lettura.\n", fileName);
  186.         return 0;
  187.     }
  188.    
  189.     while(fscanf(fp, "%*s %*s %*s %*s\n")>0) /* Fin quando
  190.     riesce a leggere da file più di 0 Byte */
  191.     {
  192.         i++;
  193.     }
  194.    
  195.     fclose(fp); // Chiudo il file
  196.     return i; // Ritorna il numero di contatti letti
  197. }



Sia quando scelgo l'opzione 1 che la 2 (ovvero sia che scrivo o che leggo da file) mi esce sempre lo stesso errore. Aiutatemi per favore.

Ultima modifica effettuata da Driverfury il 19/12/2011 alle 20:43
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 0:54
Martedì, 20/12/2011
Anche per

tempc

vale lo stesso discorso. E' un puntatore a char ma non puoi usarlo senza allocare lo spazio per la gets.

Hai difficoltà a lavorare con i puntatori ...



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
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 14:31
Martedì, 20/12/2011
Testo quotato

Postato originariamente da nessuno:

Anche per

tempc

vale lo stesso discorso. E' un puntatore a char ma non puoi usarlo senza allocare lo spazio per la gets.

Hai difficoltà a lavorare con i puntatori ...




Sì, è vero, ho ancora difficoltà a lavorare con i puntatori... abbiate pazienza. Comunque nella funzione showContacts() con uso nessun puntatore a carattere.
Mi spiegate cosa c'è che non va nella funzione addContacts() e showContacts()?

Ultima modifica effettuata da Driverfury il 20/12/2011 alle 14:32
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:23
Martedì, 20/12/2011
Beh, in addContact c'è il problema di tempc !

L'hai corretto?

Mostra il codice corretto ...


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
Driverfury (Normal User)
Rookie


Messaggi: 45
Iscritto: 21/09/2011

Segnala al moderatore
Postato alle 17:14
Mercoledì, 21/12/2011
Ok per addContact() è quello l'errore... ma in showContacts(), cosa c'è che non va?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:38
Mercoledì, 21/12/2011
Perché utilizzi un altro puntatore FILE, perché chiudi un file non aperto?

Perché richiami due funzioni simili come

returnContacts
  
returnNContacts

Dovresti usarne una sola che faccia tutto.

E devi fare il debugging dell'applicazione ...


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
Pagine: [ 1 2 ] Precedente | Prossimo