PDA

Visualizza la versione completa : [C++] Codice che porta a crash dell'applicazione


FoX___X
10-03-2011, 21:11
Prima di tutto vorrei ringraziare tutti quelli che hanno accolto la mia richiesta di aiuto e vorrei continuare dicendo che sono alle prime armi, quindi vi prego abbiate pazienza.

Il mio problema relativo ad un progetto d'esame che si occupa di creare un programma che gestisca una rubrica telefonica utilizzando le liste concatenate e l'allocazione dinamica della memoria. Questo programma deve quindi avere una lista di contatti ognuno dei quali deve avere un nome, un cognome, un numero di telefono e di casa, un indirizzo di posta elettronica e di sito web. Inoltre sulla lista deve essere possibile eseguire operazioni di immissione ricerca cancellazione e visualizzazione dei contatti.

Io ho strutturato tutto il codice ma quando eseguo il programma, questo va in errore e il nome di questo errore APPCRASH.
Potreste darmi una mano???
Ci sbatto la testa da 3 giorni ormai voi siete la mia ultima speranza....vi prego AIUTOOO.....

FoX___X
10-03-2011, 21:29
nella speranza di un aiuto adesso inserisco il codice e i dettagli dell'errore.....
Vi prego AIUTATEMII... :cry:


#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#define DIM_numero 10
#define MAX_carattere 100

typedef struct { // DEFINIAMO IL TIPO CONTATTO.
char nome [MAX_carattere];
char cognome [MAX_carattere];
char numero [DIM_numero];
char numero_casa [DIM_numero];
char email [MAX_carattere];
char indirizzo_web [MAX_carattere];
} tipi_contatti;

struct Contatto_in_rubrica;

typedef Contatto_in_rubrica *PuntContatto_in_rubrica;

typedef struct Contatto_in_rubrica {
tipi_contatti CONTATTO;
Contatto_in_rubrica * contattoSuccessivo;
} Contatto_in_rubrica;

PuntContatto_in_rubrica inserisci_in_ordine(PuntContatto_in_rubrica L, tipi_contatti *CONTATTO) { // Funzione per l'inserimento di un contatto in rubrica.

PuntContatto_in_rubrica succ, prec, new_node;
new_node=(PuntContatto_in_rubrica)malloc(sizeof (struct Contatto_in_rubrica));
prec=NULL;
succ=L;

printf("Inserire il NOME del contatto: \n");
scanf("%f", &new_node->CONTATTO.nome);
printf("Inserire il COGNOME del contatto: \n");
scanf("%f", &new_node->CONTATTO.cognome);
printf("Inserire il NUMERO del contatto: \n");
scanf("%f", &new_node->CONTATTO.numero);
printf("Inserire il NUMERO DI CASA del contatto: \n");
scanf("%f", &new_node->CONTATTO.numero_casa);
printf("Inserire l'INDIRIZZO EMAIL del contatto: \n");
scanf("%f", &new_node->CONTATTO.email);
printf("Inserire l'INDIRIZZO DI PAGINA WEB del contatto: \n");
scanf("%f", &new_node->CONTATTO.indirizzo_web);

while ((succ!=NULL) && (new_node->CONTATTO.nome > succ->CONTATTO.nome)) {
prec=succ;
succ=succ->contattoSuccessivo;
};
if (new_node==NULL) {
printf("Errore nell'allocazione della memoria. \n");
exit (1);
};
if (prec==NULL) {
new_node->contattoSuccessivo = succ;
printf("Il contatto stato inserito in rubrica. \n");
return new_node;
}
else {
new_node->contattoSuccessivo = succ;
prec->contattoSuccessivo = new_node;
printf("Il contatto stato inserito in rubrica. \n");
return L;
};
};
PuntContatto_in_rubrica cancella_un_contatto(PuntContatto_in_rubrica L, tipi_contatti *CONTATTO) { // Funzione per la cancellazione di un contatto dalla rubrica.
PuntContatto_in_rubrica succ, prec, temp;
printf("Inserire il nome del contatto da cancellare: \n");
scanf("%f", &temp->CONTATTO.nome);
prec = NULL;
succ = L;

while ((succ != NULL) && (temp->CONTATTO.nome > succ->CONTATTO.nome)) {
prec = succ;
succ = succ->contattoSuccessivo;
};
if (succ==NULL) {
printf("Il contatto da cancellare non presente in rubrica. \n");
return L;
}
else {
if (succ->CONTATTO.nome == temp->CONTATTO.nome) {
if (prec==NULL) {
L = succ->contattoSuccessivo;
free (succ);
printf("Il contatto stato cancellato. \n");
return L;
}
else {
prec->contattoSuccessivo = succ->contattoSuccessivo;
free (succ);
printf("Il contatto stato cancellato. \n");
return L;
};
}
else {
return L;
};
};
};

