Autor
|
Tema: Ejercicio compila pero no se ejecuta (Leído 8,910 veces)
|
David8
Desconectado
Mensajes: 50
|
Muy buenas de nuevo. Estoy haciendo un programa ( muy básico ) en el que se debe introducir un número de alumnos, luego pedir una calificación a cada uno en el intervalo [0, 10], y por último clasificar el número de aprobados, notables, etc. TODO CON ENTEROS. De momento llevo lo siguiente: #include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<string.h>
#define TAMANIO 10
int verificarEntrada(const char *ptrX);
int verificarEntrada(const char *ptrX) { for(; *ptrX != '\0'; ptrX++){ if(isdigit(*ptrX) == 0){ puts("->Entrada no permitida."); return 0; } } return 1; }
int main(void) { char nAlumnos[TAMANIO]; int alumnos; int longitud; int x; // valor que devuelve la función verificarEntrada() int i; char *notas[alumnos]; int notasEnteras[alumnos]; do{ printf("Numero de alumnos: "); fgets(nAlumnos, TAMANIO, stdin); // si introducimos 9 o más caracteres se produce OVERFLOW en el buffer longitud = strlen(nAlumnos); if(nAlumnos[longitud-1] == '\n'){ // si la cadena tiene una longitud menor a TAMANIO-1 evitamos la "impresión de '\n' nAlumnos[longitud-1] = '\0'; } x = verificarEntrada(nAlumnos); puts(""); if(x == 1){ alumnos = atoi(nAlumnos); } } while(x == 0); for (i = 0; i < alumnos; i++){ do{ notas[i] = malloc (TAMANIO * sizeof (char)); printf("Nota alumno %d : ", i + 1); scanf("%[^\n]", notas[i]); while(getchar() != '\n'); x = verificarEntrada(notas[i]); if(x == 1){ int n = atoi(notas[i]); if(n < 0 || n > 10){ // cada nota debe estar comprendida en el intervalor [0, 10] x = 0; } else{ notasEnteras[i] = atoi(notas[i]); } } } while(x == 0); }
return EXIT_SUCCESS; }
El problema es que compila pero en cuanto se abre la consola se termina el proceso. No encuentro que puede estar mal. Agradecería mucho indicaciones de cómo mejorar un poco el código (ya que lo veo un poco desastroso, sobre todo en la declaración de variables ) Gracias.
|
|
« Última modificación: 10 Abril 2014, 11:38 am por David8 »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
¿Que IDE usas?
En el codeblocks si pulsas F8 activas el depurador, y puedes avanzando el programa línea a línea. Así ves donde el programa "estalla".
Otra opción es ir poniendo printfs por el código y ver cuantos printfs llega a escribir antes de que de error, pero el depurador es una tecnica un poco chapucera xD
|
|
|
En línea
|
|
|
|
David8
Desconectado
Mensajes: 50
|
Uso el dev c++ Pero el problema es que no ejecuta nada, es decir, doy a compilar y bien, pero al ejecutar en cuanto aparece la consola sale un mensaje de error de Windows
No ves nada que pueda estar mal en el código? Estoy casi seguro de que falla en alguna parte dentro del for, pero no sé el qué...
Un saludo
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Uso el dev c++ Pero el problema es que no ejecuta nada, es decir, doy a compilar y bien, pero al ejecutar en cuanto aparece la consola sale un mensaje de error de Windows
No ves nada que pueda estar mal en el código? Estoy casi seguro de que falla en alguna parte dentro del for, pero no sé el qué...
Un saludo
Te lo he dicho, tienes que averiguar en que línea te da el problema. Hazme caso y pon printfs cada 3-4 líneas de código: int main(void) { printf("1 - Inicio \n"); char nAlumnos[TAMANIO]; int alumnos; int longitud; int x; // valor que devuelve la función verificarEntrada() int i; char *notas[alumnos]; int notasEnteras[alumnos]; printf("2 - Tras declarar las variables \n"); // Etc...
Solo tienes que ver el último printf que escribes, y sabrás por donde falla (da igual que te salga error de Windows, los printfs los veras igual). PD: Por cierto, usas la variable "alumnos" pero no está inicializada.
|
|
|
En línea
|
|
|
|
David8
Desconectado
Mensajes: 50
|
Te lo he dicho, tienes que averiguar en que línea te da el problema. Hazme caso y pon printfs cada 3-4 líneas de código: int main(void) { printf("1 - Inicio \n"); char nAlumnos[TAMANIO]; int alumnos; int longitud; int x; // valor que devuelve la función verificarEntrada() int i; char *notas[alumnos]; int notasEnteras[alumnos]; printf("2 - Tras declarar las variables \n"); // Etc...
Solo tienes que ver el último printf que escribes, y sabrás por donde falla (da igual que te salga error de Windows, los printfs los veras igual). PD: Por cierto, usas la variable "alumnos" pero no está inicializada. Probaré lo de los prints. Respecto a lo de alumnos, si quiero usar correctamente char *notas[alumnos]; int notasEnteras[alumnos];
debería de declararlos una vez que tenga alumnos definido no? Es decir, antes del for) Muchas gracias y un saludo
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Si, cuando ya lo tengas inicializado.
Los arrays variables mejor con malloc por cierto.
|
|
|
En línea
|
|
|
|
David8
Desconectado
Mensajes: 50
|
Si, cuando ya lo tengas inicializado.
Los arrays variables mejor con malloc por cierto.
int v; char *notas[v] = malloc(alumnos * sizeof (char));
Así?
|
|
|
En línea
|
|
|
|
David8
Desconectado
Mensajes: 50
|
Si, cuando ya lo tengas inicializado.
Los arrays variables mejor con malloc por cierto.
Hice lo que me dijiste y el código me queda así: #include<stdio.h> #include<stdlib.h> #include<ctype.h> #include<string.h>
#define TAMANIO 10
int verificarEntrada(const char *ptrX);
int verificarEntrada(const char *ptrX) { for(; *ptrX != '\0'; ptrX++){ if(isdigit(*ptrX) == 0){ puts("->Entrada no permitida."); return 0; } } return 1; }
int main(void) { char nAlumnos[TAMANIO]; int alumnos; int longitud; int x; // valor que devuelve la función verificarEntrada() int i; do{ printf("Numero de alumnos: "); fgets(nAlumnos, TAMANIO, stdin); // si introducimos 9 o más caracteres se produce OVERFLOW en el buffer longitud = strlen(nAlumnos); if(nAlumnos[longitud-1] == '\n'){ // si la cadena tiene una longitud menor a TAMANIO-1 evitamos la "impresión de '\n' nAlumnos[longitud-1] = '\0'; } x = verificarEntrada(nAlumnos); puts(""); if(x == 1){ alumnos = atoi(nAlumnos); } } while(x == 0); char *notas = malloc(alumnos * sizeof (char)); int notasEnteras[alumnos]; for (i=0; i<alumnos; i++){ do{ notas[i] = malloc(TAMANIO * sizeof (char)); printf("Nota alumno %d : ", i + 1); scanf("%[^\n]", notas[i]); while(getchar() != '\n'); x = verificarEntrada(notas[i]); if(x == 1){ int n = atoi(notas[i]); if(n < 0 || n > 10){ // cada nota debe estar comprendida en el intervalor [0, 10] x = 0; } else{ notasEnteras[i] = atoi(notas[i]); } } } while(x == 0); }
return EXIT_SUCCESS; }
También puse los printf y todo va bien hasta que entra en el for, que no pasa de: scanf("%[^\n]", notas[i]); Aquí pongo los mensajes que me deja el compilador (los que no he conseguido solucionar): In function 'main': 57 13 [Warning] assignment makes integer from pointer without a cast [enabled by default] 60 10 [Warning] passing argument 1 of 'fgets' makes pointer from integer without a cast [enabled by default] 354 39 c:\program files (x86)\dev-cpp\mingw32\include\stdio.h expected 'char *' but argument is of type 'char' 64 10 [Warning] passing argument 1 of 'verificarEntrada' makes pointer from integer without a cast [enabled by default] 10 5 expected 'const char *' but argument is of type 'char' 67 5 [Warning] passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default] 304 37 c:\program files (x86)\dev-cpp\mingw32\include\stdlib.h expected 'const char *' but argument is of type 'char' 73 6 [Warning] passing argument 1 of 'atoi' makes pointer from integer without a cast [enabled by default] 304 37 c:\program files (x86)\dev-cpp\mingw32\include\stdlib.h expected 'const char *' but argument is of type 'char'
No quiero la solución en código del problema si no una pista de lo que pudiese estar fallando. Un saludo.
|
|
|
En línea
|
|
|
|
leosansan
Desconectado
Mensajes: 1.314
|
Todo el mal radica en cómo declaras notas y el char que usas.
Ya que usas array de longitud variable en:int notasEnteras[alumnos];
no sé por qué no haces lo mismo con notas:char *notas[alumnos];
Pero si lo quieres hacer con malloc, entonces:char **notas; *notas=malloc(alumnos * sizeof (char));
¡¡¡¡ Saluditos! ..... !!!!
|
|
|
En línea
|
|
|
|
David8
Desconectado
Mensajes: 50
|
Todo el mal radica en cómo declaras notas y el char que usas.
Ya que usas array de longitud variable en:int notasEnteras[alumnos];
no sé por qué no haces lo mismo con notas:char *notas[alumnos];
Pero si lo quieres hacer con malloc, entonces:char **notas; *notas=malloc(alumnos * sizeof (char));
¡¡¡¡ Saluditos! ..... !!!! Funciona!!! Muchísimas gracias. Aunque no comprendo muy bien lo de punteros a punteros, pero eso es cuestión de estudiarlo mejor. Ya que me lo dijiste, ¿es mejor hacer int notasEnteras[alumnos]; como un array dinámico? Sólo lo uso para almacenar enteros. (perdona mi ignorancia) Un saludo
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Compila bien, pero no ejecuta !! Solucionado
Java
|
Vingilot
|
4
|
4,167
|
8 Enero 2008, 15:20 pm
por Vingilot
|
|
|
Como se compila y ejecuta un programa java en linux
Java
|
Dem0ny
|
2
|
9,433
|
27 Noviembre 2008, 22:24 pm
por Amerikano|Cls
|
|
|
Problema en DevC++, compila pero no se ejecuta.
Programación C/C++
|
jairogon
|
9
|
34,996
|
11 Julio 2010, 21:32 pm
por codeliber
|
|
|
compila y ejecuta bien, pero me muestra un caracter raro
Programación C/C++
|
pedroarcego
|
7
|
4,273
|
7 Septiembre 2010, 11:28 am
por Garfield07
|
|
|
Compila pero no se ejecuta! Ayuda por favor.
Programación C/C++
|
durindemoria
|
7
|
3,801
|
9 Diciembre 2015, 23:42 pm
por class_OpenGL
|
|