Error de segmentación??
Tengo un problema en estas funciones. El programa que tengo que hacer lee los nombres de los alumnos y 3 notas de prácticas y una de teoría y lo almacena todo en un vector dinámico de tipo alumno. Después ordena los nombres, que son de tipo char * y usa la función strcmp, que se encuentra en la biblioteca cstring, y que compara dos cadenas y devuelve un entero si la 2ª cadena es mayor. Os he copiado sólo las funciones de ordenar e intercambiar porque son las que fallan cuando paso el depurador. Me da un fallo de segmentación así que será por algo de la memoria pero no tengo ni idea. Si necesitáis el código fuente entero os lo paso por el messenger o por email ¿Podéis ayudarme, por favor? Gracias
struct alumno{
char *nombre;
int practica1;
int practica2;
int practica3;
double teoria;
};
void Intercambia(alumno &v1, alumno &v2){
alumno aux;
strcpy(aux.nombre, v1.nombre); //copia una cadena en otra
aux.practica1=v1.practica1;
aux.practica2=v1.practica2;
aux.practica3=v1.practica3;
aux.teoria=v1.teoria;
strcpy(v1.nombre, v2.nombre);
v1.practica1=v2.practica1;
v1.practica2=v2.practica2;
v1.practica3=v2.practica3;
v1.teoria=v2.teoria;
strcpy(v2.nombre, aux.nombre);
v2.practica1=aux.practica1;
v2.practica2=aux.practica2;
v2.practica3=aux.practica3;
v2.teoria=aux.teoria;
}
void OrdenaAlumnos(alumno *Lista, int util_alumnos){
bool cambio=true;
for(int izda=0; izda<util_alumnos-1&&cambio; izda++){
cambio=false;
for(int i=util_alumnos-2; i>izda; i--)
if(strcmp(Lista[i].nombre, Lista[i-1].nombre)<0){
Intercambia(Lista[i], Lista[i-1]);
cambio=true;
}
}
}
struct alumno{
char *nombre;
int practica1;
int practica2;
int practica3;
double teoria;
};
void Intercambia(alumno &v1, alumno &v2){
alumno aux;
strcpy(aux.nombre, v1.nombre); //copia una cadena en otra
aux.practica1=v1.practica1;
aux.practica2=v1.practica2;
aux.practica3=v1.practica3;
aux.teoria=v1.teoria;
strcpy(v1.nombre, v2.nombre);
v1.practica1=v2.practica1;
v1.practica2=v2.practica2;
v1.practica3=v2.practica3;
v1.teoria=v2.teoria;
strcpy(v2.nombre, aux.nombre);
v2.practica1=aux.practica1;
v2.practica2=aux.practica2;
v2.practica3=aux.practica3;
v2.teoria=aux.teoria;
}
void OrdenaAlumnos(alumno *Lista, int util_alumnos){
bool cambio=true;
for(int izda=0; izda<util_alumnos-1&&cambio; izda++){
cambio=false;
for(int i=util_alumnos-2; i>izda; i--)
if(strcmp(Lista[i].nombre, Lista[i-1].nombre)<0){
Intercambia(Lista[i], Lista[i-1]);
cambio=true;
}
}
}
Yo encuentro algo particular en las lineas:
>> bool cambio=true;
>> for(int izda=0; izda<util_alumnos-1&&cambio; izda++){
>> cambio=false;
.. ...
En la primera comprobación dentro del for, cambio es true, así que 1&&cambio se evaluará como true, lo que después se promueve a entero para restarlo de util_alumnos. Entonces, el resultado de esto sería:
util_alumnos-1 como límite de la primera comparación.
Después, ya dentro del ciclo, dices: cambio = false, cambiando la condición del ciclo for, que ahora será:
util_alumnos-0; (porque 1&&false es false, que promovido a entero para restarlo, queda en 0).
Sólo te señalo esta particularidad que me resulta curiosa. Fíjate que el ciclo más interno se ejecuta util_alumnos veces.
Alejandro
>> bool cambio=true;
>> for(int izda=0; izda<util_alumnos-1&&cambio; izda++){
>> cambio=false;
.. ...
En la primera comprobación dentro del for, cambio es true, así que 1&&cambio se evaluará como true, lo que después se promueve a entero para restarlo de util_alumnos. Entonces, el resultado de esto sería:
util_alumnos-1 como límite de la primera comparación.
Después, ya dentro del ciclo, dices: cambio = false, cambiando la condición del ciclo for, que ahora será:
util_alumnos-0; (porque 1&&false es false, que promovido a entero para restarlo, queda en 0).
Sólo te señalo esta particularidad que me resulta curiosa. Fíjate que el ciclo más interno se ejecuta util_alumnos veces.
Alejandro
He usado el método de la burbuja para ordenar. Si pongo cambio=false es para que salga del primer bucle si ya está ordenado y no siga evaluando. Pero me he equivocado en la condición del 2º bucle que es:
for(int i=util_alumnos-1; i>izda; i--)
por lo demás está todo bien, pero sigue sin funcionar. Gracias por todo
for(int i=util_alumnos-1; i>izda; i--)
por lo demás está todo bien, pero sigue sin funcionar. Gracias por todo