PuntContatto_in_rubrica Cerca_contatto (PuntContatto_in_rubrica L, tipi_contatti *CONTATTO) { // Funzione per la ricerca di un contatto.
PuntContatto_in_rubrica temp;
printf("Inserire il Nome del contatto da ricercare: \n");
scanf("%f", &temp->CONTATTO.nome);

while ((L != NULL) && (temp->CONTATTO.nome > L->CONTATTO.nome)) {
L = L->contattoSuccessivo;
printf("\n________________________________________________ ______________\n");
printf("\n %f \n %f \n %f \n %f \n %f \n %f \n %f \n", L->CONTATTO.nome, L->CONTATTO.cognome, L->CONTATTO.numero, L->CONTATTO.numero_casa, L->CONTATTO.email, L->CONTATTO.indirizzo_web);
printf("\n________________________________________________ ______________\n");
};
if ((L != NULL) && (L->CONTATTO.nome == temp->CONTATTO.nome)) {
return L;
}
else {
printf("Contatto non trovato. \n");
return NULL;
};
};

void visualizza_rubrica (PuntContatto_in_rubrica L) { // Funzione per la visualizzazione della rubrica.
PuntContatto_in_rubrica temp;
temp = L;
while (temp != NULL) {
printf(" NOME: %f\n", temp->CONTATTO.nome);
printf(" COGNOME: %f\n", temp->CONTATTO.cognome);
printf(" NUMERO: %f\n", temp->CONTATTO.numero);
printf(" NUMERO DI CASA: %f\n", temp->CONTATTO.numero_casa);
printf(" INDIRIZZO EMAIL: %f\n", temp->CONTATTO.email);
printf(" INDIRIZZO DI PAGINA WEB: %f\n", temp->CONTATTO.indirizzo_web);
printf("\n __________________________________________________ ________________ \n");
temp = temp->contattoSuccessivo;
};
};
int main () {
PuntContatto_in_rubrica L;
tipi_contatti CONTATTO;
int scelta;
printf("\n :) :) :) RUBRICA TELEFONICA :) :) :) \n");
while (scelta != 5) {
printf("\n 1- AGGIUNGI CONTATTO. \n");
printf(" 2- CERCA CONTATTO. \n");
printf(" 3- ELIMINA CONTATTO. \n");
printf(" 4- VISUALIZZA RUBRICA. \n");
printf(" 5- ESCI. \n\n");

scanf("%d", &scelta);

switch (scelta) {
case 1 :
inserisci_in_ordine (L, &CONTATTO);
break;

case 2 :
Cerca_contatto (L, &CONTATTO);
break;

case 3 :
cancella_un_contatto (L, &CONTATTO);
break;

case 4 :
visualizza_rubrica (L);
break;
}
}
system("PAUSE");
return 0;
}

E questo invece l'errore risultante.... :cry:


Firma problema:
Nome evento problema: APPCRASH
Nome applicazione: progetto esame 3.exe
Versione applicazione: 0.0.0.0
Timestamp applicazione: 4d793427
Nome modulo con errori: progetto esame 3.exe
Versione modulo con errori: 0.0.0.0
Timestamp modulo con errori: 4d793427
Codice eccezione: c0000005
Offset eccezione: 0000149a
Versione SO: 6.1.7600.2.0.0.768.3
ID impostazioni locali: 1040
Informazioni aggiuntive 1: 0a9e
Ulteriori informazioni 2: 0a9e372d3b4ad19135b953a78882e789
Ulteriori informazioni 3: 0a9e
Ulteriori informazioni 4: 0a9e372d3b4ad19135b953a78882e789

