-
Unhandled exception
Hi, I get an unhandled exception in this code:
Code:
while(strcmp(nom, linia_tren->nom_linia) != 0){
linia_tren++;
}
while((strcmp(parada1, linia_tren->dades_parades->nom_parada) != 0) && (strcmp(parada2, linia_tren->dades_parades->nom_parada) != 0)){
linia_tren->dades_parades++;
}
if (strcmp(parada1, linia_tren->dades_parades->nom_parada) != 0){
while(strcmp(parada2, linia_tren->dades_parades->nom_parada) != 0){
linia_tren->dades_parades++;
}
}
else{
while(strcmp(parada1, linia_tren->dades_parades->nom_parada) != 0){
linia_tren->dades_parades++;
}
}
Here my types declaration:
Code:
typedef struct
{
char nom_parada[MAX_NOM];
int distancia_anterior;
int temps_anterior;
} parada;
typedef struct
{
char nom_linia[MAX_NOM];
int n_parades;
parada *dades_parades;
} linia;
And variables:
Code:
char nom [MAX_NOM], parada1 [MAX_NOM], parada2 [MAX_NOM];
int n_linia_tren
linia *linia_tren;
Thanks
-
Frankly, your indentation is excessive and inconsistent. It would be more readable to write:
Code:
while (strcmp(nom, linia_tren->nom_linia) != 0) {
linia_tren++;
}
while ((strcmp(parada1, linia_tren->dades_parades->nom_parada) != 0)
&& (strcmp(parada2, linia_tren->dades_parades->nom_parada) != 0)) {
linia_tren->dades_parades++;
}
if (strcmp(parada1, linia_tren->dades_parades->nom_parada) != 0) {
while (strcmp(parada2, linia_tren->dades_parades->nom_parada) != 0) {
linia_tren->dades_parades++;
}
}
else {
while (strcmp(parada1, linia_tren->dades_parades->nom_parada) != 0) {
linia_tren->dades_parades++;
}
}
As for this "unhandled exception": try tracing your code with a debugger. At a glance, there is nothing obviously wrong with the code that you posted, so it would be best if you came up with the smallest and simplest compilable code that demonstrates the error.
-
I suspect I've seen this code before, but won't you mind showing a smallest possible compilable example that demonstrates the problem?
You don't give us very much information to work with.
With your current code, all I can say is:
Warning 2 warning C4101: 'n_linia_tren' : unreferenced local variable g:\w00t\visual studio 2008\projects\temp\temp4.cpp 22
Warning 3 warning C6001: Using uninitialized memory 'linia_tren': Lines: 21, 22, 23, 25 g:\w00t\visual studio 2008\projects\temp\temp4.cpp 25
Warning 4 warning C4700: uninitialized local variable 'linia_tren' used g:\w00t\visual studio 2008\projects\temp\temp4.cpp 25
-
This is the code that can be compiled:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NOM 20
#define TOTAL_LINIES 2
typedef struct
{
char nom_parada[MAX_NOM];
int distancia_anterior;
int temps_anterior;
} parada;
typedef struct
{
char nom_linia[MAX_NOM];
int n_parades;
parada *dades_parades;
} linia;
void CalculaDisTemps(parada *parades, int longitud, float *distancia, float *temps){
int i;
*distancia = 0;
*temps = 0;
i=0;
do{
*distancia = *distancia + (*parades).distancia_anterior;
parades++;
i++;
}while (i<longitud);
parades = parades - i;
i=0;
do{
*temps = *temps + (*parades).temps_anterior;
parades++;
i++;
}while (i<longitud);
}
void OmplirDades (parada *parades, int nparades){
int i;
for(i=0;i<nparades;i++){
printf("Introdueixi el nom de la parada:\n");
fgets(parades->nom_parada, MAX_NOM, stdin);
printf("Introdueix la distància que hi ha des de la parada anterior:\n");
scanf("%d", ¶des->distancia_anterior);
printf("Introdueix el temps que ha passat des de la parada anterior:\n");
scanf("%d", ¶des->temps_anterior);
parades++;
}
parades = (parades - nparades);
}
void OmplirDadesLinia(linia *linia_tren){
printf("Introdueix el nom de la línia:\n");
fgets (linia_tren->nom_linia, MAX_NOM, stdin);
printf("Introdueix el nombre de parades de la línia:\n");
scanf("%d", &linia_tren->n_parades);
linia_tren->dades_parades = (parada*)malloc(sizeof(parada)*linia_tren->n_parades);
OmplirDades (linia_tren->dades_parades, linia_tren->n_parades);
}
void main(){
int n_linia_tren, i, menu, sortir;
float distancia;
float temps;
char nom [MAX_NOM], parada1 [MAX_NOM], parada2 [MAX_NOM];
linia *linia_tren;
printf("Quantes línies de tren voleu tenir?");
scanf("%d", &n_linia_tren);
linia_tren = (linia*)malloc(sizeof(linia)*n_linia_tren);
sortir = 1;
do{
printf("Selecciona una opció del menú:\n");
scanf("%d", &menu);
switch (menu){
case 1:
for (i=0; i<n_linia_tren; i++){
OmplirDadesLinia(linia_tren);
linia_tren++;
}
break;
case 2:
printf("Introdueix el nom de la línia:\n");
fgets(nom, MAX_NOM, stdin);
printf("Introdueix el nom de dos parades d'aquesta línia:\n");
fgets(parada1, MAX_NOM, stdin);
fgets(parada2, MAX_NOM, stdin);
while(strcmp(nom, linia_tren->nom_linia) != 0){
linia_tren++;
}
while((strcmp(parada1, linia_tren->dades_parades->nom_parada) != 0) && (strcmp(parada2, linia_tren->dades_parades->nom_parada) != 0)){
linia_tren->dades_parades++;
}
if (strcmp(parada1, linia_tren->dades_parades->nom_parada) != 0){
while(strcmp(parada2, linia_tren->dades_parades->nom_parada) != 0){
linia_tren->dades_parades++;
}
}
else{
while(strcmp(parada1, linia_tren->dades_parades->nom_parada) != 0){
linia_tren->dades_parades++;
}
}
break;
case 3: sortir = 0;
}
}while (sortir != 0);
CalculaDisTemps(linia_tren->dades_parades, linia_tren->n_parades, &distancia, &temps);
printf("%f\n", distancia);
printf("%f\n", temps);
free(linia_tren);
}
-
On first glance:
Warning 1 warning C4326: return type of 'main' should be 'int' instead of 'void' g:\w00t\visual studio 2008\projects\temp\temp4.cpp 80
-
This creates a linia:
Code:
linia_tren = (linia*)malloc(sizeof(linia)*n_linia_tren);
However, the parada* belonging to this object is a null pointer, but you dereference it.
Oh, and did you even pay attention when I told you to come up with the smallest and simplest compilable code that demonstrates the error?