shodan
10-03-2011, 21:51
La prima regola : usare un puntatore che non si sa a cosa punti porta a pena infinita.
Stai usando L (nel main) che non si sa a cosa punti (in gergo a spazzatura) e nelle funzioni lo usi (assegnandolo ad altri puntatori), cercando poi di accedere a campi che non esistono:
succ->CONTATTO.nome ad esempio.
Infine le funzioni restituiscono puntatori di cui si perdono le traccie.
Riporto le parti interessate.


int main(etc) {
PuntContatto_in_rubrica L = NULL;
...
switch (scelta) {
case 1 :
L = inserisci_in_ordine (L, &CONTATTO);
break;

case 2 :
L = Cerca_contatto (L, &CONTATTO);
break;

case 3 :
L = cancella_un_contatto (L, &CONTATTO);
break;

case 4 :
visualizza_rubrica (L);
break;
}

FoX___X
10-03-2011, 22:09
Quindi come potrei aggiustarlo.... :cry: .....non sono molto bravo come avrai capito....sono tre giorni che cerco una soluzione per far funzionare questo programma e presentarlo all'esame...sto cercando sulle slide del prof su internet ma nn riesco ad uscirne....come potrei fare???....grazie davvero per l'aiuto...

shodan
10-03-2011, 22:52
Intanto studia bene come usare la scanf:
http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
visto che sbagli i flag di acquisizione richiedendo un float invece di una stringa e per di pi assegnandolo a un char**.
E poi come confrontare stringhe ASCIIZ con strncmp:
http://www.cplusplus.com/reference/clibrary/cstring/strncmp/



// scanf("%f", &new_node->CONTATTO.nome);
scanf("%s", new_node->CONTATTO.nome);


Non l'ho testato, ma a occhio dovrebbe essere una cosa del genere.


PuntContatto_in_rubrica succ, prec, new_node;
new_node=(PuntContatto_in_rubrica)malloc(sizeof (struct Contatto_in_rubrica));
if (new_node==NULL) {
printf("Errore nell'allocazione della memoria. \n");
exit (1);
};
// Annullo il puntatore al prossimo elemento.
new_node->contattoSuccessivo = NULL;

prec=NULL; // A che dovrebbe servire? I nuovi contatti si inseriscono alla fine.
succ=L;

printf("Inserire il NOME del contatto: \n");
scanf("%s", new_node->CONTATTO.nome);
printf("Inserire il COGNOME del contatto: \n");
scanf("%s", new_node->CONTATTO.cognome);
printf("Inserire il NUMERO del contatto: \n");
scanf("%s", new_node->CONTATTO.numero);
printf("Inserire il NUMERO DI CASA del contatto: \n");
scanf("%s", new_node->CONTATTO.numero_casa);
printf("Inserire l'INDIRIZZO EMAIL del contatto: \n");
scanf("%s", new_node->CONTATTO.email);
printf("Inserire l'INDIRIZZO DI PAGINA WEB del contatto: \n");
scanf("%s", new_node->CONTATTO.indirizzo_web);

if (succ == NULL) {
// Questo il primo della lista.
// Basta restituire il nodo allocato.
return new_node;
}

// Cerco l'ultimo elemento della lista.
// Qui ci si arriva dalla seconda chiamata della funzione in poi.
while (succ->contattoSuccessivo!=NULL) {
succ = succ->contattoSuccessivo;
}
// succ adesso l'ultimo elemento valido della lista.
// succ->contattoSuccessivo pu puntare al prossimo contatto.
succ->contattoSuccessivo = new node;
return succ;
/*
&& strncmp(new_node->CONTATTO.nome, succ->CONTATTO.nome, MAX_carattere) > 1) {
prec=succ;
succ=succ->contattoSuccessivo;
};

if (prec==NULL) {
new_node->contattoSuccessivo = succ;
printf("Il contatto stato inserito in rubrica. \n");
return new_node;
}
else {
new_node->contattoSuccessivo = succ;
prec->contattoSuccessivo = new_node;
printf("Il contatto stato inserito in rubrica. \n");
return L;
};
*/

alka
11-03-2011, 12:17
C++ AIUTOOO non capisco il problema del mio codice

Invito a usare titoli pi significativi per le future discussioni, come indicato nel Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887).

Qui l'ho corretto io (un minimo).

FoX___X
11-03-2011, 22:44
scusami davvero per la disattenzione ma mi era sfuggito di mente....sono nuovo non ho ancora molta esperienza... :) ...in futuro far pi attenzione..

Loading